Skip to content
{}

基础知识 - Hooks

useContext

跟类组件的写法差不多,父级没变, 只不过子级的写法不同了,只需要将创建的createContext()实例对象传入useContext()里面,useContext()返回的数据,就是供应商组件是定义的数据跟方法,直接调用就行了

createContext : React.createContext() 可以创建一个跨组件实例对象

Provider : <React.createContext().Provider value={ { 数据|方法 } }> </React.createContext().Provider>, 用来包裹父组件根元素标签 标签上有个 value属性 可以定义全局数据 子组件可以用里面定义的数据和方法

import React, { useContext, useState } from "react";
import ReactDom from 'react-dom';

// 创建context对象
const ContextDom = React.createContext();
const Childen1 = (props) => {
  const { name, content } = props;

  // 将创建的content对象传入进去,可以获得 或 供应商组件上 定义的方法 属性
  const Context = useContext(ContextDom);
  return (
    <div
      onClick={() => {
        //   调用形参上面 根元素provider定义的方法 将数据传递过去进行更改
        Context.ChangeContent(content);
      }}
    >
      {name}
    </div>
  );
};
const Childen2 = () => {
  // 将创建的content对象传入进去,可以获得 或 供应商组件上 定义的方法 属性
  const Context = useContext(ContextDom);
  console.log(Context);
  return <div>{Context.content}</div>;
};

function App() {
  const [list, setlist] = useState([
    { id: 1, name: "前端猛男1", content: "我是前端猛男1" },
    { id: 2, name: "前端猛男2", content: "我是前端猛男2" },
    { id: 3, name: "前端猛男3", content: "我是前端猛男3" },
    { id: 4, name: "前端猛男4", content: "我是前端猛男4" },
  ]);
  const [content, setcontent] = useState("");
  return (
    // 用实例对象的Provider属性 包裹根元素 标签上有一个value属性用来定义数据
    // 子组件可以访问到value传递过去的数据
    <ContextDom.Provider
      value={{
        title: "前端猛男",
        content: content, //动态绑定传递的值
        ChangeContent: (content) => {
          // 子组件调用此方法修改传递过来的数据 来更新组件
          setcontent(content);
        },
      }}
    >
      <div>
        {list.map((item) => {
          return <Childen1 key={item.id} {...item}></Childen1>;
        })}
        <Childen2></Childen2>
      </div>
    </ContextDom.Provider>
  );
}
ReactDom.render(<App>,document.getElementById('root'))

好好加油吧,少年!