即使在获取数据后,React Component的render方法也会被调用两次

问题描述 投票:0回答:2

ListFolders是一个React组件。并且“文件夹”数据支持从MainLayout组件传递给此组件。

MainLayout组件使用redux connect并获取“文件夹”。

在这里,我在ListFolders内部的问题,列出文件夹时有一些映射和计算。因此,因为第二次调用需要更多时间,这是一个重要的性能问题。

以下基本示例。我正在使用redux-sagaimmutable.js。我得到name (ContainerDesc)id (IdEncrypted)haveChildFolderschildFolders

在这里,它进入if (folders !== undefined) { ...代码块内部两次。

render() {
    const { classes, folders } = this.props;

    let reactListItems = [];
    if (folders !== undefined) {

        var iterator1 = folders[Symbol.iterator]();

        for (let item of iterator1) {

            reactListItems.push({ 
                'name': item.get('ContainerDesc'), 
                'id': item.get('IdEncrypted'),
                'haveChildFolders' : item.get('ChildContainers').size > 0,
                'childFolders': item.get('ChildContainers')
            })

        }
    }

    return (
        <List classes={{ root: classes.list, }}>
            ...
        </List>
    );
}
javascript reactjs redux redux-saga immutable.js
2个回答
1
投票

对于第二次调用,文件夹数据可能没有更改,可能没有未定义,因此在componentWillReceiveProps()中添加一个检查文件夹数据是否已更改的条件:

componentWillReceiveProps(nextProps){    
     if (folders.length !== nextProps.folders.length) {
       return ...
    }
}

或者您可以添加条件shouldComponentUpdate()并停止组件以在不满足条件时更新

shouldComponentUpdate(nextProps){    
         if (folders.length !== nextProps.folders.length) {
           return true
        }
        else{
          return false
        }
    }

0
投票

我发现ListFolders被叫两次的原因。我在ListFoldersSidebarComponent中使用Sidebar我使用了材料-ui hidden助手用于桌面和移动菜单。示例代码如下。

<Hidden mdUp implementation="css">
   ...
   <Drawer variant="temporary" ... /* Sidebar Drawer */
</Hidden>

<Hidden smDown implementation="css">
   ...
   <Drawer variant="temporary" ... /* Sidebar Drawer */
</Hidden>

因为ListFolders甚至多次渲染数据。我会用纯css处理移动菜单。

© www.soinside.com 2019 - 2024. All rights reserved.