【问题标题】:React memo function with isEqual使用 isEqual 反应备忘录功能
【发布时间】:2020-03-23 00:08:42
【问题描述】:

我有这个 React.memo 组件,我只想在 props 不因发送第二个参数 isEqual 函数而改变的情况下才渲染它。 当我 console.log 包装组件和 memmoized 组件时,我可以看到它使用相同的道具呈现。我做错了什么?

我的包装组件

export const WrapperComponent= props => {
    console.log('MemoizeComponent', props);
    return (
       <MemoizeComponent name="memo"/>
    );
}

export const WrapperComponent;

我的记忆组件

export const Component = props => {
    console.log('component: ', props.name)
    return (
       <div>{props.name}</div>
    );
}

function isEqual(prevProps, nextProps) {
    console.log(prevProps.name);
    console.log(nextProps.name);
    return prevProps.name === nextProps.name;
};

export const MemoizeComponent = React.memo(Component, isEqual);

控制台输出:

memo
memo
component:memo
memo
memo
component:memo

【问题讨论】:

  • I want to render only if the props doesn't change with sending a second argument isEqual function 这听起来与React.memo 的做法相反——如果道具没有改变,则防止重新渲染。

标签: reactjs memo


【解决方案1】:

不确定您的问题是什么,但您的代码可以正常工作:

const { useState, memo, useRef } = React;
const useRendered = () => {
  const rendered = useRef(0);
  rendered.current++;
  return rendered.current;
};
function App() {
  const [, setRender] = useState();
  const rendered = useRendered();
  return (
    <div>
      <div>rendered {rendered} times</div>
      <button onClick={() => setRender({})}>
        re render
      </button>
      <WrapperComponent name="memo" />
    </div>
  );
}

const WrapperComponent = props => {
  return <MemoizeComponent name="memo" />;
};
const Component = props => {
  const rendered = useRendered();
  return (
    <div>
      {props.name} rendered {rendered} times
    </div>
  );
};

function isEqual(prevProps, nextProps) {
  return prevProps.name === nextProps.name;
}

const MemoizeComponent = memo(Component, isEqual);

ReactDOM.render(<App />, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<div id="root"></div>

【讨论】:

  • 如果包装组件再次渲染。即使 props.name 没有改变,它是否会再次渲染 memmoized 组件?
  • @LilacEilim 包装器将始终重新渲染,因为它是一个功能组件。传递给 React.memo 的组件只有在 props 改变时才会重新渲染,你可以在示例中看到
猜你喜欢
  • 1970-01-01
  • 2021-08-05
  • 2021-03-10
  • 1970-01-01
  • 2020-09-28
  • 2020-10-04
  • 2023-01-17
  • 2020-07-05
  • 1970-01-01
相关资源
最近更新 更多