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
 }
}