首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用isEqual实现React memo函数

使用isEqual实现React memo函数
EN

Stack Overflow用户
提问于 2019-11-27 20:21:45
回答 1查看 1.3K关注 0票数 0

我有一个React.memo组件,我只想在发送第二个参数isEqual函数时属性不变的情况下呈现它。当我console.log包装器组件和memmoized组件时,我可以看到它是用相同的道具呈现的。我做错了什么?

我的包装器组件

代码语言:javascript
复制
export const WrapperComponent= props => {
    console.log('MemoizeComponent', props);
    return (
       <MemoizeComponent name="memo"/>
    );
}

export const WrapperComponent;

我的memmoized组件

代码语言:javascript
复制
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);

控制台输出:

代码语言:javascript
复制
memo
memo
component:memo
memo
memo
component:memo
EN

回答 1

Stack Overflow用户

发布于 2019-11-27 20:49:12

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

代码语言:javascript
复制
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'));
代码语言:javascript
复制
<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>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59070140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档