react context如何使用

1. 创建Context

首先,你需要创建一个Context对象。这可以通过React.createContext方法完成。

复制代码
// src/MyContext.js
import React from 'react';

const MyContext = React.createContext();

export default MyContext;

2. 提供Context值

使用Context.Provider组件来提供上下文值。你可以将Context.Provider包裹在需要访问上下文的组件树的顶部,并通过value属性传递需要共享的数据。

复制代码
// src/App.js
import React from 'react';
import MyContext from './MyContext';
import ChildComponent from './ChildComponent';

function App() {
  const sharedData = {
    name: 'Kimi',
    age: 25
  };

  return (
    <MyContext.Provider value={sharedData}>
      <ChildComponent />
    </MyContext.Provider>
  );
}

export default App;

3. 使用useContext Hook

在需要访问上下文的组件中,使用useContext Hook来获取上下文值。

复制代码
// src/ChildComponent.js
import React, { useContext } from 'react';
import MyContext from './MyContext';

function ChildComponent() {
  const { name, age } = useContext(MyContext);

  return (
    <div>
      <p>Name: {name}</p>
      <p>Age: {age}</p>
    </div>
  );
}

export default ChildComponent;

4. 使用useContextuseState结合

你也可以结合useState来更新上下文值。例如,你可以在Context.Provider中使用useState来管理状态,并通过value属性传递状态和更新状态的函数。

复制代码
// src/App.js
import React, { useState } from 'react';
import MyContext from './MyContext';
import ChildComponent from './ChildComponent';

function App() {
  const [sharedData, setSharedData] = useState({
    name: 'Kimi',
    age: 25
  });

  return (
    <MyContext.Provider value={{ sharedData, setSharedData }}>
      <ChildComponent />
    </MyContext.Provider>
  );
}

export default App;

5. 在子组件中更新上下文值

在子组件中,你可以使用setSharedData来更新上下文值。

复制代码
// src/ChildComponent.js
import React, { useContext } from 'react';
import MyContext from './MyContext';

function ChildComponent() {
  const { sharedData, setSharedData } = useContext(MyContext);

  const handleUpdate = () => {
    setSharedData({
      ...sharedData,
      age: sharedData.age + 1
    });
  };

  return (
    <div>
      <p>Name: {sharedData.name}</p>
      <p>Age: {sharedData.age}</p>
      <button onClick={handleUpdate}>Increment Age</button>
    </div>
  );
}

export default ChildComponent;

6. 使用useReducerContext

如果你需要更复杂的状态管理逻辑,可以结合useReducerContext。例如:

复制代码
// src/MyContext.js
import React, { useReducer } from 'react';

const initialState = {
  name: 'Kimi',
  age: 25
};

const reducer = (state, action) => {
  switch (action.type) {
    case 'INCREMENT_AGE':
      return { ...state, age: state.age + 1 };
    default:
      return state;
  }
};

const MyContext = React.createContext();

export const MyContextProvider = ({ children }) => {
  const [state, dispatch] = useReducer(reducer, initialState);

  return (
    <MyContext.Provider value={{ state, dispatch }}>
      {children}
    </MyContext.Provider>
  );
};

export default MyContext;

7. 在子组件中使用useReducerContext

在子组件中,你可以使用dispatch来更新状态。

复制代码
// src/ChildComponent.js
import React, { useContext } from 'react';
import MyContext from './MyContext';

function ChildComponent() {
  const { state, dispatch } = useContext(MyContext);

  const handleIncrement = () => {
    dispatch({ type: 'INCREMENT_AGE' });
  };

  return (
    <div>
      <p>Name: {state.name}</p>
      <p>Age: {state.age}</p>
      <button onClick={handleIncrement}>Increment Age</button>
    </div>
  );
}

export default ChildComponent;

8. 提供Context

确保在顶层组件中使用MyContextProvider来提供上下文。

复制代码
// src/App.js
import React from 'react';
import MyContextProvider from './MyContext';
import ChildComponent from './ChildComponent';

function App() {
  return (
    <MyContextProvider>
      <ChildComponent />
    </MyContextProvider>
  );
}

export default App;
相关推荐
消失的旧时光-19435 分钟前
401 自动刷新 Token 的完整架构设计(Dio 实战版)
开发语言·前端·javascript
console.log('npc')18 分钟前
Table,vue3在父组件调用子组件columns列的方法展示弹窗文件预览效果
前端·javascript·vue.js
用户479492835691526 分钟前
React Hooks 的“天条”:为啥绝对不能写在 if 语句里?
前端·react.js
我命由我123451 小时前
SVG - SVG 引入(SVG 概述、SVG 基本使用、SVG 使用 CSS、SVG 使用 JavaScript、SVG 实例实操)
开发语言·前端·javascript·css·学习·ecmascript·学习方法
用户47949283569151 小时前
给客户做私有化部署,我是如何优雅搞定 NPM 依赖管理的?
前端·后端·程序员
C_心欲无痕1 小时前
vue3 - markRaw标记为非响应式对象
前端·javascript·vue.js
qingyun9892 小时前
深度优先遍历:JavaScript递归查找树形数据结构中的节点标签
前端·javascript·数据结构
胡楚昊2 小时前
NSSCTF动调题包通关
开发语言·javascript·算法
熬夜敲代码的小N2 小时前
Vue (Official)重磅更新!Vue Language Tools 3.2功能一览!
前端·javascript·vue.js
90后的晨仔2 小时前
用 Python 脚本一键重命名序列帧图片的名称
前端