React - 上下文处理组件跨层级通信

2020-08-21  本文已影响0人  闪电西兰花
// src/components/ContextTest.js
import React from 'react';

function Child () {
  return (
    <div>Child</div>
  )
}

export default function ContextTest () {
  return (
    <div>
      <Child></Child>
    </div>
  )
}
// src/components/ContextTest.js
import React from 'react';

// 创建上下文
// 这个功能概念可理解为vue中的provide和inject
const MyContext = React.createContext()
const {Provider} = MyContext

function Child () {
  return (
    <div>Child</div>
  )
}

export default function ContextTest () {
  return (
    <div>
      {/* 将Child组件用Provider包裹起来,通过Provider的value属性就可以传值了 */}
      <Provider value={{name: 'asher'}}>
        <Child></Child>
      </Provider>
    </div>
  )
}
// src/components/ContextTest.js
import React from 'react';

// 创建上下文
// 这个功能概念可理解为vue中的provide和inject
const MyContext = React.createContext()
// 解构出Provider、Consumer
const {Provider, Consumer} = MyContext

// Child组件中通过props获取 
function Child (props) {
  return (
    <div>Child: {props.name}</div>
  )
}

export default function ContextTest () {
  return (
    <div>
      {/* 将Child组件用Provider包裹起来,通过Provider的value属性就可以传值了 */}
      <Provider value={{name: 'asher'}}>
        {/* 需要接收值的组件要被包裹在Consumer内 */}
         {/* Consumer内部执行一个方法,拿到传递的值传给Child,有点类似组件复合 */}
        <Consumer>
          {val => <Child {...val}></Child>}
        </Consumer>
      </Provider>
    </div>
  )
}
// src/components/ContextTest.js
import React, {useContext} from 'react';

const MyContext = React.createContext()
const {Provider, Consumer} = MyContext

// 跨组件通信方法1:利用<consumer></consumer>组件
function Child1 (props) {
  return ( 
    <div>child1: {props.name}</div>
  )
}

// 跨组件通信2:使用hook
function Child2 () {
  // 把创建的上下文传递给useContext
  // 直接从上下文中获取属性
  const ctx = useContext(MyContext)
  return (
    <div>child2: {ctx.name}</div>
  )
}

export default function ContextTest () {
  return (
    <div>
      <Provider value={{name: 'asher'}}>
 
        {/* 跨组件通信方法1 */}
        <Consumer>
          {val => <Child1 {...val}></Child1>}
        </Consumer>

        {/* 跨组件通信方法2 */}
        <Child2></Child2>

      </Provider>
    </div>
  )
}
// src/components/ContextTest.js
import React, {useContext} from 'react';

const MyContext = React.createContext()
const {Provider, Consumer} = MyContext

// 跨组件通信方法1:利用<consumer></consumer>组件
function Child1 (props) {
  return ( 
    <div>child1: {props.name}</div>
  )
}

// 跨组件通信2:使用hook
function Child2 () {
  // 把创建的上下文传递给useContext
  // 直接从上下文中获取属性
  const ctx = useContext(MyContext)
  return (
    <div>child2: {ctx.name}</div>
  )
}

// 跨组件通信3:class指定静态contextType
class Child3 extends React.Component {
  // 声明一个静态属性
  // 通过固定变量名this.context获取
  static contextType = MyContext
  render () {
    return (
      <div>Child3: {this.context.name}</div>
    )
  }
}

export default function ContextTest () {
  return (
    <div>
      <Provider value={{name: 'asher'}}>
 
        {/* 跨组件通信方法1 */}
        <Consumer>
          {val => <Child1 {...val}></Child1>}
        </Consumer>

        {/* 跨组件通信方法2 */}
        <Child2></Child2>

        {/* 跨组件通信方法3 */}
        <Child3></Child3>

      </Provider>
    </div>
  )
}
上一篇下一篇

猜你喜欢

热点阅读