我的网站开发技术经验总结 我的网站开发技术经验总结
首页

fangdown

我的网站开发技术经验总结
首页
  • 日记
  • 22
  • 05
fangdown
2022-05-13
目录

React组件内不可定义组件的问题

# 子组件重复渲染问题

# 场景

在一个react组件中, 有几个子组件, 当我点击其中一个子组件时,不希望另外的子组件重新渲染

const Child1 = (props) => {
    const { onClick } = props;
    return <Button onClick={onClick}>点击</Button>;
};
const Child2 = React.memo(() => {
    console.log('Child2');
    return <div>Child2</div>;
});

const Demo = () => {
    const [count, setCount] = useState(0);
    const Header = () => {
        return (
            <>
                <Child2 />
                <Child1 onClick={() => setCount(count + 1)} />
            </>
        );
    };
    return (
        <div>
            <Header />
            count: {count}
        </div>
    );
};

上述代码中触发Child1点击事件, 会引起Child2的重新渲染,咋一看,代码好像没什么问题,为什么重复渲染呢?你知道其中的原因吗?

# 分析

# React.memo

Child2组件包裹了React.memo, 理论上是不会重新渲染的

# 最简单应用


const Demo = () => {
    const [count, setCount] = useState(0);
    return (
        <div>
            <Child2 />
            <Child1 onClick={() => setCount(count + 1)} />
            count: {count}
        </div>
    );
};

验证发现,Child2没有触发重新渲染, 问题应该是在Header组件上了。

分析一下结构, Demo组件里,定义了Header组件, Header组件可以共享头部的公用变量和方法了,看似简单了, 其实埋下了隐患

组件里定义了组件,那么造成后组件里的Reat.memo失效, 重新组织一下

# 解决

重新梳理组件结构

const Child1 = (props) => {
    const { onClick } = props;
    return <Button onClick={onClick}>点击</Button>;
};
const Child2 = () => {
    console.log('Child2');
    return <div>Child2</div>;
};
const Header = (props) => {
    const { onClick } = props;
    return (
        <>
            <Child2 />
            <Child1 onClick={onClick} />
        </>
    );
};
const Memo = () => {
    const [count, setCount] = useState(0);
    return (
        <div>
            <Header onClick={() => setCount(count + 1)} />
            count: {count}
        </div>
    );
};

# 总结

  • 组件内部可以调用其他组件
  • 组件内部避免新创建子组件e
上次更新: 2022/05/13, 15:33:11
最近更新
01
多分支修复撞车的问题
05-01
02
如何成为架构师
01-23
03
服务器部署全过程
11-23
更多文章>
Theme by Vdoing | Copyright © 2019-2026 fangdown | 粤ICP备19079809号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式