0

我有这个 React.memo 组件,只有在发送第二个参数 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
4

1 回答 1

0

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

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>

于 2019-11-27T12:49:12.483 回答