【发布时间】:2018-09-23 10:18:52
【问题描述】:
在结合 React 应用程序更新 redux 中的状态时,在 reducer 中更新状态。但是在容器中,我仍然是旧状态。
下面是reducer。
import * as constants from '../actions/constants';
export function caseTypes(state=[], action) {
switch(action.type) {
case constants.LOAD_CASE_TYPES_SUCCESS:
return action.caseTypes
default:
return state;
}
}
export function cases(state=[], action) {
switch (action.type) {
case constants.LOAD_CASES_SUCCESS:
const newState = Object.assign({}, state, {cases:action.cases})
alert('newstate' + newState.cases)
return newState;
default:
return state;
}
}
如果我在减速器“案例”中保持警报,我将获得更新到状态的新值。但是在下面的组件中,我的状态仍然很旧 mapStateToProps 函数。 Action 是从 CaseSearchConnectComponent 调度的,并且 CaseSearchConnectComponent 内部的 mapStateToProps 也给出了旧值。
class casePage extends React.Component {
render() {
return(
<div>
<div height="100px">
<CaseSearchConnectComponent/>
</div>
{this.props.loadCaseList &&
<div>
<CaseListConnectComponent cases={this.props.cases}/>
</div>
}
</div>
)
}
}
function mapStateToProps(state) {
alert("case page cases " + state.cases)
return {
cases:state.cases
};
}
const CasePageConnectComponent = connect(mapStateToProps)(casePage);
export default CasePageConnectComponent;
【问题讨论】:
-
嗨。你能告诉我'loadCaseList'是如何传递到casePage组件的吗?另外,mapStateToProps 中的警报是否被调用?
-
我会删除警报,并将console.log 放在两个地方:在casePage 的render 函数的开头,在return 之前,在reducer 中,就在case constants.LOAD_CASES_SUCCESS 之后。告诉我们你发现了什么。
-
@AbhayShiro:抱歉,我错过了 mapStateToProps 和 reducer 中的 loadCaseList。 mapStateToProps 内部的警报被调用,但它不返回在 reducer 中设置的值。但是 reducer 内部的警报给出了更新的值。
-
cases的初始状态为state=[],然后在接收到操作类型 LOAD_CASES_SUCCESS 后,将其更改为 JSON 对象{ cases: [..] }。有什么特别的原因吗?它会引起很多混乱。 -
@ThoVu:不。我刚刚这样做了,没有具体原因。基本上,最初调用 caseTypes reducer 函数,我得到容器中 caseTypes 的值。但是,在调用“cases”reducer 函数后,reducer 中的警报会显示 case 值。但在我的组件中,我无法获得案例价值。但是,caseTypes 是可用的,它是在页面加载时添加的。