【问题标题】:Prevent all component rendering阻止所有组件渲染
【发布时间】:2021-06-19 05:15:18
【问题描述】:

我有一个存储组件的变量,例如:

const list = {
   components: [<ComponentOne key={1}/>, <ComponentTwo key={2}/>]
}

只有客户选择的组件会被渲染,其他没有选择的组件应该待机,但不能被销毁,因为当客户选择另一个组件时,它应该出现而不是重新构建。

但是当我从 ComponentOne 切换到 ComponentTwo 然后又回到 ComponentOne 时,它​​会被重建,并且我丢失了 ComponentOne 中已经完成的所有内容

有没有办法在创建的组件不渲染时,不丢失所有状态?

【问题讨论】:

  • 当你有条件地渲染组件时,它们会默认卸载和装载。您可以根据条件使用 css visibility: hidden 隐藏组件
  • 你还可以在父组件中管理你的组件列表的内部状态,并作为道具传递下去。

标签: reactjs


【解决方案1】:

我可以看到两个选项来实现你想要的:

  1. 管理组件外部的状态
  2. 渲染所有组件,但只显示当前组件

1。管理组件外的状态

列表中的所有组件都是无状态的(没有定义 useState 或 this.state),它们的状态将在外部管理并作为 props 传递。

这可以通过在父组件中或在反应上下文中的状态来完成。

const [ state, setState ] = useState()
const list = {
   components: [ComponentOne, ComponentTwo]
}
const CurrentComponent = list.components[index]

return <CurrentComponent state={state} setState={setState} />

2。渲染所有组件,但只显示当前组件

这不是反应中最惯用的方式,但在大多数情况下应该可以工作。您的组件将具有一个带有 display: none 的 css 属性,但当前显示的属性将具有 display: block(或者可见性:可见/隐藏)。

【讨论】:

  • 感谢回答我还是不是很明白(我是react的初学者)比如每个Component里面都有一个input,如何分别控制每个input的值用你的例子?我在反应上下文中创建组件我试图在这里做,但是当我更改组件时,输入与其他组件的值相同
  • 您可能需要这两个组件来使用不同的状态。例如,有两个 useState() 而不是一个,并将正确的状态传递给正确的组件。
猜你喜欢
  • 1970-01-01
  • 2018-07-19
  • 2020-07-01
  • 2014-07-24
  • 2016-10-26
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 2021-03-29
相关资源
最近更新 更多