React之Context跨级组件传值

本文详细介绍了React中跨级组件传参的实现方法及好处,通过实例展示了如何使用Context API来解决复杂项目中组件间的数据传递问题。

React跨级传参

跨级组件传参的好处

例如:react-redux 的原理就是利用了跨级传参的方法实现的,其中的好处不言而喻!!!

为什么要用跨级传参

    在单纯的父子传参中this.props就可以了。子传父也是通过调用父组件的方法去改变参数变化,假如在企业项目中不
只是单纯的父子传参,还有爷爷组件和孙子组件或者重孙玄孙甚至可能...玄玄玄孙等等,就好比自己的亲戚的七大姑八
大姨一样错综复杂,所以这时候React提供了一个非常简便和实用的东西      ---------    组件跨级传值

具体使用方法

  1. 首先先下载下React脚手架,并搭建好目录结构
  2. 第一步在src文件夹下创建utils文件夹并创建context.js文件,以及其他组件
    在这里插入图片描述
  3. 在context文件下书写一下代码(用来创建Context)
import React from 'react'

//创建context对象
var context = React.createContext();

//导出
export default context;
  1. 在App文件里书写爷爷组件App 并在爷爷组件中引入 父亲组件List
class App extends Component{
    constructor(){
        super();
        this.state = {
            title:'支付宝'
        };
    }
    render(){
        return (
            <div className="app">
                {/* 通过value属性指定需要传递的值 */}
                {/* 希望接收值的组件 必须包裹在Provider内部 */}
                <Context.Provider value={this.state.title}>
                    <List></List>
                </Context.Provider>
            </div>
        )
    }
}

export default App;
  1. 在List文件里书写父亲组件List 并在爷爷组件中引入 孙子组件Item
import React, { Component } from 'react'

import Item from './Item'

export default class List extends Component {
    render() {
        return (
            <div>
                <Item></Item>
            </div>
        )
    }
}
  1. 孙组件Item
import React, { Component } from 'react'
import Context from '../utils/context'
export default class Item extends Component {
    render() {
        return (
            <div className="item">
                <Context.Consumer>
                    {
                        (value) => {
                            console.log('Item接收到了值:', value);
                            /* 不能在这里用setState保存接收的value */
                            /* 否则会死循环 */
                            /* 对于接收到value,一般的处理方式: 立即渲染 */
                            return (
                                <h2>{value}</h2>
                            );
                        }
                    }
                </Context.Consumer>
            </div>
        )
    }
}
  1. 孙组件进行数据的展示和渲染
import React, { Component } from 'react'

import Context from '../utils/context'

export default class Btn extends Component {
    render() {
        return (
            <div className="btn">
                <Context.Consumer>
                    {
                        (value) => { 
                            console.log('Btn接收到了值:', value);
                            /* 不能在这里用setState保存接收的value */
                            /* 否则会死循环 */
                            /* 对于接收到value,一般的处理方式: 立即渲染 */
                            return (
                                <h2>{value}</h2>
                            );
                        }
                    }
                </Context.Consumer>
            </div>
        )
    }

这样就是实现了跨级传参

总结

  1. 创建context对象

var context = React.createContext();

  1. 传值的组件,利用 Provider 组件传值,值通过value属性指定;
    注意: 须将需要接收值的组件包裹在Provider内,这样所有内层组件都可以接收到这个value值,通俗的讲就是数据的入口。

<Context.Provider value={this.state.title}></Context.Provider>

  1. 接收值的组件,利用Consumer 组件接收值,内部是个函数
<Context.Consumer>  
 {
     (value) => {
        console.log('Btn接收到了值:', value);
         /* 不能在这里用setState保存接收的value */         
         /* 否则会死循环 */
         /* 对于接收到value,一般的处理方式: 立即渲染 */
         return (
             <h2>{value}</h2>
         );
     }
 }
</Context.Consumer>

在这里插入图片描述

### React TypeScript 中的组件通信 在React应用中,尤其是当涉及到TypeScript时,有多种方法可以在不同层次的组件传递数据。下面介绍几种常见的技术。 #### 使用回调函数进行自底向上通讯 对于从子代向祖先组件传递信息的情况,可以采用回调函数的方式。先定义一个接口来描述预期的数据结构以及任何必要的事件处理程序签名[^1]: ```typescript // 定义子组件接受来自父的属性类型 interface ChildProps { onValueChange: (value: string) => void; } ``` 接着,在子组件内部调用此`onValueChange`函数以通知其上组件发生了变化。而父组件则负责提供具体的实现逻辑并响应这些更改。 #### 利用Context API 实现全局状态管理 如果应用程序中有多个地方都需要访问相同的状态,则推荐使用 Context API 来共享该状态。通过这种方式不仅可以简化 props 的层层钻取问题,而且还可以更好地支持大型复杂的应用场景[^3]。 首先创建上下文对象: ```javascript import * as React from 'react'; const MyContext = React.createContext<{ count: number; updateCount(value: number): void }>({ count: 0, updateCount: () => {}, }); ``` 然后利用 `useReducer` 或者简单的 state hook 创建 provider 组件包裹住需要获取 context 的部分,并向下播最新的给 consumer 子树中的所有后代节点。 最后,在消费端可以直接读取当前环境下的配置项或是触发相应的动作修改它。 #### Redux Store 集中式存储解决方案 除了上述两种方案外,还有更强大的工具比如Redux可以帮助开发者构建可预测性的UI层架构。借助于专门设计用于处理异步操作、副作用等问题的功能库(如redux-thunk),即使面对非常复杂的业务需求也能轻松应对[^2]。 不过得注意的是引入额外依赖可能会增加项目的维护成本和技术栈宽度,因此应当权衡利弊后再做决定。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值