【问题标题】:state of component keeps reverting back to it's original state组件的状态不断恢复到原来的状态
【发布时间】:2021-09-14 03:19:30
【问题描述】:

我有一个具有以下状态的组件(DataGrid):

    const [rows, setRows] = useState([
        { id: 1, lastName: 'Snow', firstName: 'Jon', status: 'Sold'},
        { id: 2, lastName: 'Lannister', firstName: 'Cersei', status: 'Quoted No Contact'},
    ])

然后我有一个使用“setRows”更新此状态的函数

const statusHandleChange = (e ,id) => {
      setRows(rows.map((row) => row.id === id ? {...row, status: e.target.value}: row))
    };

基本上,当您更新网格中一行的“状态”字段时,它会更新行状态中的相应状态。

它在第一次更新状态时效果很好,如果我将第二行 (id: 2) 更改为“已售”,那么状态将 console.log out 到这里:

{ id: 1, lastName: 'Snow', firstName: 'Jon', status: 'Sold'},
{ id: 2, lastName: 'Lannister', firstName: 'Cersei', status: 'Sold'}

但是,一旦我更改另一行,例如将第 1 行(id:2)更改为状态:'Interested',然后我更新的上一行将恢复为原始状态。

{ id: 1, lastName: 'Snow', firstName: 'Jon', status: 'Interested'},
{ id: 2, lastName: 'Lannister', firstName: 'Cersei', status: 'Quoted No Contact'} //status switched back to 'Quoted No Contact' instead of the 'Sold' value I originally changed it to

每次我更新状态时,上一行的这种模式总是会恢复到原来的状态。我在这里做错了什么?

【问题讨论】:

    标签: javascript reactjs material-ui


    【解决方案1】:

    您尚未展示如何附加/调用 statusHandleChange,但我的猜测是您应该使用功能状态更新,因为下一个状态数组取决于前一个状态的状态数组。这避免了回调中的任何陈旧状态附件。

    const statusHandleChange = (e ,id) => {
      setRows(rows => rows.map((row) => row.id === id ? 
        {
          ...row,
          status: e.target.value
        } : row
      ))
    };
    

    【讨论】:

    • 成功了,现在我明白了为什么功能状态更新很有用。谢谢!!!
    • @reidospeedo 太棒了!很高兴我能解决您的问题,如果可以,请将此答案标记为已接受。不要忘记对您在 SO 上找到的有用和/或有用的问题、答案和 cmets 进行投票。干杯,祝你好运。
    猜你喜欢
    • 2022-11-28
    • 2013-08-29
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多