【问题标题】:Mobx not updating when state changes状态改变时 Mobx 不更新
【发布时间】:2018-12-18 17:42:33
【问题描述】:

我正在使用带有 mbox 的 react-table 并且遇到了我的状态未更新的问题。

我有一张这样的桌子

<ReactTable
  data={data}
  columns={columns}
  showPageSizeOptions={false}
  resizable={false}
  className="-striped -highlight"
  defaultPageSize={12}
  filterable={true}
/>

一列

{
  Header: "",
  accessor: "checkbox",
  filterable: false,
  width: 35,
  Cell: ({ original }) => {
    return (
      <input
        type="checkbox"
        className="checkbox"
        checked={employeeUiStore.selectedEmployees.indexOf(original.id) >= 0 }
        onChange={() => employeeUiStore.toggleCheckbox(original.id)}
      />
    );
  }
},

还有这样的商店

class EmployeeUiStore {
  @observable addMode = false;
  @observable selectedEmployees = []
  constructor(){}
  @action
  toggleCheckbox(employeeId) {
    const index = this.selectedEmployees.indexOf(employeeId);
    if(index === -1){
      this.selectedEmployees = [...this.selectedEmployees, employeeId];
    }else {
      const newSelectedEmployees = [...this.selectedEmployees];
      newSelectedEmployees.splice(index, 1);
      this.selectedEmployees = newSelectedEmployees;
    }
  }  
  @action
  toggleAddEmployee(){
      this.addMode = !this.addMode;
  }
}
export default EmployeeUiStore;

奇怪的是,如果我在我的代码中添加这样的东西

console.log(employeeUiStore.selectedEmployees.indexOf(0) >= 0)

然后状态会正确更新,但是当我删除此行时,什么都不会更新。

我看到我的 toggleCheckbox 正在被触发并且状态正在更新。

我在这个组件上也有@observer。

【问题讨论】:

    标签: javascript reactjs mobx react-table


    【解决方案1】:

    当您将 data 数组传递给 ReactTable 组件时,您不会取消引用任何内容。

    在将数组传递给外部库之前,您可以通过数组上的 using slice or peek 解决此问题:

    <ReactTable
      data={data.slice()}
      columns={columns}
      showPageSizeOptions={false}
      resizable={false}
      className="-striped -highlight"
      defaultPageSize={12}
      filterable={true}
    />
    

    在 MobX 中也不需要不变性。您可以立即更改数组:

    class EmployeeUiStore {
      @observable addMode = false;
      @observable selectedEmployees = [];
    
      @action
      toggleCheckbox(employeeId) {
        const index = this.selectedEmployees.indexOf(employeeId);
        if (index === -1) {
          this.selectedEmployees.push(employeeId);
        } else {
          this.selectedEmployees.splice(index, 1);
        }
      }
    
      @action
      toggleAddEmployee(){
        this.addMode = !this.addMode;
      }
    }
    
    export default EmployeeUiStore;
    

    【讨论】:

    • peek 是内置的吗?我越来越不确定。我尝试使用像 columns.slice().sort() 这样的切片,但仍然不能 100% 工作。实际上复选框并没有真正检查。
    • @chobo2 我的错,我在错误的阵列上使用了peek。你应该在可观察的data 上使用它。是的,它是内置的 MobX。
    • 我需要导入一些东西,我得到“peek is not a function”
    • @chobo2 这令人沮丧。 slice 也可以。我更新了答案。您还可以立即改变您的数据,无需使用不可变技术。我在答案中更新了toggleCheckbox
    • 是的,那是我刚使用 reactjs 状态时留下的代码。它工作得更好,但仍然不是 100%。我在表中有 3 行,它开始正常,一旦我开始点击几次,它似乎失去了状态。难道是因为数据实际上是一个由 Mobx 状态树组成的数组?
    猜你喜欢
    • 2016-11-04
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 2023-01-25
    相关资源
    最近更新 更多