微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

React 异步渲染多个带有状态的组件

如何解决React 异步渲染多个带有状态的组件

我正在尝试在示例 CRA React 项目中使用 GPU.js。我试图在 cpu 和 GPU 计算之间进行可见的比较,但 React 在显示所有结果之前“等待”cpu 计算完成,尽管它们位于不同的组件中,使用不同的状态。

示例:在同一个组件中

function Combined() {
  const [gpu,setGpu] = useState('null')
  const [cpu,setcpu] = useState('null')

  useEffect(() => {
    const size = 500
    const matrices = generateMatrices(size)
    setGpu(gpuMultiplyMatrix(matrices,size))
    setcpu(cpuMultiplyMatrix(matrices,size))
  },[])

  return (
    <div className='App'>
      ...
      <div>{gpu && gpu}</div>
      <div>{cpu && cpu}</div>
      ...
    </div>
  )
}

在同一个组件中,React 在渲染组件之前会等待 cpuMultiplyMatrix 完成。我预料到了这一点。

View GIF

示例:分离的组件

GPU

function GPUOnly() {
  const [gpu,setGpu] = useState('null')

  useEffect(() => {
    const size = 500
    const matrices = generateMatrices(size)
    gpuMultiplyMatrixAsync(matrices,size).then(result => setGpu(result))
  },[])

  return (
    <div className='App'>
      GPU in separated Component
      <div>{gpu && gpu}</div>
      <hr />
    </div>
  )
}

处理器

function cpuOnly() {
  const [cpu,setcpu] = useState('null')

  useEffect(() => {
    const size = 500
    const matrices = generateMatrices(size)
    cpuMultiplyMatrixAsync(matrices,size).then(result => setcpu(result))
  },[])

  return (
    <div className='App'>
      cpu in separated Component
      <div>{cpu && cpu}</div>
      <hr />
    </div>
  )
}

应用

import GPUOnly from './components/GPU'
import cpuOnly from './components/cpu'

function App() {
  return (
    <>
      <GPUOnly />
      <cpuOnly />
    </>
  )
}

尽管被分离,React 仍然会等待 cpu 计算完成才能渲染 GPU,即使 GPU 组件完成的任务必须更快。

View GIF

我尝试过异步调用,并将它们分成自己的钩子。没有变化,因为 useEffect 同步执行其回调中的功能

渲染多个组件时如何实现异步行为?

解决方法

IF 异步调用在后台线程(例如 Web Worker)上运行,那么它应该按预期工作,即组件应该独立完成和呈现。仅仅因为 API 是异步的并不一定保证它们在后台运行。

一个玩具示例显示了您正在寻找的行为确实适用于 React,正如您所描述的那样:https://codesandbox.io/s/cool-pond-s2u1z?file=/src/App.js

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?