在组件安装后设置状态?

IT技术 reactjs
2022-07-15 23:29:25

一个故事:

我有一个服务器渲染,但我的应用程序的某些部分无法在那里完成,因为它们使用文档(用于在画布上绘图的react艺术库)。我不能以相同的方式渲染所有内容,因为 react 会说从服务器和客户端接收到的代码是不一样的。

所以我的解决方案是在服务器上渲染我的应用程序的某些部分,然后在客户端上渲染这部分,然后在下一帧中,渲染所有无法在客户端上渲染的内容。

所以我在考虑使用setStateincomponentDidMount并触发 DOM 更新,所以它可以包含无法在服务器上呈现的渲染客户端部分,但是 eslint 说在componentDidMount. 从逻辑上讲,我不能说为什么在这种情况下不好。通常它并不好,因为它会触发 DOM 更新,但就我而言,这是我真正需要的。

在这种情况下你会提出什么建议?

编辑1: 修正错字,我的意思是componentDidMount不是componentDidUpdate

编辑 2: 是同样的问题,但他们使用更改状态componentDidMount作为解决方法。

4个回答

我刚刚编写了一个类似的场景并愉快地使用了 componentDidMount 禁用 ESLint 的警告。恕我直言,它仅在通用渲染场景中完全有效。

原因:不鼓励在 componentDidMount中使用 setState,因为您会触发额外的、不必要的渲染。

但是,在您想要区分服务器和客户端行为的通用场景中,您将需要额外的渲染,并且为了防止“无法重用标记”错误,您需要在 react 与服务器渲染的 DOM 协调之后使用它。简而言之:无论如何你都会渲染两次。

但是,我不建议在叶子/哑组件中编写此行为,因为这样做需要所谓的哑组件对其环境(客户端/服务器)有一些了解并提出设计问题。创建一个设置哑组件属性的组件将是显而易见的解决方案。

尝试在componentWillMount或中设置状态componentWillUpdate

注意componentWillMount,它也可以称为服务器端。

我从您的问题中了解到的是,在您的组件安装后,服务器和客户端上的数据会发生变化,并且您希望使组件与更改的数据保持同步。我建议你看看 react 的 Flux 或 redux 架构。例如,flux 的实现方式是,当组件中的任何内容发生变化时,它都会触发动作并监听 store。当存储中的任何内容发生更改时,组件将重新呈现自己。

请参阅链接关于ReactJS - Component Life Cycle你应该使用componentWillMount循环。componentWillMount在渲染之前在服务器端和客户端执行。