【问题标题】:Prevent Re-Render With Modifications to Parent State通过修改父状态防止重新渲染
【发布时间】:2020-05-01 19:59:51
【问题描述】:

如何修改父组件中的状态,并将其作为 props 传递给子组件,但仅在修改后的状态更改时重新渲染这些子组件?

我的基本设置目前有效,但会导致一些不必要的重新渲染。父组件从 URL 获取信息(使用 react-router 钩子)并修改它,然后将其作为 props 传递给它的子组件。该组件如下所示:

 const myComponent = () => {

    const { dataType } = useParams();
    const { search } = useLocation();

    /// These functions help me transform that data into something more manageable
    const y = queryString.parse(search).collection;
    const { collections, gqlQuery } = getCollections(dataType);
    const collection = collections.find(x => x.value === y);

    return (
     <MyChild collection={collection} /> ... This component is re-rendering unnecessarily.
    )



};

如何确保当 URL 不变时(使用 react-router 提取的 dataTypesearch 值)接收派生数据的子组件也不会不必要地重新呈现?

【问题讨论】:

    标签: javascript reactjs react-router react-hooks


    【解决方案1】:

    第一步是确保对collection 变量的引用仅在其中一个依赖项发生更改时更改:

    useMemo(() => {
      const y = queryString.parse(search).collection;
      const { collections, gqlQuery } = getCollections(dataType);
      const collection = collections.find(x => x.value === y);
    }, [search, dataType]);
    

    第二个是确保组件仅在收到新道具时重新渲染:

    import { memo } from 'react';
    
    function Child() {
    
    }
    
    export default memo(Child);
    

    您还可以使用 memo 的第二个参数来自定义比较的内容。

    function Child(props) {
    
    }
    function areEqual(prevProps, nextProps) {
      /*
      return true if passing nextProps to render would return
      the same result as passing prevProps to render,
      otherwise return false
      */
    }
    export default React.memo(Child, areEqual);
    

    React.memo - Docs React.useMemo - Docs

    PS:请注意,React 通常在重新渲染时速度非常快。仅在衡量其影响后将其用作性能增强。有机会worse performance than before

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-24
      • 2019-01-08
      • 2018-10-18
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-12
      • 2020-10-20
      相关资源
      最近更新 更多