Javascript 材质UI表组件与Redux的配合不好
版本Javascript 材质UI表组件与Redux的配合不好,javascript,reactjs,redux,material-ui,Javascript,Reactjs,Redux,Material Ui,版本 材料界面:0.18.0 反应:15.5.4 Redux:3.6.0 浏览器:Chrome——版本59.0.3071.115(官方版本)(64位) 问题 我使用redux进行应用程序范围的状态管理,而不是setState。调用redux操作时,复选框不会注册为已选中,但会注册为在I console.log上记录onRowSelection时单击了复选框。如果我删除调用我的操作的行,复选框就可以正常工作。由于某些原因,当我调用redux操作时,材质UI被阻止更新 --编辑-- 似乎不是操作导致
材料界面:0.18.0
反应:15.5.4
Redux:3.6.0
浏览器:Chrome——版本59.0.3071.115(官方版本)(64位)
问题
我使用redux进行应用程序范围的状态管理,而不是setState。调用redux操作时,复选框不会注册为已选中,但会注册为在I console.log上记录
onRowSelection
时单击了复选框。如果我删除调用我的操作的行,复选框就可以正常工作。由于某些原因,当我调用redux操作时,材质UI被阻止更新
--编辑--似乎不是操作导致了故障,而是我的减速器的某些方面,material UI的表不喜欢。
(在下面添加了reducer代码段) 表格组件
class AdminDeptAppAccess extends React.Component {
_onRowSelection (selectedUsers, props) {
console.log(selectedUsers)
props.selectedUsersAction(filterUsers(selectedUsers, props.deptAppRoles))
}
render () {
return (
<Table
selectable
multiSelectable
onRowSelection={(selectedUsers) => this._onRowSelection(selectedUsers, this.props)}
>
{/* contents */}
</Table>
)
}
}
const filterUsers = (selectedUsers, deptAppRoles) => {
if (selectedUsers === 'all') {
return deptAppRoles
} else if (selectedUsers === 'none') {
return []
} else if (selectedUsers === []) {
return []
} else {
let users = []
selectedUsers.map((num, i) => (
users.push(deptAppRoles[num])
))
return users
}
}
适用减速器
屏幕截图忽略控制台错误,它们来自其他方面 我选择了第一行,控制台注册了被单击的[0],我的redux操作注册了被单击的人,但是复选框没有更新,因为我的redux操作(reducer)以某种方式阻止组件呈现更新的复选框
这里的问题是,您的reducer使用的是不可变状态(通过使用
Object.assign
)。这是编写减速器(或使用扩展表示法)的一种好方法,但它在这里造成了一个问题
当您在reducer中设置新的selectedUsers
时,您也在创建状态的新副本并替换旧副本。我猜您正在将用于生成表的实际数据存储在与selectedUsers
(用户对象数组?)相同的缩减器中。当您使用Object.assign({}、state等)时,您正在创建state对象上每个属性的新实例。这包括用于生成表行的用户对象数组
表组件必须注册此数组是新的,并根据数组已被替换的事实强制重新呈现或清除当前选定状态
我也有同样的问题,我从这个修复开始-
const admin = (state = { selectedUsers: [] }, action) => {
switch (action.type) {
// ...
case 'SELECTED_USERS':
state.selectedUsers = action.selectedUsers
return state
default:
return state
}
}
它起作用了,但我不喜欢它。
因此,我选择将我的selectedUsers
存储在一个单独的还原器中,还原为用于生成表的实际用户数据,这也解决了我的问题。这不是世界上最好的修复方法,但它很有效,比牺牲不变性要好
因此,目前我为不同的表视图选择了一个单独的减速机。我认为从长远来看,我需要找到一个更好的解决方案。很好的解释,现在完全理解!
const admin = (state = { selectedUsers: [] }, action) => {
switch (action.type) {
// ...
case 'SELECTED_USERS':
return Object.assign({}, state, {
selectedUsers: action.selectedUsers
})
default:
return state
}
}
const admin = (state = { selectedUsers: [] }, action) => {
switch (action.type) {
// ...
case 'SELECTED_USERS':
state.selectedUsers = action.selectedUsers
return state
default:
return state
}
}