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

这篇具有很好参考价值的文章主要介绍了【react】使用context进行跨级组件数据传递。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

1、创建context

ContextProvider.tsx:

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:

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:文章来源地址https://www.toymoban.com/news/detail-823107.html

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

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

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

到了这里,关于【react】使用context进行跨级组件数据传递的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • react当我们有两个完全不相关的组件想要通信时,就可以利用这种模式,其中一个组件负责订阅某个消息,而另一个元素则负责发送这个消息。使用Context配合

    在nextjs项目中,发现两个组件没啥关系,例如一个是一直存在的头部组件,另一个是页面中的组件,当我点击头部组件中的特定按钮时,把数据传递到页面组件中,页面组件接受到canshu数据后在做其他操作,那么他们两个如何通讯,通过context配合观察者模式实现。 首先在其

    2024年02月15日
    浏览(15)
  • React Native Ref转发/Memo缓存/HOC高阶组件/Context上下文

    React Native Ref转发/Memo缓存/HOC高阶组件/Context上下文

    1、使用自定义组件时,实现外层组件对原始组件(TextInput)的操作 外层组件使用 ref 属性 子组件使用 forwardRef 包裹 2、函数式组件对外暴露实例方法(cusomFocus) 子组件 父组件如图一所示 1 、 避免多余渲染 问题:每次点击按钮都会导致 InfoView 组件发生重绘,即使每次 setI

    2024年01月21日
    浏览(13)
  • React中父子组件参数传递讲解

    React中父子组件参数传递讲解

    结合案例:github搜索案例 案例结果展示如下图 1.父容器代码 说明:父容器中包含了两个组件模块,分别是Search和List,用来搜索和显示 2.搜索Search子模块代码 3.展示Lisi子模块代码 父子参数传递分析 1.子(Search)传父(App) 首先在父容器APP的state中创建状态属性,再传给子模块Sea

    2024年02月09日
    浏览(9)
  • grpc-go通过context传递额外数据

    使用 ctx.Value 从 context 读取数据 使用 ctx.Value 往 context 写入数据 metadata 是 grpc 内置的,用来往 RPC 服务传递 http 头数据,分 in 和 out 两种,对应的 key 都为一个空 struct,分别为:mdIncomingKey 和 mdOutgoingKey 。 服务端的 ctx 和 md 直接打印出来,如下样子: 注意 md 中的值会被加上中

    2024年02月21日
    浏览(10)
  • react自定义组件间的传值,if..else..判断,for循环(嵌套map使用),点击事件(Onclick),页面上事件实事传递参数(基础版)

    9.自定义组件间的传值 10.if..else..判断 11.for循环(嵌套map使用) 12.点击事件(Onclick) 13.页面上事件实事传递参数 14.关于export default function App()与export function App()的区别    export default不需要{}      import  Gallery from \\\'./Gallery.js\\\';    export function需要{}       import {Gallery} from \\\'./Galler

    2024年01月17日
    浏览(14)
  • React三种通过属性传递组件本身的方法

    直接传递 JSX 创建好的元素 把要传递的组件作为 JSX 元素写在属性值里,然后在接收的组件里用 {this.props.xxx} 来渲染。这种方法的优点是直观和灵活,缺点是可能造成不必要的重复渲染。 直接传递 JSX 创建好的元素的方法会造成不必要的渲染,是因为每次父组件重新渲染时,

    2024年02月12日
    浏览(9)
  • Mobx在非react组件中修改数据,在ts/js中修改数据实现响应式更新

    Mobx在非react组件中修改数据,在ts/js中修改数据实现响应式更新

    我们都之前在封装mobx作为数据存储的时候,使用到了useContext作为包裹,将store变成了一个hooks使用,封装代码: 但是我们都知道hooks只能在函数组件中或者hooks中使用,不能在ts/js代码中使用,但是我这里有一个需求,想每次发送接口请求的时候,做一个后置处理器,用于获取

    2024年02月11日
    浏览(11)
  • vue前端开发自学,子组件传递数据给父组件,使用$emit

    vue前端开发自学,子组件传递数据给父组件,使用$emit

    vue前端开发自学,子组件传递数据给父组件,使用$emit 父子组件之间互相传递数据的情况非常常见,下面为大家介绍的是,来自子组件,给父组件传递数据的情况。 如图,以上代码是父组件的代码情况,ComponentEvent.vue。 可以看出来,里面的特殊点,在于,有个子组件的引用和标

    2024年01月23日
    浏览(11)
  • React 中的 context使用方法

    什么是上下文? 全局变量就是全局的上下文,全局都可以访问到它;上下文就是你运行一段代码,所要知道的所有变量。 三大件 React.createContext(): context 的初始化 provider: 提供context的父组件,用来包裹需要context的子组件的 子组件获得context的方法 代码如5:

    2024年02月15日
    浏览(7)
  • 如何使用postman进行参数传递以及csv数据驱动

    如何使用postman进行参数传递以及csv数据驱动

    - 了解postman工具可以用来做什么 postman可以用来做接口测试,主要可以用来实现以下几个需求 可以快速构建我们想要发出的请求 可以保存我们已经做过的接口测试用例 可以提供响应数据比较的作用 可以把测试用例放到测试集里面去批量的执行,指定我们执行的次数,进行数

    2023年04月11日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包