Skip to content

Instantly share code, notes, and snippets.

View agoldis's full-sized avatar
🎯
Focused

Andrew Goldis agoldis

🎯
Focused
View GitHub Profile
@agoldis
agoldis / stateMappers.js
Created April 18, 2018 05:35
redux - map state to props example
// Users list component mapper
const mapStateToProps = ({ users, comments }) => ({
users: users.map(user => ({
...user,
booksCount: user.books.length,
commentsCount: comments.filter(c => c.user === user.id).length
}))
});
// Books list component mapper
@agoldis
agoldis / usersMapping.jsx
Created April 18, 2018 06:25
redux - map state to props example
/* initialState.js */
const books = [ /* ... */ ]
const users = [ /* ... */ ]
const comments = [ /* ... */ ];
const usersSummary = function() {
return this.users.map(user => ({
...user,
booksCount: user.books.length,
commentsCount: this.comments.filter(c => c.user === user.id).length
@agoldis
agoldis / hideGetter.js
Created April 18, 2018 06:32
redux - hide getter
/* initialState.js */
const books = [ /* ... */ ]
const users = [ /* ... */ ]
const comments = [ /* ... */ ];
const usersSummary = function() {
return this.users.map(user => ({
...user,
booksCount: user.books.length,
commentsCount: this.comments.filter(c => c.user === user.id).length
@agoldis
agoldis / spreadingHidden.jsx
Last active April 18, 2018 07:00
hidden property - spread example
const propsA = {};
Object.defineProperty(propsA, "someField", {
get: () => 42,
enumerable: false
});
const propsB = { someField: 42 };
console.log({ ...propsA }); // {}
console.log({ ...propsB }); // { someField: 42 }
console.log({ someField: propsA.someField }); // { someField: 42 }
@agoldis
agoldis / deriveState.js
Created April 27, 2018 05:29
Redux - deriveState store enhancer
const deriveState = state => {
state.foo = "bar";
return state;
}
const enhanceStore = createStore => (reducer, preloadedState, enhancer) => {
const store = createStore(reducer, preloadedState, enhancer);
const _originalGetState = store.getState;
store.getState = () => deriveState(_originalGetState());
return store;
@agoldis
agoldis / store.js
Last active April 27, 2018 05:56
redux - full example
import { createStore, applyMiddleware, compose } from "redux";
import { initialState } from "./initialState";
import { reducer } from "./reducer";
import { enhanceStore } from "./storeEnhancer";
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
export const store = createStore(
reducer,
initialState,
@agoldis
agoldis / deriveState.js
Created April 27, 2018 05:51
redux - actual derive state
import { compose } from "redux";
const usersSummary = function() {
return this.users.map(user => ({
...user,
booksCount: user.books.length,
commentsCount: this.comments.filter(c => c.user === user.id).length
}));
};
@agoldis
agoldis / storeEnhancer.js
Created April 27, 2018 05:58
redux - full example
import { deriveState } from "./deriveState";
export const enhanceStore = createStore => (
reducer,
preloadedState,
enhancer
) => {
const store = createStore(reducer, preloadedState, enhancer);
const _getState = store.getState;
store.getState = () => deriveState(_getState());
@agoldis
agoldis / deriveState.js
Created April 27, 2018 06:03
redux - full example
import { compose } from "redux";
const usersSummary = function() {
return this.users.map(user => ({
...user,
booksCount: user.books.length,
commentsCount: this.comments.filter(c => c.user === user.id).length
}));
};
@agoldis
agoldis / deriveState.js
Created April 28, 2018 05:46
redux - state structure change
/* other derived state methods */
const moveToApp = state =>
Object.defineProperties(state, {
users: {
get: function() {
return this.app.users;
},
enumerable: false,
configurable: true