reactjs - Redux 操作花费太长时间将一项添加到空数组 - 没有返回承诺
问题描述
我正在使用 Redux 来管理我的 react 应用程序的状态。我正在创建一个对象,然后将此对象传递给 addTile 函数,这是我的操作。
所以我的 action.ts 看起来像这样:
export function addTile(tile){
return {
type: "ADD_TILE",
payload: tile
}
}
我的 reducer.ts 看起来像这样:
const reducer = (state = {
isPanelOpen: false,
isDiscardAllChangesOpen: false,
tiles: [],
tempTiles: [],
}, action) => {
switch (action.type) {
case "PANEL_VISIBILITY":
state = {
...state,
isPanelOpen: action.payload
};
break;
case "ADD_TILE":
state = {
...state,
tiles: [...state.tiles, action.payload]
}
break;
}
return state;
};
export default reducer;
但是,如果我尝试在我的组件中使用它,如下所示:
this.props.addTile(tile)
alert(this.props.tiles.length)
长度将为 0。但是,该项目实际上已添加到数组中,但在警报执行时,长度为 0。根据我对 Redux 文档的阅读,默认情况下操作是异步的(或者至少我是这样明白他们是)。
我什至尝试这样做:
this.props.addTile(tile)
.then(response => { //some code})
然后我无法读取未定义的属性。
有任何想法吗?
解决方案
当你在 dispatch 一个 action 后尝试检查 prop 时,React 还没有机会重新渲染。不是“花费太长时间”,而是您自己的代码仍在执行。所以,React 并没有重新渲染你的组件,prop 值还是一样的。
您的承诺示例仅在addTile()
返回承诺的重击时才有效。
推荐阅读
- ios - macOS 和 iOS 之间 SwiftUI 中 TextField 的背景颜色之间的区别?
- javascript - 如何在Angular中导航期间保留分页数据?
- azure-sql-database - 如何将 Azure 数据工厂管道详细信息加载到 Azure Blob 存储以进行跟踪?
- c++ - CreateDC 函数返回 NULL
- django-rest-framework - 测试中的 reverse() 仅在 django-rest-framework 测试中返回相对 URL,这会导致 404
- python-3.x - 如何在某些条件下使用 split() 方法?
- python - 从字符串中返回所有日期
- javascript - 活动和点击的菜单(标签)不改变 CSS(DIVI 网站)
- .net - 如何从图标字体中提取设置的 unicode 并在 WPF 中显示它们
- sql - 嵌套的透视列