react学习-组件传值

1.props传值
主要步骤:
在父组件中引用子组件时,在子组件上面写入name1={name2}格式进行传值,name1为子组件中对应的用于接收数据的字段名称,name2为父组件中需要传递到子组件中的值(state中声明的数据);要在子组件中调用父组件的方法修改父组件的值可以用同样的方法将函数传入到子组件。相关代码如下:
父组件:parent.js

import React, { Component } from "react";
import Son from "./son";

export class parent extends Component {
  state = {
    name: "前端大佬",
    msg: "哈哈哈",
  };
  //   如果要用子组件改父组件的值就触发该方法
  parentChange = (data) => {
    this.setState({ msg: data });
  };
  render() {
    let { name, msg } = this.state;
    return (
      <div>
        <h1>parent page</h1>
        <p>姓名:{name}</p>
        <p>信息:{msg}</p>
        <Son name={name} msg={msg} parentChange={this.parentChange} />
        {/* {...this.state}传递state中的所有值 */}
        {/* <Son {...this.state} parentChange={this.parentChange} /> */}
      </div>
    );
  }
}

export default parent;

子组件:son.js

import React, { Component } from "react";
import PropTypes from "prop-types";

export class son extends Component {
  //   state = {
  //     name: "前端新手",
  //     msg: "略略略",
  //   };
  constructor(props) {
    super();
    this.state = {
      name: "前端新手",
      msg: "略略略",
      //   parentMsg: props.msg,
    };
  }
  handleChange = (e) => {
    // this.setState({ parentMsg: e.target.value });
    this.props.parentChange(e.target.value);
  };
  render() {
    let { name, msg, parentMsg } = this.state;
    let { name: pName, msg: pMsg } = this.props;
    // 父子组件中用到同样的属性名称的时候一般用别名区分
    return (
      <div>
        <h1>son page</h1>
        <p>姓名:{name}</p>
        <p>信息:{msg}</p>
        <p>
          资深前端介绍信息:{pName}--{pMsg}
        </p>
        <input type="text" defaultValue={pMsg} onChange={this.handleChange} />
      </div>
    );
  }
}

// 使用props校验
son.propTypes = {
  name: PropTypes.string,
  msg: PropTypes.string.isRequired,
};
// 未传递值时会显示以下默认值
son.defaultProps = {
  name: "1",
  msg: "2",
};

export default son;

2.context传值
主要步骤:
先创建一个context对象,并导出;
在使用的组件中导入该对象;
使用<MainContext.Provider>包裹组件元素;
在组件内部通过声明static contextType = MainContext或者组件.contextType = MainContext或者使用<MainContext.Consumer>包裹组件元素利用函数调用的方式来使用。相关代码如下:
context.js

import React from "react";
// 创建一个context对象,组件会从组件树中离自身最近的那个匹配的Provider中读取到当前的context值
const MainContext = React.createContext({ name: "哈哈" }); // 默认值

export default MainContext;

hello.js

import React, { Component } from "react";
import MainContext from "./context";
import World from "./word";

export class hello extends Component {
  // static contextType = MainContext;
  render() {
    return (
      <div>
        这是hello组件,是父组件
        {this.context.name}
        <World />
      </div>
    );
  }
}

// 用Class.contextType挂载在class上,然后使用this.context来消费最近Context上的那个值
// 可以在任何生命周期中访问到它,包括render函数中。(多用于类组件)
hello.contextType = MainContext;

export default hello;

word.js

import React, { Component } from "react";
import MainContext from "./context";

export class word extends Component {
  render() {
    return (
      <div>
        <MainContext.Consumer>
          {(context) => {
            console.log(context);
            return <div>这是word组件,是孙组件-{context.name}</div>;
          }}
        </MainContext.Consumer>
      </div>
    );
  }
}

export default word;

main.js

import React, { Component } from "react";
import Hello from "./hello";
import MainContext from "./context";

export class main extends Component {
  render() {
    let obj = { name: "ernest" };
    return (
      <div>
        <MainContext.Provider value={obj}>
          main组件
          <Hello />
        </MainContext.Provider>

        {/* 不使用MainContext.Provider时context中的默认值才会生效 */}
      </div>
    );
  }
}

export default main;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大兵的猫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值