javascript - 回调不更新状态

标签 javascript reactjs

以下函数处理上传的文件,由于某种原因,setFiles 在回调结束后不会更新 files 列表,因此会导致显示先前上传的文件在页面上,例如用户上传了图像 1.jpg,页面上不会显示任何内容,接下来用户上传第二个文件 - 现在是第一个图像 1.jpg 将显示,依此类推。

setFiles 上,状态正确并已更新,但 return 不会更新 files 状态。

知道为什么吗?

  const [files, setFiles] = useState([])

  const addFiles = addedFiles => {
    const newFiles = Array.from(addedFiles, file => newFileDecorator(file))
    setFiles([...files, ...newFiles])

    newFiles.forEach(file => {
      file.reader.onload = async () => {
        const dimensions = await getImageDimensions(file.reader.result)
        setFiles(state => {
          const index = state.findIndex(f => f.id === file.id)
          state[index].readyState = file.reader.readyState
          state[index].dimensions = dimensions
          return state
        })
      }

      file.reader.readAsDataURL(file.data)
    })
  }

最佳答案

您正在改变状态而不为其创建新的引用,因此 React 会跳过更新,因为浅比较表明它们是同一对象。请改用此模式。

       setFiles(state => {
          const file = state.find(f => f.id === file.id)
          file.readyState = file.reader.readyState
          file.dimensions = dimensions
          return [ ...state, file ]
        })

关于javascript - 回调不更新状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56574172/

相关文章:

reactjs - 尝试使用 React 访问 Azure Key Vault 时无法解析 node_modules 中的 'url' 错误

javascript - unity 从一个脚本到另一个脚本的变量访问

javascript - 用 async/await 重写 promises,寻求澄清

javascript - 以非线性方式调整一组相邻 div 的位置

javascript - 允许 Material UI RaisingButton 标签中存在变量

javascript - 顶部带有箭头的 React 水平滚动卡片

javascript - 超链接的键盘快捷键 (jQuery)

javascript - 将本地声明的变量引用到数组中以获取 chartjs 的数据

reactjs - Azure 应用服务上符号链接(symbolic link)上的 yarn EPERM(不允许操作)

javascript - 未捕获的语法错误 : Unexpected identifier when trying to import React