React數(shù)據(jù)傳遞的六種方式詳解
引言
“在 React 開發(fā)中,組件之間的數(shù)據(jù)傳遞就像現(xiàn)實中的聊天——父子組件可以直接對話,兄弟組件需要‘中介’,而跨層級組件可能得靠‘廣播’。今天,我就結合 6 年實戰(zhàn)經驗,帶大家解鎖 React 組件通信的 6 種姿勢,讓你徹底告別‘數(shù)據(jù)孤島’!”
1. 父子組件:props 直傳(最基礎)
場景:父組件向子組件傳遞數(shù)據(jù)或函數(shù)。
// 父組件
const Parent = () => {
const [message, setMessage] = useState("Hello from Parent!");
return <Child greeting={message} />;
};
// 子組件
const Child = ({ greeting }) => {
return <h1>{greeting}</h1>; // 直接使用父組件傳遞的 props
};
我的吐槽:
“這就像老爸直接給兒子零花錢,簡單粗暴,但兒子沒法主動要錢(子組件不能反向傳數(shù)據(jù))。”
2. 子傳父:回調函數(shù)(Callback)
場景:子組件通過父組件傳遞的函數(shù)“逆向”通信。
// 父組件
const Parent = () => {
const handleChildClick = (data) => {
console.log("子組件說:", data); // 接收子組件數(shù)據(jù)
};
return <Child onClick={handleChildClick} />;
};
// 子組件
const Child = ({ onClick }) => {
return <button onClick={() => onClick("I'm Child!")}>點我傳數(shù)據(jù)</button>;
};
我的心得:
“這種方式適合簡單的交互,比如表單提交。但如果層級太深,props 會變成‘擊鼓傳花’,代碼容易變亂。”
3. 兄弟組件:狀態(tài)提升(Lifting State Up)
場景:兩個兄弟組件共享父組件的狀態(tài)。
// 父組件
const Parent = () => {
const [count, setCount] = useState(0);
return (
<>
<SiblingA count={count} />
<SiblingB onUpdate={() => setCount(count + 1)} />
</>
);
};
// 兄弟組件 A(顯示數(shù)據(jù))
const SiblingA = ({ count }) => <div>當前計數(shù):{count}</div>;
// 兄弟組件 B(修改數(shù)據(jù))
const SiblingB = ({ onUpdate }) => <button onClick={onUpdate}>+1</button>;
我的比喻:
“這就像兩兄弟共用老爸的支付寶賬號——花錢(SiblingB)和查余額(SiblingA)都得通過老爸(Parent)。”
4. 跨層級組件:Context API
場景:避免多層 props 透傳,實現(xiàn)“隔代通信”。
// 創(chuàng)建 Context
const ThemeContext = createContext("light");
// 祖父組件
const Grandparent = () => {
return (
<ThemeContext.Provider value="dark">
<Parent />
</ThemeContext.Provider>
);
};
// 孫子組件(跳過 Parent)
const Grandchild = () => {
const theme = useContext(ThemeContext);
return <div>當前主題:{theme}</div>; // 直接拿到祖父的數(shù)據(jù)
};
我的提醒:
“Context 適合全局主題、用戶信息等低頻更新數(shù)據(jù)。頻繁更新的值用 Context 可能導致性能問題!”
5. 任意組件:事件總線(Event Bus)
場景:完全不相關的組件間通信,類似“廣播”。
// 事件總線(可以用 mitt 或自定義)
const eventBus = new EventEmitter();
// 組件 A(發(fā)布事件)
const ComponentA = () => {
const emitEvent = () => eventBus.emit("alert", "我是組件A發(fā)的消息!");
return <button onClick={emitEvent}>發(fā)布事件</button>;
};
// 組件 B(訂閱事件)
const ComponentB = () => {
const [message, setMessage] = useState("");
useEffect(() => {
eventBus.on("alert", setMessage);
return () => eventBus.off("alert", setMessage);
}, []);
return <div>收到消息:{message}</div>;
};
我的警告:
“事件總線雖然靈活,但容易導致代碼難以維護。慎用,除非你真的需要‘廣播’!”
6. 全局狀態(tài)管理:Redux / Zustand
場景:復雜應用需要集中管理狀態(tài)。
// 以 Zustand 為例
import { create } from "zustand";
// 創(chuàng)建 store
const useStore = create((set) => ({
user: null,
login: (name) => set({ user: name }),
}));
// 組件 A(修改狀態(tài))
const ComponentA = () => {
const login = useStore((state) => state.login);
return <button onClick={() => login("小楊")}>登錄</button>;
};
// 組件 B(讀取狀態(tài))
const ComponentB = () => {
const user = useStore((state) => state.user);
return <div>當前用戶:{user || "未登錄"}</div>;
};
我的選擇:
“Redux 適合大型項目,但學習成本高。個人更推薦 Zustand,API 簡單,夠用!”
寫在最后?
到此這篇關于React數(shù)據(jù)傳遞的六種方式詳解的文章就介紹到這了,更多相關React數(shù)據(jù)傳遞內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
webpack+react+antd腳手架優(yōu)化的方法
本篇文章主要介紹了webpack+react+antd腳手架優(yōu)化的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04
React??memo允許你的組件在?props?沒有改變的情況下跳過重新渲染的問題記錄
使用?memo?將組件包裝起來,以獲得該組件的一個?記憶化?版本,只要該組件的?props?沒有改變,這個記憶化版本就不會在其父組件重新渲染時重新渲染,這篇文章主要介紹了React??memo允許你的組件在?props?沒有改變的情況下跳過重新渲染,需要的朋友可以參考下2024-06-06
詳解React?如何防止?XSS?攻擊論$$typeof?的作用
這篇文章主要介紹了詳解React?如何防止?XSS?攻擊論$$typeof?的作用,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-07-07
react-router中Link標簽和a標簽有什么區(qū)別
本文主要介紹了react-router中Link標簽和a標簽有什么區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-06-06
React中useEffect原理的代碼簡單實現(xiàn)詳解
React的useEffect鉤子是React函數(shù)組件中處理副作用,本文將通過一個簡單的例子解釋如何用代碼實現(xiàn)useEffect的基本原理,感興趣的小伙伴可以了解下2023-12-12
React如何使用錯誤邊界(Error Boundaries)捕獲組件錯誤
在 React 里,錯誤邊界就像是一個“小衛(wèi)士”,專門負責在組件出現(xiàn)錯誤時挺身而出,避免整個應用因為一個小錯誤就崩潰掉,下面小編就來為大家介紹一下如何利用它捕獲組件錯誤吧2025-03-03

