рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА
рд░рд┐рдбрдХреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА
рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рджреМрд░рд╛ рдХрд░ рдЪреБрдХрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдореБрдЭреЗ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рджреЗрд░реА рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛ред рдореИрдВ рд╕рдореБрджрд╛рдп рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рдЪреМрдВрдХрд╛рдиреЗ рд╡рд╛рд▓реА рдпрд╛ рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рдЦреЛрдЬ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рдЯреАрдПрд▓; рдбреАрдЖрд░: рдЬреЗрдПрд╕ рдХреЛрдб рдХреА 7 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдХреЛрд░ рд░рд┐рдбрдХреНрд╕ рддрд░реНрдХ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд░рд┐рдбрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ (рдЬреАрдереВрдм рдкрд░ рд╣реЗрдбрд░ рдХрд╛ рдореБрдлреНрдд рдЕрдиреБрд╡рд╛рдж):
Redux рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИред
рдпрд╣ рдЙрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ / рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рддреЗ рд╣реИрдВ, рд╡рд┐рднрд┐рдиреНрди рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ (рдХреНрд▓рд╛рдЗрдВрдЯ / рд╕рд░реНрд╡рд░ / рджреЗрд╢реА рдХреЛрдб) рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдореИрдВрдиреЗ
Redux рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдкрд░ рдХреНрд▓реЛрди рдХрд┐рдпрд╛ , рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рд╕реНрд░реЛрдд рдлрд╝реЛрд▓реНрдбрд░ рдЦреЛрд▓рд╛ (
рдбреЙрдХреНрд╕ ,
рдЙрджрд╛рд╣рд░рдг рдЖрджрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реБрдП) рдФрд░
рдХреИрдВрдЪреА рдХреЗ рд╕рд╛рде рдбрд┐рд▓реАрдЯ рдХреА рдХреЛ
рдкрдХрдбрд╝рд╛ :
- рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдХреЛрдб рд╕реЗ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЧрдпрд╛
рдкреНрд░рддреНрдпреЗрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкрджреНрдзрддрд┐ рдХреЛ JSDoc рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
- рддреНрд░реБрдЯрд┐ рд╕рддреНрдпрд╛рдкрди рдФрд░ рд▓реЙрдЧрд┐рдВрдЧ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛
рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдореЗрдВ, рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рд╡рд┐рд╕реНрддреГрдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╕рд╛рде рдХрд╕рдХрд░ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
- рд╣рдЯрд╛рдП рдЧрдП bindActionCreators , рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм , рд░рд┐рдкреНрдбрд░рдбреНрдпреВрд╕рд░ рдФрд░ рдЕрд╡рд▓реЛрдХрдиреАрдп рддрд░реАрдХреЗ ред
... рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдХрд░ рд╕рдХрддрд╛ рдерд╛ред рдЦреИрд░, рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЙрдирдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЖрд▓рд╕реА рдерд╛ред рд▓реЗрдХрд┐рди рдХреЛрдиреЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рдмрд┐рдирд╛, рд╡реЗ рдЖрдЧреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рджрд┐рд▓рдЪрд╕реНрдк рд╣реИрдВред
рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдмрдЪрд╛ рд╣реИ
7 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ redux рд▓рд┐рдЦрдирд╛
Redux рдХреА рд╕рднреА рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдПрдХ рдЫреЛрдЯреА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рд╣реА рдХреЛрдИ рдЬреАрдереБрдм рднрдВрдбрд╛рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдЧрд╛ :)
function createStore(reducer, initialState) {
let state = initialState
return {
dispatch: action => { state = reducer(state, action) },
getState: () => state,
}
}
. , ,
.
redux. 18 HeadHunter ┬лredux┬╗ тАФ , , 7 . тАФ .
7 TodoApp. .
TodoApp redux.
function todosReducer(state, action) {
switch (action.type) {
case 'ADD_TODO':
return [
...state,
{
id: action.id,
text: action.text,
completed: false
}
]
case 'TOGGLE_TODO':
return state.map(todo => {
if (todo.id === action.id) {
return { ...todo, completed: !todo.completed }
}
return todo
})
default:
return state
}
}
const initialTodos = []
const store = createStore(todosReducer, initialTodos)
store.dispatch({
type: 'ADD_TODO',
id: 1,
text: ' redux '
})
store.getState()
store.dispatch({
type: 'TOGGLE_TODO',
id: 1
})
store.getState()
,
show must go on.
, .
combineReducers
, , reducer , .
:
function counterReducer(state, action) {
if (action.type === 'ADD') {
return state + 1
} else {
return state
}
}
const reducer = combineReducers({
todoState: todoReducer,
counterState: counterReducer
})
const initialState = {
todoState: [],
counterState: 0,
}
const store = createStore(reducer, initialState)
store , .
TodoApp .
ES6 (7/8/тИЮ):
const reducer = combineReducers({ todos, counter })
todoReducer todos counterReducer counter. . , , redux, ,
(state.todos) ,
(function todos(){}).
micro-redux, :
function reducer(state, action) {
return {
todoState: todoReducer(state, action),
counterState: counterReducer(state, action),
}
}
. 2 ┬л-┬╗,
(state, action),
, ?, Object.entries
combineReducers (, )
:
function combineReducers(reducersMap) {
return function combinationReducer(state, action) {
const nextState = {}
Object.entries(reducersMap).forEach(([key, reducer]) => {
nextState[key] = reducer(state[key], action)
})
return nextState
}
}
redux 9 .
, , .
applyMiddleware
middleware redux тАФ - , dispatch
-. , , ,тАж тАФ
-.
middleware createStore, , :
const createStoreWithMiddleware = applyMiddleware(someMiddleware)(createStore)
const store = createStoreWithMiddleware(reducer, initialState)
applyMiddleware, 10 , : createStore ┬лdispatch┬╗. dispatch, ( ) , тАФ , (newState = reducer(state, action)).
applyMiddleware
dispatch, ( ) - .
, , middleware redux тАФ
redux-thunk,
store.dispatch({type: 'SOME_ACTION_TYPE', some_useful_data: 1 })
store.dispatch
function someStrangeAction() {
return async function(dispatch, getState) {
if(getState().counterState % 2) {
dispatch({
type: 'ADD',
})
}
await new Promise(resolve => setTimeout(resolve, 1000))
dispatch({
type: 'TOGGLE_TODO',
id: 1
})
}
}
,
dispatch(someStrangeAction())
:
- store.getState().counterState 2, 1
- , todo id=1 completed true false .
, redux-thunk, redux тАФ , ,
:
const thunk = store => dispatch => action => {
if (typeof action === 'function') {
return action(store.dispatch, store.getState)
}
return dispatch(action)
}
,
const thunk = store => dispatch => action
, , , , , (, , )
,
createStorefunction createStore(reducer, initialState) {
let state = initialState
return {
dispatch: action => { state = reducer(state, action) },
getState: () => state,
}
}
(reducer, initialState) { dispatch, getState }.
,
applyMiddleware , , .
createStore :
function applyMiddleware(middleware) {
return function createStoreWithMiddleware(createStore) {
return (reducer, state) => {
const store = createStore(reducer, state)
return {
dispatch: action => middleware(store)(store.dispatch)(action),
getState: store.getState,
}
}
}
}
redux . ┬л , ┬╗. , 1 тАФ .
P.S.
┬лmicro-redux┬╗ store.subscribe 8 . ?