React之Context大全

首先我们来说一下Context是干什么的,其实就是实现跨组件之间数据通信的一种方式

1.在react项目中使用context

我们的demo目录结构如下:
在这里插入图片描述

我们可以先建一个文件Mycontext,来管理我们的数据
在这里插入图片描述
在Parent引入Son组件,在Son组件引入Grandson,比如我们想在组件中使用Mycontext中的数据,我们可以这样写:

  • static contextType = 引入的模块 是固定写法,然后通过this.context就能拿到想要的值
    在这里插入图片描述

2.第一种写法Class.contextType

在这里插入图片描述

我们要用你导入的模块.Provider包裹所有的内容,必须要传入value,当传入value,Mycontext组件中的默认值就失效了,我们在Parent父组件中进行包裹
在这里插入图片描述
在Grandon孙子组件见中可以直接拿到值,不需要再通过Son组件进行传值
在这里插入图片描述
在这里插入图片描述

3.第二种写法:Consumer

固定写法 ,必须是一个表达式里面必须是一个函数 函数里面返回一个内容
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

还可以在新建CommonContext.js文件在传入值
在这里插入图片描述

4.购物车商品加减案例

文件目录
在这里插入图片描述

ContentContext.jsx文件

import React, { Component } from 'react'
import { createContext } from 'react'

const {Provider,Consumer:CountConsumer} = createContext()
// 使用class相当于封装了一下Provider
class ContentProvider extends Component {
    // 状态管理count
    constructor(){
        super()
        this.state = {
            count:1
        }
    }
    incrementCount = ()=>{
        this.setState({
            count:this.state.count + 1
        })
    }
    decrementCount = ()=>{
        this.setState({
            count:this.state.count - 1
        })
    }
    render() {
        return (
            <Provider value={{
                count:this.state.count,
                incrementCount:this.incrementCount,
                decrementCount:this.decrementCount
            }}>
                {/* 相当于vue里面的插槽,当在Cart中引入ContentProvider的时候,能拿到里面的内容 */}
                {this.props.children}
            </Provider>
        )
    }
}
export {
    ContentProvider,
    CountConsumer
}

Cart.jsx文件

import React, { Component } from 'react'
import Count from './Count'
import CountBtn from './CountBtn'
import {ContentProvider} from './ContentContext'

export default class Cart extends Component {
    render() {
        return (
            <ContentProvider>
                <CountBtn type="increment"></CountBtn>
                <Count></Count>
                <CountBtn type="decrement"></CountBtn>
            </ContentProvider>
        )
    }
}

CountBtn.js文件

import { CountConsumer } from './ContentContext'
const CountBtn = (count) => {
    return (
        <CountConsumer>
            
            {
                // 传入incrementCount和decrementCount方法,如果类型是increment就调用incrementCount方法
                //{incrementCount, decrementCount}相当于把内容解构出来,第二种写法: 
                //(a) => {
                //     // 把type解构出来
                //     let handleClick =  count.type === "increment" ? a.incrementCount : a.decrementCount
                //     {/* 判断传入的类型然后赋值+或- */}
                //     return <button onClick={handleClick}>{count.type === "increment"?"+":"-"}</button>
                // }
                    {/* 判断传入的类型然后赋值+或- */}
                    return <button onClick={handleClick}>{count.type === "increment"?"+":"-"}</button>
                }
            }
                ({incrementCount, decrementCount}) => {
                    // 把type解构出来
                    let handleClick =  count.type === "increment" ? incrementCount : decrementCount
                    {/* 判断传入的类型然后赋值+或- */}
                    return <button onClick={handleClick}>{count.type === "increment"?"+":"-"}</button>
                }
            }

        </CountConsumer>
    )
}
export default CountBtn

count.jsx

import React from 'react'
import {CountConsumer} from './ContentContext'
const Count = ()=>{
    return (
        <CountConsumer>
            {
                // 
                ({count})=>{
                    return <span>{count}</span>
                }
            }
        </CountConsumer>
    )
}
export default Count
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值