React Context:跨层级组件共享状态参数、状态

news/2024/7/15 18:23:42 标签: react.js, 前端, 前端框架

前言

通常情况下,我们通过props将参数从父组件传递给子组件,达到组件间状态参数共享的目的。但是面对嵌套了多层组件的情况,继续使用props一层一层的传递参数是非常冗余和繁琐的。

对于这种包含多层组件的传参,React提供了 Context 能力来支持父组件向它包含的无论嵌套层级有多深的子组件传递状态参数,让状态共享变的简单。

使用步骤

一、创建 Context

通过 createContext创建Context对象,并且将其从定义Context的文件中导出,这样其他组件才能使用这个 Context;

createContext函数有一个必填参数,这个参数是 context 对象初始化的默认值,这个参数可以传入任何类型的值。

// context.ts

import { createContext } from 'react';

export const RootContext = createContext({name:'levenx'});

二、注册 Context Provider

在需要共享状态的最高层级的父组件外层包裹 context provider,这样它包含的所有子组件都可以使用 context 中的状态

import { RootContext } from './context.js';
import { useState } from 'react'

export default function Root({ level, children }) {
 
	const [userInfo, setUserInfo] = useState({name:'levenx'});

  return (
      <RootContext.Provider value={userInfo}>
					<section className="section">
		        {children}
				 </section>
      </RootContext.Provider> 
  );
}

在Root组件上包裹 Context Provider后,Root组件中的所有子组件都能够通过 RootContext获取userInfo信息。

三、消费 Context 状态

在子组件中引入已经注册好的 context 并且通过 useContext hook来消费共享的状态参数;

import { useContext } from 'react'
import { RootContext } from './context.js'

export default function Heading({ children }) {
  const userInfo = useContext(RootContext);
  // ...

   return <div>{userInfo.name}</div>
}

useContext是React内置的Hook,使用它可以从Context中读取状态,当 Context状态发生变化时,useContext读取的状态也会随之变化。

使用场景

💡 并不是所有场景都适合使用 context,很多时候项目中很容易过度使用它。

context 相较于props从代码阅读角度而言,并不是那么清晰明了,通过props传递的参数,在传递时能够清晰知道传递了什么,context的话,需要从多个文件中梳理逻辑。

应用主题

比如应用支持用户自定义显示主题,对于应用中所有的子组件都需要动态支持变化,这种非业务性的状态就可以通过 Context 进行管理。

全局状态管理

随着应用业务的增长与迭代,最终全局共用的状态会越来越多,通过props处理就更加复杂了。这个时候就可以通过 reducercontext配合使用来管理复杂的状态。

总结

React Context 为了我们提供了一种组件间状态共享的手段,合理使用会高效提升代码运行效率和维护成本。后续会继续分享在生产项目中使用案例。


http://www.niftyadmin.cn/n/5258531.html

相关文章

第四章 Django 模板系统

第一章 Django 基本使用 第二章 Django URL路由系统 第三章 Django 视图系统 第四章 Django 模板系统 第五章 Django 数据模型系统(基本使用) 第六章 Django 数据模型系统(多表操作) 第七章 Django 用户认证与会话技术 第八章 Django CSRF防护 文章目录 模板系统模板是什么变量…

Linux0.11内核源码解析-string待更新

sting.h头文件包含了所有的字符串操作函数 strcpy字符串拷贝函数 cld 指令用于设置方向标志位&#xff0c;确保字符串复制是从前向后进行。 lodsb 指令用于将 src 指针指向的字符加载到 AL 寄存器中&#xff0c;并将 src 指针递增。 stosb 指令用于将 AL 寄存器中的字符存储到 …

FFmpeg之AVFilterGraph

AVFilterGraph是对pileline的一个整体描述&#xff0c;没看之前以为里面大概是个有向无环图什么的来描述&#xff0c;进去一看&#xff0c;居然只是用链表来描述 结构体 先看结构体&#xff0c;主要关注里面的两个成员变量 AVFilterContext **filters;unsigned nb_filters; …

vue项目中 CDN 是vue本身的依赖可以按需加载还是项目中所有的第三方库都可以按需加载?

这是我看到CDN简介时产生的问题 相信很多小伙伴会有 和我一样的疑问 在这里 我也统一回答一下 CDN&#xff08;内容分发网络&#xff09;是一种通过将数据分发到全球各个节点&#xff0c;以提供快速、可靠的内容传输的技术。在Vue项目中&#xff0c;CDN可以用于按需加载Vue本…

【智能家居】智能家居项目

智能家居项目目录 项目目录结构 完整而典型的项目目录结构 CMake模板 CMake编译运行 README.md 项目说明文档 智能家居项目目录 【智能家居】面向对象编程OOP和设计模式(工厂模式) 【智能家居】一、工厂模式实现继电器灯控制 【智能家居】二、添加火灾检测模块&#xff08;…

橡胶塑料企业网站建设的作用是什么

橡胶塑料产品一般属于大额交易&#xff0c;对企业来说&#xff0c;需要不断提升品牌和拓客&#xff0c;但如今线下信息传播力不足&#xff0c;难以全面呈现内容&#xff0c;需要商家不断提升线上能力&#xff0c;获得进一步发展。 1、品牌宣传展示难 线上没有自己的平台难以将…

蓝桥杯第一场强者挑战赛(C)SOSdp

之前在cf上面接触过SOSdp&#xff08;子集dp&#xff09;&#xff0c;这里就碰到了。 思路&#xff1a; 异或运算即非进位加法运算&#xff0c;因此如果需要进位的话&#xff0c;那么就无法满足题意&#xff0c;因此条件弱化为不需要进位&#xff0c;也就是不存在同一位上面都是…

java swing 药品销售系统 mysql

数据库 查询药品&#xff1a; 出售药品&#xff1a; 查询客户信息&#xff1a; 查询订单信息&#xff1a;