Javascript 读取存储';Redux减速器中的s初始状态
Redux应用程序中的初始状态可以通过两种方式设置:Javascript 读取存储';Redux减速器中的s初始状态,javascript,reactjs,redux,Javascript,Reactjs,Redux,Redux应用程序中的初始状态可以通过两种方式设置: 将其作为第二个参数传递给createStore() 将其作为第一个参数传递给您的(子)还原器() 如果将初始状态传递给存储,如何从存储中读取该状态并使其成为还原程序中的第一个参数?简而言之:将初始状态传递给还原程序的是Redux,您不需要做任何事情 当您调用createStore(reducer,[initialState])时,您让Redux知道当第一个操作进入时要传递给reducer的初始状态是什么 您提到的第二个选项仅适用于创建存储
- 将其作为第二个参数传递给
()createStore
- 将其作为第一个参数传递给您的(子)还原器()
如果将初始状态传递给存储,如何从存储中读取该状态并使其成为还原程序中的第一个参数?简而言之:将初始状态传递给还原程序的是Redux,您不需要做任何事情 当您调用
createStore(reducer,[initialState])
时,您让Redux知道当第一个操作进入时要传递给reducer的初始状态是什么
您提到的第二个选项仅适用于创建存储时未传递初始状态的情况。i、 e
函数todoApp(state=initialState,action)
只有在Redux未传递状态时,才会初始化状态。我希望这能回答您的请求(我理解为在传递intialState并返回该状态时初始化还原程序) 我们就是这样做的(警告:复制自Typescript代码) 其要点是主减速器(工厂)功能中的
if(!state)
测试
如何从存储中读取该状态,并使其成为减缩器中的第一个参数
combineReducers()为您完成这项工作。
第一种写它的方法并没有真正的帮助:
const rootReducer = combineReducers({ todos, users })
但另一个,也就是等价物,更清楚:
function rootReducer(state, action) {
todos: todos(state.todos, action),
users: users(state.users, action)
}
TL;博士
如果没有combineReducers()
或类似的手动代码,initialState
总是在reducer中胜过state=…
,因为传递给reducer的state
是initialState
而不是undefined
,因此在这种情况下不会应用ES6参数语法
使用combineReducers()
时,行为更加微妙。在initialState
中指定其状态的减速器将接收该状态
。其他还原程序将接收未定义的
,因此将返回到它们指定的状态=…
默认参数
通常,initialState
会赢得减速器指定的状态。这允许还原程序将对其有意义的初始数据指定为默认参数,但也允许在从某个持久性存储或服务器对存储进行水合处理时加载现有数据(全部或部分)。
首先,让我们考虑一个单一减速器的情况。
假设您不使用combineReducers()
那么您的减速器可能如下所示:
function counter(state = 0, action) {
switch (action.type) {
case 'INCREMENT': return state + 1;
case 'DECREMENT': return state - 1;
default: return state;
}
}
// const combined = combineReducers({ a, b })
function combined(state = {}, action) {
return {
a: a(state.a, action),
b: b(state.b, action)
};
}
现在假设您使用它创建了一个商店
import { createStore } from 'redux';
let store = createStore(counter);
console.log(store.getState()); // 0
初始状态为零。为什么?因为createStore
的第二个参数是undefined
。这是第一次传递给减速器的状态。当Redux初始化时,它会发送一个“虚拟”操作来填充状态。因此,您的计数器
减速机被调用为状态
等于未定义
这正是“激活”默认参数的情况。因此,state
现在是0
,与默认的state
值一致(state=0
)。将返回此状态(0
)
让我们考虑一个不同的场景:
import { createStore } from 'redux';
let store = createStore(counter, 42);
console.log(store.getState()); // 42
import { createStore } from 'redux';
let store = createStore(combined, { a: 'horse' });
console.log(store.getState()); // { a: 'horse', b: 'wat' }
为什么这次是42
,而不是0
?因为调用createStore
时使用42
作为第二个参数。此参数将成为与伪操作一起传递给减速器的状态这一次,状态
不是未定义的(它是42
!),因此ES6默认参数语法无效。状态
是42
,并且从减速器返回42
现在让我们考虑一个用例:<代码> CuleReuleReServer()/<代码>
您有两个减速器:
function a(state = 'lol', action) {
return state;
}
function b(state = 'wat', action) {
return state;
}
组合减速机({a,b})
生成的减速机如下所示:
function counter(state = 0, action) {
switch (action.type) {
case 'INCREMENT': return state + 1;
case 'DECREMENT': return state - 1;
default: return state;
}
}
// const combined = combineReducers({ a, b })
function combined(state = {}, action) {
return {
a: a(state.a, action),
b: b(state.b, action)
};
}
如果我们调用createStore
而不调用initialState
,它将把状态
初始化为{}
。因此,state.a
和state.b
在调用a
和b
减缩器时将未定义两个a
和b
缩减器都将未定义
作为其状态
参数,如果它们指定默认状态
值,则将返回这些值。这就是组合缩减器在第一次调用时返回{a:'lol',b:'wat'}
状态对象的方式
import { createStore } from 'redux';
let store = createStore(combined);
console.log(store.getState()); // { a: 'lol', b: 'wat' }
让我们考虑一个不同的场景:
import { createStore } from 'redux';
let store = createStore(counter, 42);
console.log(store.getState()); // 42
import { createStore } from 'redux';
let store = createStore(combined, { a: 'horse' });
console.log(store.getState()); // { a: 'horse', b: 'wat' }
现在我指定initialState
作为createStore()
的参数。从组合减速器返回的状态将为a
减速器指定的初始状态I与指定b
减速器自行选择的'wat'
默认参数组合在一起
让我们回忆一下组合减速器的作用:
// const combined = combineReducers({ a, b })
function combined(state = {}, action) {
return {
a: a(state.a, action),
b: b(state.b, action)
};
}
在本例中,指定了状态
,因此它不会返回到{}
。它是一个对象,其a
字段等于'horse'
,但没有b
字段。这就是为什么a
减速机将'horse'
作为其状态
接收并愉快地返回它,而b
减速机将未定义
作为其状态
接收并因此返回其默认状态的想法(在我们的示例中,'wat'
)。这就是我们如何得到{a:'horse',b:'wat'}
的回报
综上所述,如果您坚持Redux约定,并在使用undefined
作为state
参数调用减缩器时从减缩器返回初始状态(实现这一点的最简单方法是指定state
ES6默认参数