在React中使用Context在多个嵌套组件内共享数据

本文介绍了在React应用中如何利用Context特性来避免多层组件间繁琐的数据传递,通过创建并使用Context对象,可以直接在父组件和其深层嵌套的子孙组件之间共享数据,简化代码结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Context特性

若组件多层包裹 且外层属性或方法要传递给内层的组件 则传递会变得比较麻烦

比如:

import React from 'react';
 
export default class Parent extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            mycolor:"red"
        }
    }

    render() { 
        return <div>
            <h1>I'm Parent</h1>
            <Son mycolor={this.state.mycolor}></Son>
        </div>
    }
}

class Son extends React.Component {

    render() { 
        return <div>
            <h3>I'm Son</h3>
            <Grandson mycolor={this.props.mycolor}></Grandson>
        </div>
    }
}

class Grandson extends React.Component {

    render() { 
        return <div>
            <h5 style={{color:this.props.mycolor}}>I'm Grandson</h5>
        </div>
    }
}

此时 可以使用Context特性
在父组件上直接共享一个Context对象 然后内层的组件无需逐层传递数据了 想要使用 直接从Context获取即可

在想要共享属性或方法的父组件里提供一个getChildContext()方法(方法名不能改变)
在里面返回一个对象 该对象即为要共享给所有子孙组件的数据
然后使用childContextTypes属性进行属性校验
在要使用数据的子组件里使用contextTypes属性进行属性校验 然后用this.context.属性名获取属性即可

像这样:

import React from 'react';
import ReactPropTypes from 'prop-types' // 属性校验包

export default class Parent extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            mycolor:"red"
        }
    }

    // 在父组件中定义一个function 固定名称getChildContext 且内部必须返回一个对象
    // 该对象即为要共享给所有子孙组件的数据
    getChildContext()
    {
        return {
            mycolor:this.state.mycolor
        }
    }

    // 属性校验 规定传给子孙组件的数据类型
    static childContextTypes={
        mycolor:ReactPropTypes.string
    }

    render() { 
        return <div>
            <h1>I'm Parent</h1>
            <Son></Son>
        </div>
    }
}

class Son extends React.Component {

    render() { 
        return <div>
            <h3>I'm Son</h3>
            <Grandson></Grandson>
        </div>
    }
}

class Grandson extends React.Component {

    // 属性校验 校验从父组件传来的数据类型
    static contextTypes={
        mycolor:ReactPropTypes.string // 若子组件要使用父组件通过Context共享的数据 那么在使用前一定要进行数据校验
    }

    render() { 
        return <div>
            <h5 style={{color:this.context.mycolor}}>I'm Grandson</h5>
        </div>
    }
}

当然 Context使用的前提是必须为父子关系组件 若是平级的组件 则无此特性


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值