javascript - 使用 React hooks 更新动态状态的方法是什么?

标签 javascript reactjs react-hooks

我正在尝试将我的代码更新为 React Hooks。我的函数是在响应后更新异步函数内的数据。我尝试通过 React Hooks 做类似的解决方案,但它并没有真正起作用。这是为什么?有什么方法可以做到吗?

这是我的更新功能:

updateData = (id, itemAttributes, property) => {
    let prop = this.state[property];
    let index = prop.rows.findIndex(x => x.eventID === id);
    if (index === -1) {
        return null
    } else
      this.setState({
          [property]: {
            columns: prop.columns,
            rows: [
                ...prop.rows.slice(0,index),
                Object.assign({}, prop.rows[index], itemAttributes),
                ...prop.rows.slice(index+1)
             ]
          }
      });
}

这就是我获取数据和使用 updateData 函数的方式:

        this.state.data.rows.forEach((elem,index) => {
            setTimeout(async () => {
                const row = await axios.get(url);
                const elemInfo = {
                    eventRegistrants: row.data.numberOfRegistrants,
                    eventParticipants: row.data.numberOfParticipants
                }
                this.updateData(
                    elem.eventID, 
                    elemInfo,
                    'data'
                )
            }, index * 1000)
        })

编辑

这是我当前使用 React Hooks 无法正常工作的解决方案:

const updateData = (id, itemAttributes) => {
    let index = data.rows.findIndex(x => x.eventID === id);
    if (index === -1) {
        console.log('error');
    } else
        setData({
            columns: data.columns,
            rows: [
                ...data.rows.slice(0,index),
                Object.assign({}, data.rows[index], itemAttributes),
                ...data.rows.slice(index+1)
            ]
        });
}

最佳答案

尝试使用setState的函数形式:

const updateData = (id, itemAttributes) => {
  setData(currData => {
    const index = currData.rows.findIndex(x => x.eventID === id);
    if (index === -1) {
      console.log('error');
    } else {
      return {
        ...currData,
        rows: [
          ...data.rows.slice(0, index),
          Object.assign({}, data.rows[index], itemAttributes),
          ...data.rows.slice(index + 1)
        ]
      }
    }
  });
}

另一种方法是使用map设置状态,这样更简洁:

const updateData1 = (id, itemAttributes) => {
  setData(currData => {
    return {
      ...currData,
      rows: currData.rows.map(row => {
        if (row.eventID === id) {
          return {
            ...row,
            itemAttributes
          }
        }
        return row
      })
    }
  });
}

关于javascript - 使用 React hooks 更新动态状态的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60075121/

相关文章:

javascript - 在接近的水线处严格或

javascript - Html2Canvas 调整大小

reactjs - 可下载文件 - Gatsby

javascript - 使用 React-Hooks,如何防止从 Array.map 创建的组件在其中一个兄弟组件更改状态时重新呈现?

javascript - 在 react Jest 中测试文件上传

javascript - Ember.js 嵌套路由

javascript - 如何正确使用 createPages API 以编程方式创建页面?

javascript - webpack 中的 css 配置不检测类样式但检测元素样式

reactjs - React Hook useEffect 缺少依赖项 : 'dispatch'

javascript - Ajax响应未调用成功:function() when using jQuery 1. 8.3