什么是 prop drilling,如何避免?

2024-06-10 20:52
文章标签 避免 prop drilling

本文主要是介绍什么是 prop drilling,如何避免?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Prop drilling 是在 React 应用中常见的问题,指的是为了将数据从一个顶层组件传递到一个深层嵌套的子组件,不得不经过多个中间组件层层传递 props。虽然这种方法是可行的,但它会导致代码变得冗长、难以维护,并且增加了中间组件的复杂性,因为它们需要传递与自身无关的 props。

示例

考虑一个简单的示例,展示 prop drilling 的问题:

javascript复制代码// 顶层组件
function App() {const user = { name: 'Alice', age: 25 };
​return (<ParentComponent user={user} />);
}
​
// 中间组件
function ParentComponent({ user }) {return (<ChildComponent user={user} />);
}
​
// 深层组件
function ChildComponent({ user }) {return (<div><p>Name: {user.name}</p><p>Age: {user.age}</p></div>);
}

在这个示例中,user prop 从 App 组件传递到 ChildComponent,需要经过 ParentComponent,即使 ParentComponent 并不需要使用 user

避免 Prop Drilling 的方法

  1. Context API: React 的 Context API 提供了一种全局的方式在组件树中共享数据,而不必通过每一级组件传递 props。

    javascript复制代码import React, { createContext, useContext } from 'react';
    ​
    const UserContext = createContext();
    ​
    function App() {const user = { name: 'Alice', age: 25 };
    ​return (<UserContext.Provider value={user}><ParentComponent /></UserContext.Provider>);
    }
    ​
    function ParentComponent() {return <ChildComponent />;
    }
    ​
    function ChildComponent() {const user = useContext(UserContext);return (<div><p>Name: {user.name}</p><p>Age: {user.age}</p></div>);
    }
  2. React Redux: Redux 是一个流行的状态管理库,适用于需要在不同组件之间共享和管理复杂状态的场景。通过 Redux,可以将状态存储在一个全局的 store 中,并通过 connectuseSelectoruseDispatch 访问和更新状态。

    javascript复制代码import { Provider, useSelector, useDispatch } from 'react-redux';
    import { createStore } from 'redux';
    ​
    const initialState = { user: { name: 'Alice', age: 25 } };
    ​
    function reducer(state = initialState, action) {switch (action.type) {// 添加其他 action 处理default:return state;}
    }
    ​
    const store = createStore(reducer);
    ​
    function App() {return (<Provider store={store}><ParentComponent /></Provider>);
    }
    ​
    function ParentComponent() {return <ChildComponent />;
    }
    ​
    function ChildComponent() {const user = useSelector(state => state.user);return (<div><p>Name: {user.name}</p><p>Age: {user.age}</p></div>);
    }
  3. Custom Hooks: 创建自定义 Hook,可以将逻辑封装在 Hook 中,从而避免 prop drilling。

    javascript复制代码import React, { createContext, useContext } from 'react';
    ​
    const UserContext = createContext();
    ​
    function useUser() {return useContext(UserContext);
    }
    ​
    function App() {const user = { name: 'Alice', age: 25 };
    ​return (<UserContext.Provider value={user}><ParentComponent /></UserContext.Provider>);
    }
    ​
    function ParentComponent() {return <ChildComponent />;
    }
    ​
    function ChildComponent() {const user = useUser();return (<div><p>Name: {user.name}</p><p>Age: {user.age}</p></div>);
    }

这篇关于什么是 prop drilling,如何避免?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1049242

相关文章

如何来避免FOUC

FOUC(Flash of Unstyled Content)是指在网页加载过程中,由于CSS样式加载延迟或加载顺序不当,导致页面出现短暂的无样式内容闪烁现象。为了避免FOUC,可以采取以下几种方法: 1. 优化CSS加载 内联CSS:将关键的CSS样式直接嵌入到HTML文档的<head>部分,这样可以确保在页面渲染之前样式就已经加载和应用。提前引入CSS:将CSS文件放在HTML文档的<he

argodb自定义函数读取hdfs文件的注意点,避免FileSystem已关闭异常

一、问题描述 一位同学反馈,他写的argo存过中调用了一个自定义函数,函数会加载hdfs上的一个文件,但有些节点会报FileSystem closed异常,同时有时任务会成功,有时会失败。 二、问题分析 argodb的计算引擎是基于spark的定制化引擎,对于自定义函数的调用跟hive on spark的是一致的。udf要通过反射生成实例,然后迭代调用evaluate。通过代码分析,udf在

Qt: 详细理解delete与deleteLater (避免访问悬空指针导致程序异常终止)

前言 珍爱生命,远离悬空指针。 正文 delete 立即删除:调用 delete 后,对象会立即被销毁,其内存会立即被释放。调用顺序:对象的析构函数会被立即调用,销毁该对象及其子对象。无事件处理:如果在对象销毁过程中还涉及到信号和槽、事件处理等,直接 delete 可能会导致问题,尤其是在对象正在处理事件时。适用场景:适用于在确定对象已经不再被使用的情况下,并且不涉及异步处理或事件循环中的

理解C++全局对象析构顺序与 IPC 资源管理:避免 coredump

文章目录 0. 概述1. 问题背景2. 问题分析3. 解决方案:手动释放资源4. 深入剖析:为什么手动调用 `reset()` 有效?5. 延伸思考:如何避免全局对象带来的问题?6. 总结 0. 概述 在编写 C++ 程序时,使用全局或静态对象有时可能会导致不可预期的崩溃(如 coredump)。这类崩溃通常源于对象的析构顺序、资源的管理方式,以及底层资源(如 IPC 通道或共

真实案例分享:零售企业如何避免销售数据的无效分析?

在零售业务的数据分析中,无效分析不仅浪费时间和资源,还可能导致错误的决策。为了避免这种情况,企业必须采取策略来确保他们的数据分析工作能够产生实际的商业价值。本文将通过行业内真实的案例,探讨零售企业如何通过精心设计的数据策略和分析方法,借助商业智能BI工具,避免销售数据的无效分析,确保每一次分析都能为业务增长提供有力的支持。 文章中提到的BI数据分析工具分享给大家—— https://s.fan

避免Java程序中NullPointerException的技巧和最佳实践

Java应用中抛出的空指针异常是解决空指针的最好方式,也是写出能顺利工作的健壮程序的关键。俗话说“预防胜于治疗”,对于这么令人讨厌的空指针异常,这句话也是成立的。值得庆幸的是运用一些防御性的编码技巧,跟踪应用中多个部分之间的联系,你可以将Java中的空指针异常控制在一个很好的水平上。顺便说一句,这是Javarevisited上的第二个空指针异常的帖子。在上个帖子中我们讨论了Java中导致空指针异

引发蛀牙、避免蛀牙食物大全

引发蛀牙、避免蛀牙食物大全 引发蛀牙的食物大全: 糖果 糖浆 糖果棒 巧克力 碳酸饮料 果汁 口香糖 蜂蜜 蛋糕 甜点 薯片 脆饼干 果酱 果冻 蜜饯 蜜饯果干 避免蛀牙的食物大全: 高纤维蔬菜 水果 坚果 种子 高钙乳制品 高蛋白质肉类 高蛋白质鱼类 绿茶 水 蔬菜汤 鸡汤 酸奶 酸奶制品 奶酪 红薯 土豆 面包和全麦面包 芝士

Java - 通过枚举避免大量 if-else

文章目录 Java - 通过枚举避免大量 if-else前提背景枚举实现1、定义枚举2、代码优化 拓展: Java - 通过枚举避免大量 if-else 前提背景 最近写代码有一个方法需要根据不同的 key 值往 Map 集合里存储 url,代码如下: public static void getUrl(String key, Map<String, String

Kafka 为了避免 Full GC,竟然还在发送端设计了内存池,自己管理内存,太巧妙了...

一、开篇引出一个 Full Gc 的问题 在上一篇文章中,我们讲到了 Kafka 发送消息的八个流程,并且着重讲了 Kafka 封装了一个内存结构,把每个分区的消息封装成批次,缓存到内存里。 如下图所示: 上图中,整体是一个 Map 结构,Map 的 key 是分区,Map 的值是一个队列;队列里有一个个的小批次,里面是很多消息。 这样好处就是可以一次性的把消息发送出去,不至于来一条发送一条,

什么是回流与重绘,如何尽力避免

回流(reflow)和重绘(repaint)是浏览器渲染页面的两个不同过程。 回流概念(reflow) 当我们对 DOM 的修改引发了 DOM 几何尺寸的变化(比如修改元素的宽、高或隐藏元素等)时,浏览器需要重新计算元素的几何属性(其他元素的几何属性和位置也会因此受到影响),然后再将计算的结果绘制出来。这个过程就是回流(也叫重排)。【重新排列布局,即打碎重组】 重绘概念(repaint)