【react】使用context进行跨级组件数据传递

news/2024/7/24 9:12:14 标签: react.js, javascript, 前端

官方文档:使用 Context 深层传递参数、useContext

应用:无需为每层组件手动添加 props,能狗在组件树间进行数据传递的方法。

1、创建context

ContextProvider.tsx:

javascript">import React, { useMemo, useState } from 'react';

export interface ContextState {
  viewRef?: React.MutableRefObject<null>;
  activeIndex: number;
  setActiveIndex: (data: number) => void;
}

// 创建一个context
export const Context = React.createContext<ContextState>({
  activeIndex: 0,
  setActiveIndex: () => {},
});

const ContextProvider: React.FC<
  { children: React.ReactNode } & {
    viewRef: React.MutableRefObject<null>;
  }
> = ({ children, viewRef }) => {
  // 使用useState监听状态变更
  const [activeIndex, setActiveIndex] = useState(0);

  const value = useMemo(() => {
    return {
      viewRef,
      activeIndex,
      setActiveIndex, // 通过context来更新对象和数据,则可以使用state的方式将其传递下去
    };
  }, [showQuizsAnswer, shotViewRef, viewRef]);

  // Context提供一个Provider组件,并将自组件包裹起来,这里的props名称必须是value
  return <Context.Provider value={value}>{children}</Context.Provider>;
};

export default ContextProvider;

要更新 context,请将其与 state 结合。在父组件中声明一个状态变量,并将当前状态作为 context value 传递给 provider。

上述写法可以参考 useContext。

2、提供context

App.tsx:

javascript">import ContextProvider from './ContextProvider';

function App() {
  // 下面这种写法是无效的,不能在父组件中使用
  // const {  setActiveIndex, activeIndex } = React.useContext(context);
  
  return (
    // 使用provider包裹,之后所有的子组件都可以获取得到距离他最近的provider的数据
    <ContextProvider viewRef={viewRef}>
      <ChildComponent onChange={handleChange} />
    </ContextProvider>
  );
}

注意:在这里App.tsx里面不能消费context,因为App.tsx属于父组件。

useContext() 总是在调用它的组件 上面 寻找最近的 provider。它向上搜索, 不考虑 调用 useContext() 的组件中的 provider。 所以上面注释掉的写法是错误的。

3、使用context

ChildComponent.txs:

javascript">function ChildComponent() {
  // 使用useContext钩子访问Context的值
  const { setActiveIndex, activeIndex } = React.useContext(MyContext);

  // 在子组件中调用setActiveIndex函数来更改value值
  const handleInputChange = (newValue) => {
    setActiveIndex(newValue);
  };

  return (
    <TextInput value={activeIndex} onChangeText={handleInputChange} />
  );
}

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

相关文章

VSCode之PowerShell中创建项目踩坑

VSCode之PowerShell中创建项目踩坑 文章目录 VSCode之PowerShell中创建项目踩坑1.VSCode创建项目踩坑1. 问题描述2. 原因分析及解决方法1. 原因&#xff1a;PowerShell 执行策略默认为&#xff1a;Restricted2. 解决方法 1.VSCode创建项目踩坑 1. 问题描述 使用vue-v命令查看V…

selenium的其它使用方法

selenium的其它使用方法 1. selenium标签页的切换 当selenium控制浏览器打开多个标签页时&#xff0c;如何控制浏览器在不同的标签页中进行切换呢&#xff1f;需要我们做以下两步&#xff1a; 获取所有标签页的窗口句柄 利用窗口句柄字切换到句柄指向的标签页 这里的窗口句柄…

《WebKit 技术内幕》学习之十一(2):多媒体

2 视频 2.1 HTML5视频 在HTML5规范定义中&#xff0c;Web开发者可以使用“video”元素来播放视频资源。视频中有个重要的问题就是视频编码格式&#xff0c;对此&#xff0c;目前标准中包含了三种编码格式&#xff0c;它们分别是Ogg、MPEG4和WebM。其中Ogg是由Xiph.org组织开…

【LeetCode每日一题】2865. 美丽塔 I

2024-1-24 文章目录 [2865. 美丽塔 I](https://leetcode.cn/problems/beautiful-towers-i/) 2865. 美丽塔 I 初始化变量 ans 为0&#xff0c;用于记录最大的和值。获取整数列表的长度&#xff0c;保存到变量 n 中。使用一个循环遍历列表中的每个位置&#xff0c;从0到n-1。在循…

性能优化-OpenCL 介绍

「发表于知乎专栏《移动端算法优化》」 本文首先对 GPU 进行了概述&#xff0c;然后着重地对移动端的 GPU 进行了分析&#xff0c;随后我们又详细地介绍了 OpenCL 的背景知识和 OpenCL 的四大编程模型。希望能帮助大家更好地进行移动端高性能代码的开发。 &#x1f3ac;个人简介…

折线的可视化及不规则柱体的绘制

开发环境&#xff1a; Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example demo解决问题&#xff1a; 1.绘制一条多段线&#xff08;折现&#xff09;&#xff0c;并可视化这段折现&#xff1b;2.根据折现绘制一个不规则柱体 关键点 : vtk…

初探二分法

推荐阅读 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;一&#xff09; 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;二&#xff09; 文章目录 推荐阅读题目解法一解法二 题目 题目&#xff1a;给定一个 n 个元素有序的&#xff0…

Mybatis 拦截器注册方式

在MyBatis中注册拦截器可以通过以下三种方式&#xff1a; 1. XML配置文件方式 在Mybatis的核心配置文件&#xff08;mybatis-config.xml&#xff09;中的标签下定义拦截器&#xff0c;并指定实现类。 <configuration><!-- ...其他配置... --><plugins><…