react context 跨组件层级传递数据

在 React 里,Context 是一种能跨组件层级传递数据的方式,无需在每个层级都手动传递 props。下面是一个简单示例,展示了怎样用 React Context 跨组件层级传递数据。

APP.js

import React, { createContext, useContext, useState } from 'react';

// 创建一个 Context 对象
const UserContext = createContext();

// 定义一个组件来提供上下文数据
const UserProvider = ({ children }) => {
    const [user, setUser] = useState({ name: 'John Doe', age: 30 });

    return (
        <UserContext.Provider value={{ user, setUser }}>
            {children}
        </UserContext.Provider>
    );
};

// 定义一个深层嵌套的组件,它将使用上下文数据
const DeeplyNestedComponent = () => {
    const { user } = useContext(UserContext);

    return (
        <div>
            <h2>User Information</h2>
            <p>Name: {user.name}</p>
            <p>Age: {user.age}</p>
        </div>
    );
};

// 定义一个中间组件
const MiddleComponent = () => {
    return (
        <div>
            <DeeplyNestedComponent />
        </div>
    );
};

// 主应用组件
const App = () => {
    return (
        <UserProvider>
            <div>
                <h1>React Context Example</h1>
                <MiddleComponent />
            </div>
        </UserProvider>
    );
};

export default App;    

index.js

import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);    
### React 中 A 组件跨层级通信的方式 #### 使用回调函数递 一种常见的做法是在公共的父组件中定义回调函数,并将其作为属性递给子组件。这种方式适用于父子关系明确的情况。 ```jsx // Parent.js import React, { useState } from 'react'; import Child from './Child'; function Parent() { const [message, setMessage] = useState('初始消息'); function handleMessage(newMsg) { setMessage(newMsg); } return ( <div> <h1>来自子组件的消息: {message}</h1> <Child onMessage={handleMessage} /> </div> ); } export default Parent; // Child.js const Child = ({onMessage}) => { return ( <button onClick={() => onMessage('新消息')}>发送消息</button> ) } ``` 这种方法简单直观,但在多层嵌套时会变得繁琐[^1]。 #### 利用 Context API 进行状态管理 对于更复杂的应用场景,推荐使用 `Context` 来共享全局的状态或配置项。这允许任何后代组件访问这些信息而无需显式地一层层向下参。 ```jsx // ThemeContext.jsx import React, { createContext, useContext, useState } from 'react'; const ThemeContext = createContext(); function App() { const [theme, setTheme] = useState('light'); return ( <ThemeContext.Provider value={{ theme, setTheme }}> {/* 子孙组件 */} </ThemeContext.Provider> ); } function ThemedButton() { const { theme, setTheme } = useContext(ThemeContext); return ( <> 当前主题:{theme}<br/> <button onClick={() => setTheme(theme === 'dark' ? 'light' : 'dark')}> 切换主题 </button> </> ); } ``` 此方案特别适合处理如主题切换这类贯穿整个应用的需求[^3]。 #### Redux 状态管理模式 当应用程序变得更加庞大且涉及多个不相邻组件间的交互时,采用集中式的状态管理系统如Redux可能是更好的选择。通过将组件所需的数据存储在一个中心仓库里,各个地方都可以方便地读取和更新它。 ```javascript // store.js import { configureStore } from '@reduxjs/toolkit'; import commReducer from '../features/commSlice'; export const store = configureStore({ reducer: { componentsComm: commReducer, }, }); // AnyComponent.jsx import React from 'react'; import { useSelector, useDispatch } from 'react-redux'; import { updateMessage } from '../features/commSlice'; function AnyComponent() { const dispatch = useDispatch(); const message = useSelector((state) => state.componentsComm.message); return ( <div> <p>{message}</p> <button onClick={() => dispatch(updateMessage('新的通知'))}> 更新通知 </button> </div> ); } ``` 这种模式非常适合大型项目中的状态管理和维护[^2].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值