Page Context 设计 | React.createContext 入门

前言

React 是一种流行的 JavaScript 库,用于构建用户界面。它提供了一种组件化的开发方式,使得前端开发变得更加简单和可维护。在 React 中,组件之间的数据传递是非常重要的,而 React 提供了多种方式来处理这种数据传递,其中包括 Context API。本文将重点介绍 React 中的 React.createContext 方法,这是使用 Context API 的第一步。

什么是 Context API?

在 React 应用程序中,有时候需要在组件之间共享某些数据,而不必通过一层层的传递 props。这时就可以使用 Context API。它提供了一种在组件树中传递数据的方法,而不必手动地通过 props 层层传递。这样可以使得组件之间的数据共享变得更加简单和便捷。

React.createContext 方法

React.createContext 是 Context API 的一部分,它用于创建一个 Context 对象。这个对象包含了两个组件:ProviderConsumer

1. 创建一个 Context 对象

js 复制代码
const MyContext = React.createContext(defaultValue);

React.createContext 接受一个参数 defaultValue,表示当组件在树中没有找到对应的 Provider 时,所采用的默认值。这个默认值在没有 Provider 包裹时会被用到。

2. Provider

Provider 组件用于向下传递当前的 Context 值。它接受一个 value 属性,这个属性的值可以是任何 JavaScript 对象。

js 复制代码
<MyContext.Provider value={/* 某个值 */}>
  {/* 子组件 */}
</MyContext.Provider>

3. Consumer

Consumer 组件用于从上层 Context 中读取当前的值。它是一个函数组件,接受一个函数作为其子元素。这个函数接受当前的 Context 值作为参数,并返回一个 React 元素。

js 复制代码
<MyContext.Consumer>
  {value => /* 基于 context 值进行渲染 */}
</MyContext.Consumer>

示例

下面是一个简单的示例,演示了如何使用 React.createContext 方法:

jsx 复制代码
// 创建一个 Context 对象
const ThemeContext = React.createContext('light');

class App extends React.Component {
  render() {
    return (
      // 提供一个 ThemeContext.Provider,并设置 value 为 dark
      <ThemeContext.Provider value="dark">
        {/* 渲染子组件 */}
        <Toolbar />
      </ThemeContext.Provider>
    );
  }
}

function Toolbar() {
  // 使用 ThemeContext.Consumer 获取当前的 theme 值
  return (
    <ThemeContext.Consumer>
      {theme => (
        <div style={{ backgroundColor: theme === 'dark' ? '#333' : '#fff', color: theme === 'dark' ? '#fff' : '#333' }}>
          {/* 根据 theme 渲染不同的内容 */}
          {theme === 'dark' ? 'Dark Theme' : 'Light Theme'}
        </div>
      )}
    </ThemeContext.Consumer>
  );
}

ReactDOM.render(<App />, document.getElementById('root'));

在这个示例中,ThemeContext.Provider 提供了一个值为 'dark' 的 theme,并将其向下传递给 Toolbar 组件。Toolbar 组件通过 ThemeContext.Consumer 获取当前的 theme 值,并根据其值渲染不同的内容。

Page Context 设计

在前端页面设计时,有几个时常需要复用的功能:

  1. 消息通知
  2. 后端请求
  3. 国际化
  4. 页面跳转

可以将这四个功能使用 React.createContext 将4个功能整合进一个Page Context 以减少代码重复。Page.ts代码如下,其中全局message使用的是antd组件,国际化使用的是react-intl

ts 复制代码
import React, { ReactNode } from 'react';
import { useNavigate } from 'react-router-dom';
import { message } from 'antd';
import { useIntl } from 'react-intl';
import { Requester } from '../Requester';

export interface PageProps {
  user: object;
}

const defaultValue: any = undefined;
export const PageContext = React.createContext(defaultValue);

export const Page: React.FC<{ children: ReactNode }> = ({ children }) => {
  const [messageApi, contextHolder] = message.useMessage();
  const navigate = useNavigate();
  const intl = useIntl();

  return (
    <PageContext.Provider value={{ messageApi, navigate, Requester, intl }}>
      {contextHolder}
      {children}
    </PageContext.Provider>
  );
};

总结

React.createContext 方法是使用 Context API 的第一步,它用于创建一个 Context 对象。通过 Provider 和 Consumer 组件,我们可以在 React 应用程序中实现组件之间的数据共享,而不必手动地通过 props 层层传递。这种方式使得代码更加简洁和可维护,是 React 开发中的一个重要技术点。

相关推荐
祈澈菇凉2 小时前
Webpack的基本功能有哪些
前端·javascript·vue.js
小纯洁w2 小时前
Webpack 的 require.context 和 Vite 的 import.meta.glob 的详细介绍和使用
前端·webpack·node.js
想睡好2 小时前
css文本属性
前端·css
qianmoQ2 小时前
第三章:组件开发实战 - 第五节 - Tailwind CSS 响应式导航栏实现
前端·css
记得早睡~3 小时前
leetcode150-逆波兰表达式求值
javascript·算法·leetcode
zhoupenghui1683 小时前
golang时间相关函数总结
服务器·前端·golang·time
White graces3 小时前
正则表达式效验邮箱格式, 手机号格式, 密码长度
前端·spring boot·spring·正则表达式·java-ee·maven·intellij-idea
庸俗今天不摸鱼3 小时前
Canvas进阶-4、边界检测(流光,鼠标拖尾)
开发语言·前端·javascript·计算机外设
bubusa~>_<3 小时前
解决npm install 出现error,比如:ERR_SSL_CIPHER_OPERATION_FAILED
前端·npm·node.js
[廾匸]4 小时前
cesium视频投影
javascript·无人机·cesium·cesium.js·视频投影