react使用createContext()和useContext()实现组件传值

官方文档

使用场景

Context 主要应用场景在于很多不同层级的组件需要访问同样一些的数据。请谨慎使用,因为这会使得组件的复用性变差。

案例

效果图

在这里插入图片描述

使用
...
const MyContext = React.createContext(defaultValue);

// 父
<MyContext.Provider value={/* 某个值 */}>

// 子孙
<MyContext.Consumer>
  {value => /* 基于 context 值进行渲染*/}
</MyContext.Consumer>
...
目录结构

在这里插入图片描述

代码

LayoutContext.js

import React from 'react'

const LayoutContext = React.createContext()

export default LayoutContext

index.jsx

import React from 'react'
import { Button } from 'antd'
import Sub from '@/pages/Sub/index'
import LayoutContext from '@/store/LayoutContext'

export default function Layout() {
  const [num, setNum] = React.useState(1)
  const element = React.useRef(null)

  const addNum = (arg) => setNum((num) => num + arg)

  return (
    <LayoutContext.Provider value={{ num, setNum, addNum }}>
      <h2 ref={element}>数字为:{num}</h2>
      <Button type="primary" onClick={() => addNum(1)}>
        加一
      </Button>
      <Sub num={num} childFn={addNum}></Sub>
    </LayoutContext.Provider>
  )
}

Sub.jsx

import React from 'react'
import { Button } from 'antd';
import List from '@/pages/List/list'
import './sub.less'

function Sub(props) {
  return (
    <div className='Sub'>
      <h2>Sub组件:{props.num}</h2>
      <Button type="primary" onClick={()=>props.childFn(3)}>3</Button>
      <List></List>
    </div>
  )
}

export default Sub

List.jsx

未使用使用useContext()

import React, { useContext } from 'react'
import { Button } from 'antd'
import './list.less'
import LayoutContext from '@/store/LayoutContext'

export default function List() {
  // const { num, setNum, addNum } = useContext(LayoutContext)
  const [arr] = React.useState(['刘备', '关羽', '张飞'])

  return (
    <LayoutContext.Consumer>
      {({ num, setNum, addNum }) => {
        return (
          <div className="List">
            <h2>list组件:{num}</h2>
            <Button className='mr-10' type="primary" onClick={() => addNum(10)}>10
            </Button>
            <Button type="primary" onClick={() => setNum(num - 10)}>10
            </Button>
            <ul>
              {arr.map((item, index) => {
                return (
                  <React.Fragment key={index}>
                    <span className="ml-10">{index + 1}
                      {item}
                    </span>
                  </React.Fragment>
                )
              })}
            </ul>
          </div>
        )
      }}
    </LayoutContext.Consumer>
  )
}

使用useContext()

import React, { useContext } from 'react'
import { Button } from 'antd'
import './list.less'
import LayoutContext from '@/store/LayoutContext'

export default function List() {
  const { num, setNum, addNum } = useContext(LayoutContext)
  const [arr] = React.useState(['刘备', '关羽', '张飞'])

  return (
    <div className="List">
      <h2>list组件:{num}</h2>
      <Button className="mr-10" type="primary" onClick={() => addNum(10)}>10
      </Button>
      <Button type="primary" onClick={() => setNum(num - 10)}>10
      </Button>
      <ul>
        {arr.map((item, index) => {
          return (
            <React.Fragment key={index}>
              <span className="ml-10">{index + 1}
                {item}
              </span>
            </React.Fragment>
          )
        })}
      </ul>
    </div>
  )
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凡小多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值