ïŒ2858ããã³ãã以åã®ïŒ2295ã§ã®ã³ã¡ã³ãã«åºã¥ããšãReduxã³ã¢ã®äºåæ§ææžã¿ã¹ã¿ãŒã¿ãŒããã+ããã€ãã®äžè¬çãªããã«ãŠã§ã¢+ã¹ãã¢ãšã³ãã³ãµãŒ+ãã®ä»ã®ããŒã«ãã©ã€ãã©ãªã®äœ¿çšãéå§ããã®ã«åœ¹ç«ã€å¯èœæ§ããããŸãã
ç§ã¯ããã±ãŒãžåãäºçŽããããšããå§ããŸããïŒããããç§ã¯ããã«å®å šã«èšå®ãããŠããŸããïŒããããŠããã§ç©ºçœãåãå§ããããšãã§ããŸãã ãã®ããã±ãŒãžã®å 容ãããã§ç¶æãããã®ã§ãå¥ã®ãªããžããªãªã©ãèšå®ããå¿ èŠã¯ãããŸããã ã¢ãã¬ãã調ã¹ãããšæããããããŸããããä»ã®ãšããå·®ãè¿«ã£ãå¿ èŠã¯ãªããšæããŸãã
åæã«èª¿æ»ãããããšã1ã€ãããŸããããã¯ã combineReducers
ãç¬èªã®ããã±ãŒãžã«åå²ããããšã§ãã ããã¯ãåºèã®æ§é ãšéå¶æ¹æ³ã«ã€ããŠèŠç¯ãšãªã1ã€ã®ããšã§ãã ãããå¯äžã®æ¹æ³ã§ã¯ãªãããšã¯æããã§ãããå€ãã®äººããããéããŠèŠãªãã®ã§ã¯ãªãããšå¿é
ããŠããŸãã
ã¹ã¿ãŒã¿ãŒããã±ãŒãžã«å«ãŸãããã®ã«é¢ããŠã¯ãç§ã®é ã®äžã®çããªã¹ãã«ã¯ããã€ã©ãŒãã¬ãŒãåæžã©ã€ãã©ãªã®1ã€ïŒãŸãã¯ç§ãã¡ãæ§ç¯ãããã®ïŒããµã³ã¯ããµã¬ãªã©ã®äººæ°ã®ããããã«ãŠã§ã¢ãããã³åœ¹ç«ã€éçºããŒã«ãå«ãŸããŠããŸãã Reactåºæã®ãŠãŒã¶ãŒåãã®ãµãã»ããããã±ãŒãžãäœæã§ããŸãã å®éãç§ã¯ãããå¿ èŠãã©ããã調ã¹ãããã«
CLIããŒã«ãšãã®ãã¹ãŠã®ãžã£ãºã䜿çšããŠCreateReactAppã®ãããªãšã¯ã¹ããªãšã³ã¹ãæ§ç¯ããå¿ èŠã¯ãªããšæããŸãã ããããããè¯ããããã°ãšããå°ãªãã³ãŒãã§çŽ æŽãããéçºäœéšãæäŸãããç®±ããåºããŠããã«äœ¿ããäœãã
ã¯ãã¯ãã¯ãïŒ ç§ã¯ããã«ã€ããŠå€ãã®æèŠãšé¡ããæã£ãŠããŸãïŒ ããããç§ã¯èªåèªèº«ãæå¶ããè°è«ãæåã«å§ããããŸãã
createReduxStore()
é¢æ°ã«èªåçã«è¿œå ãããã¬ãã¥ãŒãµãŒçšã®çµã¿èŸŒã¿HMRããå®çŸå¯èœãã©ããããããªããŠã£ãã·ã¥ãªã¹ãé
ç®ã®1ã€ã§ãã æ®å¿µãªãããWebpackã«é¢ããç§ã®ç¥èãšããã€ãã®å®éšã§ã¯ãWebpack module.hot.accept()
ã³ãŒã«ããã¯ã«ã¬ãã¥ãŒãµãŒãã¡ã€ã«ãžã®ãã¹ãããŒãã³ãŒãããå¿
èŠããããããããã¯ããŸãå®çŸå¯èœã§ã¯ãªããšèšãããŠããŸãã ããŒã»ã«ãŸãã¯ä»ã®ãã³ãã©ãŒããããã©ã®ããã«åŠçãããããããªãã
ãããã£ãŠãå šå¡ããã®ãã£ãŒãããã¯ã®æåã®èŠæ±ïŒ
3ã€ã®éèŠãªãã€ã³ããæããŸããããå¯èœãªå Žåãããªã¢ã³ãã¯äºãã«_åé¢_ãããŸãã
æåã®ãã€ã³ãã ã¬ãã¥ãŒãµãŒãããŒãžã£ãŒ
1.0ããã©ïŒããã«åœãŠã¯ãŸããŸããïŒïŒ
1.1 Immer.js
1.2ã³ã¬ããã¯ã¹
1.3100500以äžã®ããã±ãŒãž
2ç¹ç®ã ããã«ãŠã§ã¢
2.0ããã©ïŒããã§ããïŒïŒ
2.1ãµã¬
2.2åäºè©©
2.3100500以äžã®ããã±ãŒãžã
3ç¹ç®ã Reactã®çµ±å
3.0ã ããã©ïŒããã«åœãŠã¯ãŸããŸããïŒïŒ
3.1ã éšå空é
3.2èšãæãã
3.3100500以äžã®ããã±ãŒãžã
4äœãããŒãã¹ããã€ã³ã
4.0_boilerplate_ã§ããããã¹ãŠã®ãã®ããã¹ãããŸãã
ãéžã°ãããã®ããéžã¶ããšã¯äžå¯èœã§ããããšãã°ãç§ã¯SagasãšEpicsã®äž¡æ¹ã倧奜ãã§äœ¿çšããŠããŸãããããã€ãã®ãæçã®é åæžããšçµã¿åããã®æšå¥šäºé ãæäŸããããšã¯ã§ããŸãã
ããšãã°ãã»ãšãã©ã®reduxãŠãŒã¶ãŒã¯ããã«ãŠã§ã¢ã«ã€ããŠ__only__ãç¥ã£ãŠããŸãã å°ããªéšåãã¬ãã¥ãŒãµãŒã§äœããããŠããŸãïŒimmutable.jsã«ã€ããŠã¯ããããèããŠããŸãïŒãã»ãã®æ°åãReactã®çµ±åã匷åããŸãã
ã¹ã¿ãŒã¿ãŒãããã¯ãæåããå®å šã§_ãªãããª_ã¢ãããŒããæ§ç¯ããã®ã«åœ¹ç«ã€å¯èœæ§ããããŸãã ãŸãã¯ãè€æ°ã®ã¹ã¿ãŒã¿ãŒããããå¿ èŠã§ãã
Twitterã§ã»ããã¢ãã/ãã€ã©ãŒãã¬ãŒãã®åé¡ç¹ã«é¢ãããã£ãŒãããã¯ãæ±ããããŸããïŒ https ïŒ
Twitterã§ç§ã®å¿çãã³ããŒããïŒ
IMOã¯ãä»ã®äººã«reduxãè¡ããããªãã®æ¹æ³ããå°å ¥ãããšãã«è€éããå¢ããããreduxãã€ã©ãŒãã¬ãŒããè¿œå ããããšã¯æ瀺çã«é¿ããŠããŸããã reduxããã移æ€æ§ã®é«ãã¹ãã«ã«ããããã«ãã³ãŒããä»ããŠé©çšãããããèŠç¯çãªèŠåã欲ããã§ãã
ãã®ããã«ã create-redux-app
ã¹ã¿ã€ã«ã®ãªããžããªïŒãã ãããã¬ãŒã ã¯ãŒã¯ãããã©ã€ãã©ãªãšããŠèšèšãããŠããïŒãç¹ã«Reduxã®ã¡ã³ããããã¹ããã©ã¯ãã£ã¹ãšæšå¥šãã©ã¯ãã£ã¹ãæ瀺çã«æ¿èªããŠããå Žåã¯ãæ確åãšæ確åã«å€§ãã«åœ¹ç«ã€ãšæããŸããé©åãªReduxã®äœ¿çšæ³ã«ã€ããŠã
ç§ãã¡ã¯Reactifluxã§ããã«ã€ããŠå°ã話ããŠããŸãããããã®ã¹ã¬ããã«å«ããããšãžã®æ¬²æ±ã®çµ±åãã³ããŒããããšæã£ãŠããŸãããããã®ããã€ãã¯ããã§ã«@timdorrã«ãªã¹ããããã€ã³ããšéè€ããŠããŸãïŒãããã£ãŠãç±ççãªç¢ºèªã§ãïŒã
Henrik Joretegã®redux-bundlerã®ããã«ããã§ã«ååšãããã®ãå ¬åŒã«æ¯æããŠã¿ãŸãããïŒ
https://github.com/HenrikJoreteg/redux-bundler
ããã¯ç°¡æœã§ãïŒè¯ãæå³ã§ïŒæèŠããããã¢ããªã±ãŒã·ã§ã³éã§reduxé¢é£ã®æ©èœãåå©çšã§ããããã§ãéåæåŠçã®ããã®åªãããœãªã¥ãŒã·ã§ã³ãæäŸããŸãã
ããã¯é åçãªãããžã§ã¯ãã§ãããç§ãæ¬åœã«ããã«èª¿æ»ããããããžã§ã¯ãã§ããããã®ã¿ã¹ã¯ã§ããããããšã®ç¯å²å€ã§ããããŸãã
ããã§æ¬åœã«éæãããã®ã¯æ¬¡ã®ãšããã§ãã
ç§ã¯ãã®åªåãããªãå³å¯ã«ç¯å²ãå®ãããŸãŸã«ããŠãããããšæããŸãã ç§ã¯ããæ°æéã Reactifluxã§@hswolffãš@nickmccurdyãšãã£ããããŠããŸãããè°è«ã¯çŽ æŽããããã®ã§ããããç§ãã¡ã¯ãã§ã«ãç©äºãéåžžã«è€éã«ããå¯èœæ§ã®ãã12ã®éè€ãããŠãŒã¹ã±ãŒã¹ãšã¢ã€ãã¢ãçµéšããŸããã
ç§ã¯ãããŸããã€ã¯ã·ã§ãããããã«ãæçšã§äŸ¡å€ããããå®è¡å¯èœãªãã®ããŸãšããŠãä»ã®è°è«ãèã«çœ®ããããšæã£ãŠããŸãïŒReduxã®ããã³ãã«ãããã¢ãžã¥ãŒã«ããäœæããããã®APIãªã©ïŒã
APIã®æåã®ãã€ã©ãŒãã¬ãŒãã£ã³ã°ãéå§ããããã«ãäžèšã§æçš¿ãããªã¹ãã®1ã3ã®åºæ¬çãªã¢ã€ãã¢ã次ã«ç€ºããŸãã
// #1
export function createStore({
// If an object is given it's passed to combineReducers
// otherwise it's just used directly.
reducer: Object<String, Function> | Function,
// Middleware is built-in and accepts an array of middleware functions.
middleware: Array<MiddlewareFunction>,
// Built-in support for devtools.
// Defaults to NODE_ENV !== production
devTools: boolean,
// Same as current createStore.
preloadedState,
// Same as current createStore.
enhancer,
}) {};
// Re-exported for easy usage.
export function combineReducers() {}
// #2
// Re-export immer as the built-in immutability helper.
import immer from 'immer';
export const createNextState = immer;
// #3
// Export an already written version of createReducer .
// Same thing as https://redux.js.org/recipes/structuring-reducers/refactoring-reducers-example#reducing-boilerplate
export function createReducer() {}
ãããç§ã¯ãããæããŸãã ãã®å Žåãããã«ãŠã§ã¢ãªã¹ãã®å
é ã«åžžã«thunk()
ãè¿œå ãããããããã«ãŠã§ã¢ãèªåã§æäŸããªãã£ãå Žåã«ã®ã¿è¿œå ããããšæããŸãã ããã§ãŠãŒã¶ãŒããšã³ãã³ãµãŒãæå®ã§ããããã«ããããªãå ŽåããããŸãã ç§ãã¡ã¯ãè¿œå ãããapplyMiddleware()
ä»»æã®ããã«ãŠã§ã¢ãããå Žåãèªåçã«ããã€äœ¿çšcomposeWithDevtools
ããæ©èœãredux-devtools-extension
å ŽådevTools : true
ã ãã®ãç°¡åãªã»ããã¢ãããã®ç®çã®ããã«ããŠãŒã¶ãŒãæ§æã§ãããã®ããããšã³ãã³ãµãŒããæé€ããããšæããããããŸããã
ãšã³ãã³ãµãŒãæé€ãããš+1ã
ãµã³ã¯ãèªåçã«è¿œå ããããšããç¹ã§ãããã©ã«ãã®ããã«ãŠã§ã¢ãè¿œå ããããã«äœ¿çšããé¢æ°ããšã¯ã¹ããŒãããããšã§ãã±ãŒããæã«å ¥ããŠé£ã¹ãããšãã§ããã¯ãã§ãã
export function createDefaultMiddleware(...additional) {
return [thunk(), ...additional],
}
// Within a user's application
createStore({
// By default it's just createDefaultMiddleware()
// However if you want to add any other middleware you can.
middleware: createDefaultMiddleware(any, other, middleware)
})
ãããããã¯å€§ãŸãã«ç§ãèããŠãããã®ã§ãã ç§ã®äž»ãªé¢å¿äºã¯ããŠãŒã¶ãŒã誀ã£ãŠthunk
ç¬èªã®ã€ã³ã¹ã¿ã³ã¹ãæäŸããããšãããã©ãããææ¡ããããšã§ãã
ç§ã¯ä»æ©å°ãç©äºããããããšã«æ±ºããŸããã ãããæåã®ã«ããã§ãã èãïŒ
// configureStore.js
import {createStore, compose, applyMiddleware, combineReducers} from "redux";
import { composeWithDevTools } from 'redux-devtools-extension';
import createNextState from "immer";
import isPlainObject from "./isPlainObject";
import thunk from "redux-thunk";
const IS_DEVELOPMENT = process.env.NODE_ENV !== "production";
export function createDefaultMiddleware(...additional) {
return [thunk, ...additional];
}
export function configureStore(options = {}) {
const {
reducer,
middleware = createDefaultMiddleware(),
devTools = IS_DEVELOPMENT,
preloadedState,
} = options;
let rootReducer;
if(typeof reducer === "function") {
rootReducer = reducer;
}
else if(isPlainObject(reducer)) {
rootReducer = combineReducers(reducer);
}
else {
throw new Error("Reducer argument must be a function or an object of functions that can be passed to combineReducers");
}
const middlewareEnhancer = applyMiddleware(...middleware);
const storeEnhancers = [middlewareEnhancer];
let finalCompose = devTools ? composeWithDevTools : compose;
const composedEnhancer = finalCompose(...storeEnhancers);
const store = createStore(
rootReducer,
preloadedState,
composedEnhancer
);
return store;
}
export function createReducer(initialState, actionsMap) {
return function(state = initialState, action) {
const {type, payload} = action;
return createNextState(state, draft => {
const caseReducer = actionsMap[type];
if(caseReducer) {
return caseReducer(draft, payload);
}
return draft;
});
}
}
export {createNextState, combineReducers};
ãããŠãå¿ é ã®ãµã³ãã«todoã¢ããªïŒ
import {configureStore, createReducer} from "./configureStore";
const ADD_TODO = "ADD_TODO";
const TOGGLE_TODO = "TOGGLE_TODO";
const SET_VISIBILITY_FILTER = "SET_VISIBILITY_FILTER";
function setVisibility(state, newFilterType) {
return newFilterType;
}
const visibilityReducer = createReducer("SHOW_ALL", {
[SET_VISIBILITY_FILTER] : setVisibility
});
function addTodo(state, newTodo) {
state.push({...newTodo, completed : false});
}
function toggleTodo(state, payload) {
const {index} = payload;
const todo = state[index];
todo.completed = !todo.completed;
}
const todosReducer = createReducer([], {
[ADD_TODO] : addTodo,
[TOGGLE_TODO] : toggleTodo
});
const preloadedState = {
todos: [{
text: 'Eat food',
completed: true
}, {
text: 'Exercise',
completed: false
}],
visibilityFilter : 'SHOW_COMPLETED'
};
const store = configureStore({
reducer : {
todos : todosReducer,
visibilityFilter : visibilityReducer,
},
preloadedState,
});
const exercise1 = store.getState().todos[1];
store.dispatch({type : "TOGGLE_TODO", payload : {index : 1}});
const exercise2 = store.getState().todos[1];
console.log("Same object: ", exercise1 === exercise2);
store.dispatch({type : "SET_VISIBILITY_FILTER", payload : "SHOW_COMPLETED"});
console.log(store.getState());
ããã¯å å®ãªã¹ã¿ãŒãã§ããããã®ã¹ã¬ããã§è°è«ãããŠããlibã®çŽ æŽãããå§ãŸãã ãšæããŸãã äžèšã®å¿ èŠãªæ©èœã®ãªã¹ãããããã€ã³ãããŠããŸãã
ãã®äžã§ç¹°ãè¿ãã®ã¯çŽ æŽãããããšã§ãããããã¯åŒ·åºãªåºç€ã§ãã
å®è£ ã«éäžããã®ã§ã¯ãªããDXã«éäžããŠã»ããã ãšã¯ã¹ããŒã/ APIãšã¯äœã§ããïŒãããã¯ã©ã®ããã«äœ¿çšãããŸããïŒ æ§æã ããä¹ãè¶ããŠã人ã ãã©ã®ããã«ã¹ãã¢ã䜿çšããŠããããèŠã絶奜ã®ãã£ã³ã¹ã ãšæããŸãã ããã€ãã®ã©ã³ãã ãªã¢ã€ãã¢ïŒ
ã¬ãã¥ãŒãµãŒãšã¢ã¯ã·ã§ã³ãç¶æ åºåãšçµã¿åãããã®ãéåžžã«ç°¡åã«ãªããŸãã ããã¯å€§ãŸããªããšã§ãããåºæ¬çãªèãæ¹ã¯æ¬¡ã®ãšããã§ãã
import { createStore, createActionPack, combineActionPacks } from 'redux/starter'
const counter = createActionPack({
increment: counter => counter + 1,
decrement: counter => counter - 1,
set: (_, value) => value
}, 0)
const posts = createActionPack({
load: async () => await fetch('/posts'),
create: async (state, text) => state.push(await fetch('/posts/new', { body: { text } }))
}, [])
const store = createStore(
combineActionPacks(
counter,
posts
)
)
store.dispatch(counter.increment())
store.dispatch(counter.set(42))
await store.dispatch(posts.load())
await store.dispatch(posts.create('First!'))
ããã¯æ±ºããŠå£²ãããŠããŸããããReactRouterã§ã·ã³ã°ã«ãã³ã®æŽå²ããã£ãæ代ãæãåºããŸããã å®ç§ã§ã¯ãããŸããã§ããããããçšåºŠã®äŸ¡å€ããããŸããã
import { store, configureStore } from 'redux/starter'
configureStore(reducer, middleware, initialState)
store.dispatch(someAction())
store.getState()
import
æ§æå¯èœæ§ç§ã¯æåŸã«ç§ã®æãå¥æãªãã®ãä¿åããŸãã ãããããã¡ã€ã«ãã€ã³ããŒãããŠæ§æãèš±å¯ããå Žåã¯ã©ããªãã§ããããã ã°ããŒãã«ãã¹ã®èå°è£ãå¿ èŠã«ãªããããé¢åã§é¢åã«ãªããŸãã ããããç¹°ãè¿ãã«ãªããŸãããçŠç¹ã¯ç§ãã¡ã®åŽã§ã¯ãªãããŠãŒã¶ãŒã«ãããŸãã
import { createStore } from 'redux/starter'
import 'redux/starter/devtools'
import 'redux/starter/logger'
import 'redux/starter/immutable'
// OR!
import { createStore } from 'redux/starter/developer'
import { createStore } from 'redux/starter/production'
ãã®2çªç®ã®äŸã§ã¯ããŠãŒã¶ãŒããã«ãããŒã«ã§ãã®ããã±ãŒãžã«ãšã€ãªã¢ã·ã³ã°ããããReactã®ãããªããšãããŠããã®ãèŠãããšãã§ããŸãã
OKãä»ã®ãšããç§ããã¯ä»¥äžã§ãã ç¹°ãè¿ãã«ãªããŸãããç§ã¯ãŠãŒã¶ãŒãã¡ãŒã¹ãã§èããããšæããŸãã ãããå®è£ ããããã«ç§ãã¡ãããªããã°ãªããªãæ±ããéãããã¯ãäœã§ãããé¢ä¿ãããŸããã éèŠãªã®ã¯ãèšè¿°ãããã³ãŒããå°ãªããå¿ èŠãªæ§æãå°ãªãåªããDXã§ãã
ãããŸã§ã®ãšããããããã®ã¢ã€ãã¢ã倧奜ãã§ãã ãããå€æããå Žåã®ç§ã®å¯äžã®é¡ãã¯ãäžäœã¬ãã«ã®æšæºReduxAPIãžã®åªé ãªã¢ã¯ã»ã¹ã§ãã 人ã ãã«ã¹ã¿ãã€ãºããããæåºãããããããã®èªç¶ãªéãå¿ èŠã§ãã ãããæ°æ¥ã§ããããšã1幎ã2幎ã§ããããšãããã¯åçŽãªã¯ãã§ãã ããã¯ã€ã³ã¯ç§ãç®ã«ããåé¡ã®1ã€ã§ãïŒJumpstateã䜿çšããç§èªèº«ã®è©Šã¿ãããã³Rematchãªã©ã®æè¿ã®ã©ã€ãã©ãªããïŒã ç§ãã¡ããããé¿ããããšãã§ããã°ããã»ã©ã人ã ã¯å£ã®äžã§ããè¯ãå³ãæããã§ããã:)
ãããç§ã¯ãã®ãã¢ã¯ã·ã§ã³ããã¯ãã®ãããªããšãããããªãã®æ°ã®util libsãèŠãŠããŸããïŒå°ãªããšããããã€ãã®ã¬ãã¥ãŒãµãŒãæžããŠãããŒãã¢ã¯ã·ã§ã³ã¿ã€ããšã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã«å€ãããåŽé¢ãŸã§ïŒããããŠç§ã¯æããããšãèããŠããŸããããã¯è¿œå ã®ã¢ã€ãã ãšããŠ-ãŸã ããã«å°éããŠããŸããã§ããã ãcombineActionPackãã®åŽé¢ã«ã€ããŠã¯ããããããŸããã
æšå€ã @ hswolffãšè¿œå ã®è©±ãåããããã»ã¬ã¯ã¿ãŒã©ã€ãã©ãªãè¿œå /åãšã¯ã¹ããŒãããããšãæ€èšããããšæããŸããããã¯ãReselect APIã®ã¹ãŒããŒã»ããã§ãããããã€ãã®è¿œå ã®äŸ¿å©ãªå©ç¹ãããããã§ãã
import createSelector from 'selectorator';
// selector created with single method call
const getBarBaz = createSelector(['foo.bar', 'baz'], (bar, baz) => {
return `${bar} ${baz}`;
});
ããã¯ã const selectTodos = state => state.todos
ãããªææžãã®ãåçŽãªå
¥åãã»ã¬ã¯ã¿ãŒã®å€ããåæžããã®ã«åœ¹ç«ã¡ãŸãã
ã»ã¬ã¯ã¿ãŒã©ã€ãã©ãªãè¿œå ããã¡ãªãããããããã©ããã¯ããããŸããã ããã«ãã£ãŠå¯èœã«ãªãç¶æ ã®åœ¢ã«ã€ããŠãæèŠãè¿°ã¹ãå¿ èŠããããŸãã
ããã¯å°ãªããšãéšåçã«ã¯ããŠãŒã¶ãŒãpackage.json
ã«ã€ã³ã¹ããŒã«ããå¿
èŠã®ããã¢ã€ãã ã1ã€å°ãªããªãããã§ãã
ã»ã¬ã¯ã¿ãŒã©ã€ãã©ãªã¯çŽ æŽããããšæããŸãã
é¢é£æ§ããããŸãïŒ apollo-boost
ã¹ã¿ãŒã¿ãŒãããã«é¢ããæè¿ã®èšäº
mapStateToProps
ãArray
å Žåã«ã react-redux
ã®connect
ã®APIãæ¡åŒµããŠãåéžæïŒãŸãã¯åæ§ã®ã»ã¬ã¯ã¿ãŒã©ã€ãã©ãªïŒã䜿çšã§ããå Žåã¯ãã»ã¬ã¯ã¿ãŒã®äœ¿çšã奚å±ããäºææ§ãæãªãããšãªãéåžžã«äŸ¿å©ã«ããŸãã ãã®ã©ã€ãã©ãªãReactãŸãã¯react-redux
å¿
ãããçµã¿åãããå¿
èŠã¯ãªããšæããŸããã react-redux
ãªãã·ã§ã³ã䜿çšããŠãã®æ¡åŒµæ§ãåŠçããããã¹ã¿ãŒã¿ãŒããããreact-redux
ã§ã©ããããå¥ã®ããã±ãŒãžãæäŸããããšãã§ããŸãã
ãããç§ã¯ãã®æåã®MVPã®ããã«React-Reduxã§äœãããã€ããã¯ãããŸããã
ãã®å ŽåãReduxã¬ãã«ã§ã»ã¬ã¯ã¿ãŒã®æœè±¡åãè¿œå ããè¯ãæ¹æ³ããããŸããããããšãããã¯react-reduxã®äžã§ã®ã¿å¹æçã«è¡ãããšãã§ãããã®ã§ããïŒ åé¡ã¯ããããreact-reduxãšäºææ§ããªãããšãæãŸãªãããšã§ãããããã£ãŠããããäžå¯èœãªå Žåã¯ãä»ã®ãšããã»ã¬ã¯ã¿ãŒãæšãŠãã¹ãã ãšæããŸãã
ã¹ãã¢APIãå®è£ ããŠããéããreact-reduxãšäºææ§ããããŸãã ãã®APIãå£ãã€ããã¯ãªããDXãæ¹åããã ãã§ãã
ããã¯çã«ããªã£ãŠããã ç§ã¯react-redux以å€ã§ã»ã¬ã¯ã¿ãŒã䜿çšããããšããªãã®ã§ãããã§Reduxèªäœãæ§æããã®ã«ããããé©çšã§ãããã©ããçåã«æããŸããã
@timdorr +1ã¯ãããç°¡åãªã¬ãã¥ãŒãµãŒ/ã¢ã¯ã·ã§ã³ã®ãã¢ã§è¡šçŸããã欲æ±ã«åºã¥ããŠããŸãã ãŸããreducerãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãã»ã¬ã¯ã¿ãŒã®äœæãã¯ããã«å¿«é©ã§äœ¿ããããããã«ãreduxã¢ãžã¥ãŒã«ïŒå¥åã¢ãã«ãã¿ãŒã³ïŒãç°¡åã«äœæã§ããæ¹æ³ã玹ä»ããããšæããŸãã
倧å€æ°ã®äººã幞ãã«ãããã®åé¡ã®è§£æ±ºçãèŠã€ããã«ã¯ãããå°ãèªè»¢è»ãèœãšãå¿ èŠããããšæããŸãããããæåã®ãããã¯ããããã¯ããªãããã«ããã©ããŒã¢ããããŒãžã§ã³ã«è¿œå ã§ãããã®ãã©ããçåã«æããŸãããªãªãŒã¹ã
@markeriksonã圌ã®ã³ã¡ã³ãã§äœæãããã®ã¯ããã§ã«ããªãã®å®åæãæžãããŠãããçŽ æŽãããåæãã¬ãªãªãŒã¹
ãã®åŸãé¢åãªReduxã®ä»ã®åŽé¢ïŒredux /ã¢ã¯ã·ã§ã³/ã»ã¬ã¯ã¿ãŒã®äœæïŒã«åãçµãããšãã§ããŸãã
ãã¹ãŠã®åé¡ãåãã£ãŠè§£æ±ºããããšãããšãäœããã®åœ¢ã§å ·äœçãªé²æ©ãéãã劚ãã«ãªããšæããŸãã
ååãªæºåãã§ããŠãããšæãããå Žåã¯ããªããžããªãéå§ããŠããµã³ãã«ã³ãŒããšããã°ããŒãã䜿çšããŠãã®ã»ããã¢ããããã¹ãã§ããããã«ããããšããå§ãããŸãïŒãŸãã¯ãmonorepoã®æ©èœãã©ã³ãã®ããã±ãŒãžã§ããå¯èœæ§ããããŸãã PRãéããŠååããïŒã
ãã¡ããã ä»æ¥ã¯å°ãåŸã§äœããã»ããã¢ããã§ãããã©ããã確èªããŸãã
å¥ã®ãªããžããªã¯å¿ èŠãããŸããã ããã¯çŸåšã®ãã®ã®äžã«ååšããŸãã ãŸãã¯äœã§ãPRããŠãã ããã
ãããåå¥ã®ã€ã³ããŒããšããŠã¡ã€ã³ã®redux
ããã±ãŒãžã®äžéšã«ããå¿
èŠããããŸããïŒãããã£ãŠãããã¯å®å
šã«äžäœäºææ§ããããŸãïŒãè€æ°ã®ããã±ãŒãžãå«ãã¢ããªããžããªã䜿çšããŸããïŒ åè
ã§ååã ãšæããŸãã倧ãããªããããå Žåã¯ãæ°ããããã±ãŒãžãäœæããã«ããã€ã§ãå¥ã®ãã¡ã€ã«ãšã¯ã¹ããŒãã䜿çšã§ããŸãã
ããããããããå¥ã®ã¬ã/ããã±ãŒãžãšããŠè©ŠããŠã¿ãããšæããŸãã
å°æ¥çã«ããŒãžãããšãšã©ãŒãçºçãããããªãå¯èœæ§ãããããããã®ãªããžããªã§æ¢åã®ããŒã«èšå®ã䜿çšããæ¹ãç°¡åãªå ŽåããããŸãã ãŸãããã®Reactãç¹å®ããŠããªããããå¥ã®æ§æãµããŒãã¯ããããå¿ èŠãããŸããã
äºåã«æ§æãããåäžã®ãã¡ã€ã«ã«ãªãå Žåã¯ãããã«ä¿æããã®ãæãç°¡åã§ãã äŸåé¢ä¿ããããããå¥ã®ããã±ãŒãžã«ããå¿ èŠããããŸãã æ¢åã®ã¢ããªããããã§ãµãã«ããããããŸããã
ç¹°ãè¿ãã«ãªããŸãããmonorepoã«ç§»è¡ããå¿
èŠã¯ãªããšæããŸãããè€æ°ã®ãã«ããéå§ããå Žåã¯ãç¹å®ã®ããã±ãŒãžãã«ãçšã®ãã©ã«ããŒãäœæã§ããŸãã ä»ã®ãšãããç¬èªã®package.jsonãåããstarter
ãã©ã«ããŒã ãã§ããŸãããã¯ãã§ãã
ããèªäœãreduxããããã«ããŒã«ã«ã®ã³ãŒãã®ã¿ã䜿çšããŠããå Žåããããã¡ã€ã³ã®reduxããã±ãŒãžã«å¯ŸããŠããŒã«ã«ã«ä¿ã€ãšããã¢ã€ãã¢ã奜ãã§ãã ããã§è¡šçŸãããã¢ã€ãã¢ããµããŒãããããã«å€éšã®äŸåé¢ä¿ãåãå ¥ãå§ãããšãç§ã¯ãã£ãšèºèºããŸãã
immerãthunk / promise / sagaãreselectãªã©ã®å€éšäŸåé¢ä¿ã¯ãããã§ã®ç®æšã«ãšã£ãŠéåžžã«è²Žéã§ãããã¹ã¿ãŒã¿ãŒã®è¿œå ã®äŸåé¢ä¿ã«å€ãããšæããŸãããã¡ã€ã³ã®redux
ããã±ãŒãžèªäœãžã®äŸåé¢ä¿ã¯å¿
èŠãªãå ŽåããããŸãã ã
ã ããããããš...ç§ã¯è¡ã£ãŠäœããããŸããïŒ
åã®ã¹ãããããšã¯ç°ãªãç¹ïŒ
enhancers
èšå®ãªãã·ã§ã³ãæå
¥ããŸãããselectorator
äŸåæ§ãããšã¯ã¹ããŒãcreateSelector
èãïŒ
éå»æ°é±éã§èªåèªèº«ã«ReduxïŒããã³ReactïŒãæããã°ããã®äººãšããŠãç§ã¯æçµè£œåãèŠãã®ãåŸ ã¡ãããŸããã ã³ãŒãã§ã¯ãªãŒã³ã¢ãããããã®ããããããããšç¢ºä¿¡ããŠããŸãã
ðð
ãããã£ãŠãé·ãã¢ã€ãã¢ã¯reduxã®äœ¿çšãåçŽåããããšã§ããããã2ã€ã®ç¬éãææ¡ã§ããŸãã
æåéãexpect(mapStateToProps(state)).toEqual(mapStateToProps(state))
ã«çµã¿èŸŒã¿é¢æ°ãè¿œå ããŸãã ããè¯ãã³ãŒããäœæããããã«äººã
ãä¿ãããã ãã«ã ç§ã¯ãã®ãããªãã¹ããèŠãããšããããŸãããã_not-very-pure_mapStateToPropsã¯reduxã®åé¡ã®1ã€ã§ãã
memoize-stateã®ãããªæ¡çšãæ€èšããŠãã ããã ã»ã¬ã¯ã¿ãŒçšã®Immer.jsã®ãããªãã®ã§ãã éèŠãªãã€ã³ã-顧客ã¯ãmapStateToPropsãŸãã¯ã»ã¬ã¯ã¿ãŒã奜ã¿ã®åœ¢åŒã§èšè¿°ããŠãã¡ã¢åããããšãã§ããŸãã ã€ã³ã¹ã¿ã³ã¹éã®ãå ±éã®ãã¡ã¢åã倱ãããšãªãããè€æ°ã®ã³ã³ããŒãã³ãã€ã³ã¹ã¿ã³ã¹éã§å°éå ·ã䜿çšããŠã»ã¬ã¯ã¿ãŒãå ±æãããã§ãã®åéžæã®åé¡ã解決ããããšãã§ããŸãã ãã®ãäºéã«ã¡ã¢ããã ãã§ã
ããã§ããäžã§èª¬æããããã«ãããã¯ãReactã«ãšããããªãã¹ã¿ãŒã¿ãŒããã±ãŒãžã«å«ãŸãããã®ãšããããããreact-reduxã®ããšã§ãã
ããã¯æ¬åœã«ã¯ãŒã«ã§ãïŒ
ãã ãã1ã€ã®ãªã¯ãšã¹ã/å°ãã®ãã£ãŒãããã¯ããããŸãã Immerãæé»çã«äœ¿çšãããŠããªãæ¹ãããã§ãã
ã€ããŒã¯çŽ æŽãããã§ãã ããã¯ç§ã®ãæ°ã«å
¥ãã®ãŠãŒãã£ãªãã£ã®1ã€ã«ãªããŸããã ãããããããæ瀺çã«äœ¿çšããå Žåã§ãïŒ produce(baseState, draftState => ...
ïŒããããããç¥ããªãä»ã®äººãç§ã®ã³ãŒããèŠããšãã¯å¿é
ã§ãImmerã®è¶
èœåã®ããã«ãã®å€ç°çãªãã®ããã§ããªãããšã«æ°ã¥ããŠããŸããã
APIã®çŸåšã®å€èŠ³ã§ã¯ãreduxç¶æ ãäžå€ã§ããã¹ãã ãšæ°ä»ããŠããªãæ°èŠåå ¥è ãæ³åããããšãã§ããŸãã ãã®ã¹ã¿ãŒã¿ãŒããããªãã§Reduxã䜿ãããšãããšã誀解ãæ¿ããåã¿ä»ããšæããŸãã
createNextState
ã¯ãã§ã«ãšã¯ã¹ããŒããããŠããã®ã§ããŠãŒã¶ãŒã«æ瀺çã«äœ¿çšããããã«å§ããŠã¯ã©ãã§ããããã
import {createReducer, createNextState} from "@acemarke/redux-starter-kit";
function addTodo(state, newTodo) {
return createNextState(state, draftState => {
draftState.push({...newTodo, completed : false});
});
}
ïŒ createNextState
ãã©ã®ããã«äœ¿çšãããã®ãã誀解ããå Žåã¯ããè©«ã³ããŸãïŒãŸã£ããæãäžããŠããŸããïŒ
https://github.com/markerikson/redux-starter-kit/issues/5ãåç §ããŠ
APIã®çŸåšã®å€èŠ³ã§ã¯ãreduxç¶æ ãäžå€ã§ããã¹ãã ãšæ°ä»ããŠããªãæ°èŠåå ¥è ãæ³åããããšãã§ããŸãã ãã®ã¹ã¿ãŒã¿ãŒããããªãã§Reduxã䜿ãããšãããšã誀解ãæ¿ããåã¿ä»ããšæããŸãã
ç§ã®æèŠã§ã¯ã httpsïŒ//github.com/reactjs/redux/issues/2858ãããããããã®ããã±ãŒãžãå®æããããReduxãçŽæ¥äœ¿çšããªãããšããå§ãã
createNextStateã¯ãã§ã«ãšã¯ã¹ããŒããããŠããã®ã§ããŠãŒã¶ãŒã«æ瀺çã«äœ¿çšããããã«å§ããŠã¯ã©ãã§ããããã
æªãèãã§ã¯ãããŸããããç¹ã«ãœãŒã¹ã³ãŒããçæããŠããããimmerã®è¿œå ã«äžäœäºææ§ããããããããã§æé»çã«äœ¿çšããæ¹ãæå©ã ãšæããŸãã
ç§ã¯å€ãã®äººã䜿çšããããšãæšå¥šåç
§libs
ã®ããã«immer.js
ç§ã®æèŠããç¥ããç¥ããã®ãã¡ã«åŠã³ãå°éã®ã¢ãããŒã·ã§ã³éžè±ããããšãããªãã store
èŠä»¶ãã
ã¹ãã¢ãå€æŽã§ããªãããšã¯èª°ããç¥ã£ãŠããã®ã§ã newState
ã€ã³ã¹ã¿ã³ã¹ãïŒ ===
ïŒã«å¯ŸããŠpreviousState
ã«å¯ŸããŠãã§ãã¯ããæ€èšŒã¡ã«ããºã ãå¿
èŠã§ããåãã€ã³ã¹ã¿ã³ã¹ã®å Žåã¯ãšã©ãŒãã¹ããŒããŸãã
ãã®ããã«ããŠã誰ããstore
ã®ã«ãŒã«ãšèŠä»¶ãåŠã¶ããã«åŒ·å¶ãããŸãã
PSïŒç§ã¯immer
ã®å©ç¹ãæ¬åœã«ç解ããŠãããããã«å察ããããšã¯ãŸã£ãããããŸãããã人ã
ãæçµçã«æŠå¿µãç解ããããã«ãªããããã¯å€§ããªæ··ä¹±ã®åå ãšãªããæè¡çã«ã¯æ¬¡ã®ããã«è¿°ã¹ãŠããŸãããã³ãããŒã¯ãè¡ããšãã©ã€ãã©ãªãç·©ããããã ãã«è€éãã®å±€ãè¿œå ããã ãã§ãã
å人çãªææ¡ïŒ
logger
ã devTools
ã Thunk
ã¯ã Starter
ããã©ã«ããšããŠè¿œå ããå¿
èŠããããŸãããæ®ãã¯å人çãªéžæã ãšæããŸãã
ã¹ãã¢ãå€æŽã§ããªãããšã¯èª°ããç¥ã£ãŠããã®ã§ãnewStateã€ã³ã¹ã¿ã³ã¹ãpreviousStateïŒ===ïŒãšç §åããåãã€ã³ã¹ã¿ã³ã¹ã®å Žåã¯ãšã©ãŒãã¹ããŒããæ€èšŒã¡ã«ããºã ãå¿ èŠã§ãã
ã¢ã¯ã·ã§ã³ã«ãã£ãŠã¯ãç¶æ ãå€æŽããããªãå Žåããããããåãã¹ãã¢ã€ã³ã¹ã¿ã³ã¹ãè¿ããŠã¡ã¢ãªãç¯çŽãã誀æ€ç¥ã®å·®åãé²ããŸãã ãã®åé¡ãåé¿ãããšããŠããReduxã¯ã³ã¢ã«ããªããŒã¿ãŒãå¿ èŠãšããªãããã§ãããImmerã¯å人çã«ã¯ããã«å¯Ÿãã倧äžå€«ãªä¿è·æ段ã ãšæããŸãã ReduxãåŠã¶ãšããç®çãããçšåºŠæãªãããšã«ã¯åæããŸãããçŽç²ãªFPãåŠã³ãããªãããŸãã¯æ°ã¥ããŠããªãå€ãã®éçºè ãReduxãåŠãã§ããã®ãç®ã«ããŸãã
ãã³ãããŒã¯ãè¡ããšãã©ã€ãã©ãªãç·©ããããã ãã«è€éãã®å±€ãè¿œå ããã ãã§ãã
ç§ã®ç¥ãéããImmerã®å®è£ æ¹æ³ã§ã¯ããããã·ãå®éã«å€æŽãããŠããå Žåã«ã®ã¿ããã©ãŒãã³ã¹ãªãŒããŒããããçºçãããããéåžžã®äžå€ã®æŽæ°ãªãã¥ãŒãµãŒã«ããã©ãŒãã³ã¹ãªãŒããŒããããçºçããããšã¯ãããŸããã ããã¯å€§äžå€«ã ãšæããŸãã
ã¹ã¿ãŒã¿ãŒã®ããã©ã«ããšããŠãã¬ãŒãdevToolsãThunkãè¿œå ããå¿ èŠããããŸãããæ®ãã¯å人çãªéžæã ãšæããŸãã
åé€ããããšãæ€èšãããããšãä»ã«ãããã€ããããŸãïŒå人çã«ã¯ãããã©ãŒãã³ã¹ã®ãªãŒããŒããããè£ãéçºè ããŒã«ããããã¬ãŒã«å€§ããªå©ç¹ã¯ãããŸãããïŒã httpsïŒ//github.com/markerikson/ãåç §ããŠ
ã¢ã¯ã·ã§ã³ã«ãã£ãŠã¯ãç¶æ ãå€æŽããããªãå Žåããããããåãã¹ãã¢ã€ã³ã¹ã¿ã³ã¹ãè¿ããŠã¡ã¢ãªãç¯çŽãã誀æ€ç¥ã®å·®åãé²ããŸãã ãã®åé¡ãåé¿ãããšããŠããReduxã¯ã³ã¢ã«ããªããŒã¿ãŒãå¿ èŠãšããªãããã§ãããImmerã¯å人çã«ã¯ããã«å¯Ÿãã倧äžå€«ãªä¿è·æ段ã ãšæããŸãã ReduxãåŠã¶ãšããç®çãããçšåºŠæãªãããšã«ã¯åæããŸãããçŽç²ãªFPãåŠã³ãããªãããŸãã¯æ°ã¥ããŠããªãå€ãã®éçºè ãReduxãåŠãã§ããã®ãç®ã«ããŸãã
@nickmccurdyç§ã¯ããªãã®èŠè§£ãå®å šã«ç解ããŠããŸãããããŠç§ã¯FPãçªç¶å€ç°ãªã©ã®ããã€ãã®æŠå¿µã®ããã«åŠç¿ã®é害ããã£ãŠã¯ãªããªãããšã«åæããŸã...ãããæè²è ãšããŠç§ã¯èŠç¿ããç ç³ã§ã³ãŒãã£ã³ã°ããªãããšã匷ãä¿¡ããŠããŸããããããè€éããé ããŸãã ãšã«ãããããã¯å¥œã¿ã®åé¡ã§ããç§ã¯ããã®åŠç¿ãšååãã§ããããã®ææ¡ãèŠããšãç§ã®æ¬èœã¯ãç§ãã¡ãåãå ¥ããŠåé²ããããæšæºã§åŸéããã ãããšã©ããããããç§ã«æããŠãããŸãã 念ã®ããã«èšã£ãŠãããŸãããçŸåšRedux StandardsãæããŠãããŠã§ãäžã®ãã¹ãŠã®ã³ã³ãã³ããšããããæçµçã«ã©ã®ããã«æ¡çšãããŠããããèããŠã¿ãŠãã ããã
ç§ã®ç¥ãéããImmerã®å®è£ æ¹æ³ã§ã¯ããããã·ãå®éã«å€æŽãããŠããå Žåã«ã®ã¿ããã©ãŒãã³ã¹ãªãŒããŒããããçºçãããããéåžžã®äžå€ã®æŽæ°ãªãã¥ãŒãµãŒã«ããã©ãŒãã³ã¹ãªãŒããŒããããçºçããããšã¯ãããŸããã ããã¯å€§äžå€«ã ãšæããŸãã
è€éãã®å±€ãè¿œå ãããšããããšã¯ã Immer
ãäžåºŠãååšããããšããªããããããååšããå¯èœæ§ãããããšãæå³ããŸããã©ã€ãã©ãªã§ãµããŒããããã¹ãããããã©ãŒãã³ã¹ã®åé¡ãè©äŸ¡ããæåŸã«éèŠãªããšã§ããããã®ãã®ã»ã¯ã·ã§ã³ã¯ãç§ãäžå®ã«ãããŸãïŒ
Immer.js-èªåããªãŒãº
Immerã¯ãproduceã䜿çšããŠå€æŽãããç¶æ ããªãŒãèªåçã«ããªãŒãºããŸãã ããã«ããããããã¥ãŒãµãŒã®å€éšã§ç¶æ ããªãŒã誀ã£ãŠå€æŽãããã®ãé²ãããšãã§ããŸãã ããã«ã¯ããã©ãŒãã³ã¹ãžã®åœ±é¿ããããããæ¬çªç°å¢ã§ã¯ãã®ãªãã·ã§ã³ãç¡å¹ã«ããããšããå§ãããŸãã ããã©ã«ãã§æå¹ã«ãªã£ãŠããŸãã ããã©ã«ãã§ã¯ãããŒã«ã«éçºäžã«ãªã³ã«ãªããæ¬çªç°å¢ã§ã¯ãªãã«ãªããŸãã setAutoFreezeïŒtrue / falseïŒã䜿çšããŠããã®æ©èœãæ瀺çã«ãªã³ãŸãã¯ãªãã«ããŸãã
ãããŠçªç¶ã Development / Prod
è¿œå ãããæ©èœããµããŒãããå¿
èŠããããŸãã ããªãã®éã®äœæ¥ã§ããããã¬ãŒããªããããŸããªãã®ã§å¿é
ã§ããããããç§ã®å人çãªæèŠã§ãã
@codedavinci ïŒãã®redux-starter-kit
ã©ã€ãã©ãªã®ãã€ã³ãã¯ããåºæ¬çãªãReduxã¹ãã¢ã®ã»ããã¢ããããã»ã¹ã«äŸ¿å©ãªããŒã«ãšæœè±¡åãè¿œå ããããšã§ãã ãŸããããã¯Reduxã³ã¢èªäœã«å
¥ãã®ã§ã¯ãªããæçµçã«Reduxçµç¹ã®ãå
¬åŒãéšåã«ããããšèããŠããå¥ã®ã©ã€ãã©ãªã«å
¥ãããšã«æ³šæããŠãã ããã
æ¢åã®Reduxã³ãŒãã¯ãã¹ãŠæ©èœããŸãã æ¢åã®ãã¥ãŒããªã¢ã«ã¯ãã¹ãŠåé¡ãããŸããã Reduxãã»ããã¢ããããŠäœ¿çšããããã«ãå ¬åŒã«ãµããŒããããŠããããç°¡åãªã¢ãããŒããè¿œå ããããšããŠããŸãã
@markeriksonã¹ã¿ãŒã¿ãŒããããæºè¶³ããŠããŸããã©ã€ãã©ãªã®æŠå¿µãå€æŽããImmer.js
ãããªã©ã€ãã©ãªãçšæããããšã«å°ãæµæããããæçµçã«ã¯äººã
ãstarter-kit
ãã¿ãŒã³ã§ãããã³ã¢ã³ã³ã»ãããå®å
šã«ç¡èŠããŸãã åºèã®çªç¶å€ç°ã¯ã¢ãããŒã§ã¯ãããŸãããReduxã¯åžžã«ããã販売ããŠããããã©ã³ãã®äžéšã§ãã
PSïŒ Immer.js
ã¯äœãå€æŽããªãããšãå®å
šã«ç解ããŠããŸãããå€æŽããªãããã«æ¯æŽããŸããç§ã¯push
ã splice
ãªã©ã®æ§æäžã®æšæºã«ã€ããŠè©±ããŠããã ãã§ãã ..ãã
ãã¶ããããã¯ç§èªèº«ãå€åã«æµæããŠããã ãã§ã:)
@codedavinci ïŒãããç§ã¯æžå¿µã®ãã€ã³ããç解ããŠããŸãã ããã§ããReduxã«é¢ããäžè¬çãªäžæºã®1ã€ã¯ãé©åãªäžå€ã®æŽæ°ã³ãŒããæžãããšã®èŠçã§ãããImmerã¯ããããã®æŽæ°ãç°¡çŽ åããããã«ç§ãèŠãäžã§æé«ã®ã©ã€ãã©ãªã§ãã
@markerikson ãç§ã¯å®éã«immer
ãæãäžããŠã¿ãŸããããéåžžã«è»œããã·ã³ãã«ã§å¹ççã§ããããšã«æ°ã¥ããŸããã ç§ã¯å®éã«å£²ãããŠããŸã:)ã
ã©ã®ãªããžããªãäœæããŠããŸããïŒ ãããã®ïŒ
https://github.com/markerikson/redux-starter-kit
https://www.npmjs.com/package/@acemarke/redux -starter-kit
https://unpkg.com/@acemarke/redux [email protected]/
ãããããã ãã§ãã
@nickmccurdyã«ã¯ãäž»ã«ããŒã«ã«é¢ããè°è«ãšå䜵ãåŸ ã£ãŠããPRããããããããŸããããããžã§ã¯ããããé·æçã«ã©ã®ããã«éäžãããããã«ã€ããŠã®è°è«ããããŸãã ç§ã¯ããããèŠãŠåãå¿ èŠããããŸãããããæ°é±éã¯ä»ã®ãã®ã§å¿ããã£ãã§ãïŒææ¥è¡ãäŒè°ã®è©±ãå«ãïŒã
倧ããªé²æ©@ nickmccurdy ïŒ @markeriksonðç§ã¯ããã®ã·ã³ãã«ããšå¹æã倧奜ãã§ãã @nickmccurdyã¯ãããªãããããžã§ã¯ãã«éåžžã«ç©æ¥µçã«
確ãã«ãæ°ããå·ã§ãªãŒãã³ãã£ã¹ã«ãã·ã§ã³ãéå§ããã®ãããããæåã§ããã nick @ nickmccurdy.comãŸãã¯DiscordããçŽæ¥ç§ã«é£çµ¡ããããšãã§ããŸãã
combineReducers
ãåå²ããããã®+1ã äžçªé·ã䜿ã£ãŠããã®ã§ãããåºã®éå¶ã«ã€ããŠã¯ããŸãæ·±ãèããŠããªãã£ãããã§ãã
ç§ã¯çŸåšã次ã®ããã«ã¬ãã¥ãŒãµãŒæ©èœãèšå®ããã®ã奜ãã§ãã
function reducer(prevState, event, handledNavigation = false) {
if (event.type === 'NAVIGATION' && !handledNavigation) {
return reducer(onNavigate(prevState, event), event, true);
}
const pageReducer = pageReducers[prevState.activePage];
const nextSessionState = sessionReducer(prevState.sessionState, event);
const nextPageState = pageReducer(prevState.pageState, nextSessionState, event);
return {
activePage: prevState.activePage,
pageState: nextPageState,
sessionState: nextSessionState,
};
}
ããã¯combineReducersã§ã¯å®éã«ã¯ã§ããŸããã
@ abradley2 ïŒããªããæ±ããŠããã®ã§ããã°ãReduxã³ã¢ããcombineReducers
ãåé€ããäºå®ã¯ãããŸããã ããããã¯ããç§ãã¡ã¯åžžã«combineReducers
ãæãäžè¬çãªãŠãŒã¹ã±ãŒã¹ã®ãŠãŒãã£ãªãã£ã§ãããèªåã®ç¶æ³ã«åãããŠã«ã¹ã¿ã ã¬ãã¥ãŒãµãŒããžãã¯ãäœæããããšããå§ãããŸãã
redux-starter-kit
ããã±ãŒãžåãããããªããžããªã¯https://github.com/reduxjs/redux-starter-kitã®çµç¹ã«ç§»åãããŸããã ãã®ã¹ã¬ãããéããŸãã ãã以äžã®è°è«ã¯ããã®ã¬ãã§è¡ãããå¯èœæ§ããããŸãã
ãŸããããã©ã«ãã§ãã¥ãŒããŒã·ã§ã³ãšçŽååå¯èœæ§ã®ãã§ãã¯ãè¿œå ããäœæ¥ãå§ããŠããŸãã
æãåèã«ãªãã³ã¡ã³ã
ã ããããããš...ç§ã¯è¡ã£ãŠäœããããŸããïŒ
åã®ã¹ãããããšã¯ç°ãªãç¹ïŒ
enhancers
èšå®ãªãã·ã§ã³ãæå ¥ããŸãããselectorator
äŸåæ§ãããšã¯ã¹ããŒãcreateSelector
èãïŒ