Javascript react-redux:理解提供者和代表性组件之间的通信
我很难理解全局存储应该如何与来自react组件的操作一起调度。我对整个概念非常陌生,我不会让我的组件在dispatch()上重新渲染。我进行了深入的研究,发现尽管reducer返回更新的全局状态,但这些值并没有映射回组件props。但是定义了一个适当的函数(mapstatetops) 最小示例:(或下面的最小示例代码) 说明: 我有一个组件Javascript react-redux:理解提供者和代表性组件之间的通信,javascript,reactjs,redux,react-redux,jsx,Javascript,Reactjs,Redux,React Redux,Jsx,我很难理解全局存储应该如何与来自react组件的操作一起调度。我对整个概念非常陌生,我不会让我的组件在dispatch()上重新渲染。我进行了深入的研究,发现尽管reducer返回更新的全局状态,但这些值并没有映射回组件props。但是定义了一个适当的函数(mapstatetops) 最小示例:(或下面的最小示例代码) 说明: 我有一个组件控件,其方法是切换活动。组件已连接到全局存储,并且“我的全局状态”在组件道具中可用 var PullFromStoreControls = function
控件
,其方法是切换活动
。组件已连接到全局存储,并且“我的全局状态”在组件道具中可用
var PullFromStoreControls = function (state) {
return {
concrete: state.me.bool,
nested: state.me.nested.later
}
}
var PushToStoreControls = function (dispatch) {
return {
switchFilter: function (type, value) {
dispatch({
type: 'SET_VAL',
value: value
})
}
}
}
Controls = connect(
PullFromStoreControls,
PushToStoreControls
)(Controls)
我将变量state.me.bool
连接到props.conrete,以避免深层状态树的副作用。我还连接了一个调度器,通过reducer更新全局状态。但是,如果“switchActivities”调用了dispatcher,则复选框的新值将正确地添加到reducer中,然后丢失。全局状态似乎从未正确更新
我错过了什么
index.html
您的问题是您正在变异
状态
。Redux的第二个原则是,状态
不应直接变异-相反,您的reducer是一个纯函数,它应该返回一个新状态:
你的问题在这里:
switch (action.type) {
case 'SET_VAL':
// you are attempting to mutate state.me.bool - this is an antipattern!
state.me.bool = action.value;
break;
}
相反,以返回状态
的新副本的方式编写减速机
function reducer(state, action) {
switch (action.type) {
case 'SET_VAL':
return {
...state,
me : {
...state.me,
bool: action.value
}
};
default:
return state;
}
}
请注意,您需要为嵌套结构复制每个级别的状态
。我在这里使用的是Object spread操作符,但是Object.assign()包含所有工作。希望这有帮助 我读了这么多次“变异状态”,但不知道如何真正防止这种情况。在文档中记住返回新的状态对象,而不是改变以前的状态。
非常感谢,先生。你能把你的…
写出来吗?我太蠢了,不懂…好吧,…
是jsx语法;)但是你的符号给了我语法错误。…
不是JSX特有的。这是ES6的一个特性:您收到的错误是什么?如果您没有ES6对对象扩展的支持,..
将无法工作。好的,多亏了您,我才让它工作。但是您的代码包含语法错误。请稍微更正您的答案(请参阅我的更新)。@agoldev我已修复语法。如果这对你有用的话,你觉得这是正确的吗?
function reducer(state, action) {
switch (action.type) {
case 'SET_VAL':
return {
...state,
me : {
...state.me,
bool: action.value
}
}
}
return state;
}
switch (action.type) {
case 'SET_VAL':
// you are attempting to mutate state.me.bool - this is an antipattern!
state.me.bool = action.value;
break;
}
function reducer(state, action) {
switch (action.type) {
case 'SET_VAL':
return {
...state,
me : {
...state.me,
bool: action.value
}
};
default:
return state;
}
}