首页 文章详情

字节面试官:使用React hooks如何让下面的子组件只render一次?

前端人 | 516 2021-05-05 09:33 0 0 0
UniSMS (合一短信)


关注公众号 前端人,回复“加群

添加无广告优质学习群



大家好,我是鬼哥,又是今天的每日一题时间了,今天这道题是字节的一套面试题中的第八题,欢迎关注我们,后续每天会以试卷的形式分享大厂的面试题!

代码大致如下,子组件有自己的状态但受父组件的控制,当父组件count更新的时候,需要将子组件的number和父组件的count保持同步,但是使用useEffect和useMemo都会让子组件render两次,有什么方法可以只render一次吗?

import React, { useEffect, useMemo, useState } from 'react'

function A({
  const [count, setCount] = useState(0)

  return <div>
    <p>我是父组件</p>
    <p>父组件的count是{count}</p>
    <button onClick={() => setCount(count + 1)}>click</button>
    <B count={count} />
  </div>

}

const B = React.memo(({count}: {count: number}) => {
  const [number, setNumber] = useState(0)
  useMemo(() => {
    setNumber(count)
  }, [count])

  console.log('子组件render')
  return <div>
    <p>我是子组件</p>
    <p>子组件的number是{number}</p>
    <button onClick={() => setNumber(number + 1)}>click</button>
  </div>

})

export default A

解析

import React, { useEffect, useMemo, useState, useRef } from 'react';
function A({
    const [count, setCount] = useState(0);

    return (
        <div>
            <p>我是父组件</p>
            <p>父组件的count是{count}</p>
            <button onClick={() => setCount(count + 1)}>click</button>
            <B count={count} />
        </div>

    );
}

const B = React.memo(({ count }: { count: number }) => {
    const numberRef = useRef(0);
    const [, update] = useState({});
    const updateNumber = () => {
        numberRef.current++;
        update({});
    };

    useMemo(() => {
        numberRef.current = count;
    }, [count]);

    console.log('子组件render');

    return (
        <div>
            <p>我是子组件</p>
            <p>子组件的number是{numberRef.current}</p>
            <button onClick={updateNumber}>click</button>
        </div>

    );
});

使用useRef保存子组件状态,当父组件更新时,直接更新ref值;当子组件click时,在更新ref值后,再调用一次update触发子组件渲染。

在线示例:

  • https://codesandbox.io/s/headless-dawn-vvyu9

参考资料

  • https://www.zhihu.com/people/qiqiboy-81
  • https://www.zhihu.com/question/444068787
  • https://www.zhihu.com/question/444068787/answer/1739616037


当前题目进度:字节面试一卷[08/20]题,大家记得来打卡学习

公众号里回复关键词加群,加入前端进阶群

坚持不易,希望能够帮助到一部分人,多谢帮忙一键三连

点击关注我们↓

套卷所有题目都在这个题库小程序↓

good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter