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

时间:2019-02-01 06:26:27

标签: javascript reactjs redux redux-saga immutable.js

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>
    );
}

2 个答案:

答案 0 :(得分: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
        }
    }

答案 1 :(得分:0)

我发现两次调用ListFolders的原因。 我在ListFolders内使用SidebarComponent,在Sidebar中,我使用了Material-ui hidden帮助程序来访问桌面和移动菜单。下面的示例代码。

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

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

由于ListFolders甚至会多次提取数据。 我认为我将使用纯CSS处理移动菜单。