reactjs - 使用react-hooks仅重新渲染一个 child

标签 reactjs react-hooks

const {useRef, useState} = React;

function List(){
  const renderCount = useRef(0);
  console.log('<List /> is rendered', ++renderCount.current);
  const [isClicked, setIsClicked] = useState(false);
  const toggle = () => setIsClicked(!isClicked)
  return (
    <div>
      <ButtonA onClick={toggle} isClicked={isClicked} />
      <ButtonB />
    </div>
  )
}

function ButtonA(props){
  const renderCount = useRef(0);
  console.log('<ButtonA /> is rendered', ++renderCount.current);

  return (<button onClick={props.onClick} className={`${props.isClicked ? 'true':'false'}`} >Button A</button>);
}

function ButtonB(){
  const renderCount = useRef(0);
  console.log('<ButtonB /> is rendered', ++renderCount.current);
  
  return (<button>Button B </button>);
}


ReactDOM.render(
  <List />, document.getElementById('root')
)
button.true{
  background-color: red;
}

button.false{
  background-color: blue;
  
  }
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div id="root"></div>

这是一个示例代码。

当我点击<ButtonA />时,我期望重新渲染 <List /><Button A/> ,但是<ButtonB />也被重新渲染。

我想阻止重新渲染 <ButtonB />当我点击<ButtonA />

我怎样才能实现它?

最佳答案

您可以利用 React.memo 获得与功能组件的 shouldComponentUpdate 相同的功能

const {useRef, useState} = React;

function List(){
  const renderCount = useRef(0);
  console.log('<List /> is rendered', ++renderCount.current);
  const [isClicked, setIsClicked] = useState(false);
  const toggle = () => setIsClicked(!isClicked)
  return (
    <div>
      <ButtonA onClick={toggle} isClicked={isClicked} />
      <ButtonB />
    </div>
  )
}

function ButtonA(props){
  const renderCount = useRef(0);
  console.log('<ButtonA /> is rendered', ++renderCount.current);

  return (<button onClick={props.onClick} className={`${props.isClicked ? 'true':'false'}`} >Button A</button>);
}

const ButtonB = React.memo(() => {
  const renderCount = useRef(0);
  console.log('<ButtonB /> is rendered', ++renderCount.current);
  
  return (<button>Button B </button>);
})


ReactDOM.render(
  <List />, document.getElementById('root')
)
button.true{
  background-color: red;
}

button.false{
  background-color: blue;
  
  }
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div id="root"></div>

关于reactjs - 使用react-hooks仅重新渲染一个 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56422903/

相关文章:

javascript - React 风格的组件在生产中导致构建错误,但在开发中运行良好

javascript - 在 React 中 setState() 类对象的最佳实践是什么?

javascript - 你应该将 setter 函数传递到 React 钩子(Hook)的依赖数组中吗?

css - 事件触发样式的组件CSS更改

javascript - react 导航 TabNavigator : Reset previous tab on tab change

javascript - 当我安装 react-zoom-pan-pinch 时,它不包含 src 文件夹,并且在构建时出现错误

javascript - 'useState' 未定义 no-undef React

javascript - 处理页面刷新和前进/后退功能

javascript - 我应该在哪里声明在 useEffect() Hook 中调用的函数?

javascript - 循环遍历数组以过滤对象数组