reactjs - 由于 React.StrictMode 导致问题,React 组件被调用两次
问题描述
我有一个在渲染时被调用两次的组件。我从阅读中假设这是由于,React.StrictMode
但我实际上不确定。使用标签调用组件
<UserPlaylist sortMode="new" tracks={this.state.items}/>
wherethis.state.items
是一个包含要在UserPlaylist
组件中映射的数据的大对象。
用户播放列表组件:
import React, { Component } from 'react'
import Track from '../components/track'
export default class UserPlaylist extends Component {
async componentDidMount() {
const sortMode = this.props.sortMode
const tracks = this.props.tracks
this.setState({
sortMode,
tracks
});
}
render() {
const mode = this.props.sortMode
if(mode === "new"){
console.log("sortMode:","new");
return(
<>
{this.state.items.map(track => <Track key={track.id} trackObj={track}/>) }
</>
)
}
else{
console.log("sortMode:",mode);
return(
<>
{this.state.items.map(track => <Track key={track.id} trackObj={track}/>) }
</>
)
}
}
}
问题在于 react 似乎试图在this.state.items
定义之前渲染一次。导致UserPlaylist
组件尝试映射undefined
项目。
为什么会这样?我应该做什么?这是编写可排序组件的最佳方式吗?
PS他们现在都故意返回相同的东西。在实践中,该new
模式将返回相同的数组但相反。我还计划添加一些其他“模式”。
解决方案
您尚未显示设置items
状态的部分。(它应该使用tracks
状态吗?)但是假设正在某处完成,我认为您的代码大部分都很好,而且通常这是进行排序列表的好方法。
对于尚未初始化状态null
的情况,我建议添加一种“正在加载”视图(或仅使用 不渲染)。items
例如:
render() {
if (!this.state.items) {
return null;
}
const mode = this.props.sortMode
if(mode === "new"){
console.log("sortMode:","new");
return(
<>
{this.state.items.map(track => <Track key={track.id} trackObj={track}/>) }
</>
)
}
else{
console.log("sortMode:",mode);
return(
<>
{this.state.items.map(track => <Track key={track.id} trackObj={track}/>) }
</>
)
}
}
推荐阅读
- haskell - 实例化 Num 时 Haskell“冲突定义”
- javascript - 无法在应用程序之外导航
- python - 导入 Dash 模块会更改 .csv 文件
- python - 有没有办法用 Python 跟踪变量 ID?
- javascript - 什么是 JavaScript 中的差异继承
- php - 如何从变量中的字符串中删除斜杠?
- regex - 如何在 Google Data Studio 中提取特定文本?
- c++ - 如何在 C++ 中映射多个值?
- javascript - 在 AngularJS 模态模板中显示更多和隐藏细节
- google-sheets - 将 Google 表格列拆分为行 - 忽略任何空白