React 父子组件互相传参的方法


HTML 渲染后的样式:

其中 形好评 与 形好评 属于子组件 Child,形好评 属于父组件 Parent

 

联动关系:

(1)点击 形好评,改变 形好评数,同时 形好评 随之改变,反之不然;

(2)点击 形好评,改变 形好评数,同时 形好评 随之改变,反之不然;

(3)点击 形好评,仅改变 形好评数;

 

方法调用:

(1)通过 子组件调用父组件的方法,实现了 形好评 对 形好评 的联动;

(2)通过 父组件调用子组件的方法,实现了 形好评 对 形好评 的联动;

 

一、字符绑定 方式

import React, { Component } from 'react';
import { Rate, Icon, Divider } from 'antd';

class Child extends Component {
  constructor(props) {
    super(props);
    this.state = {
      star: 0,
      heart: 0,
    };
  }

  componentDidMount() {
    // do nothing
  }

  changeStar = star => {
    this.setState({ star });
    this.props.parent.reactFire(star);
  };

  changeHeart = heart => {
    this.setState({ heart });
  };

  reactHeart = heart => {
    // invoked by parent
    this.setState({ heart });
  };

  render() {
    return (
      <>
        <Rate value={this.state.star} onChange={this.changeStar} style={{ color: 'green' }} />
        <br />
        <Rate
          value={this.state.heart}
          onChange={this.changeHeart}
          character={<Icon type="heart" theme="filled" />}
          style={{ color: 'orange' }}
        />
      </>
    );
  }
}

class Parent extends Component {
  constructor(props) {
    super(props);
    this.state = { fire: 0 };
  }

  changeFire = fire => {
    this.setState({ fire });
    this.refs.childRef.reactHeart(fire);
  };

  reactFire = fire => {
    // invoked by children
    this.setState({ fire });
  };

  render() {
    return (
      <>
        {/* Custom attribute name 'parent' */}
        <Child parent={this} ref="childRef" />
        <Divider />
        <Rate
          value={this.state.fire}
          onChange={this.changeFire}
          character={<Icon type="fire" theme="filled" />}
          style={{ color: 'red' }}
        />
      </>
    );
  }
}

export default Parent;

 

二、React.createRef() 方式

import React, { Component } from 'react';
import { Rate, Icon, Divider } from 'antd';

class Child extends Component {
  constructor(props) {
    super(props);
    this.state = {
      star: 0,
      heart: 0,
    };
  }

  componentDidMount() {
    // do nothing
  }

  changeStar = star => {
    this.setState({ star });
    this.props.parent.reactFire(star);
  };

  changeHeart = heart => {
    this.setState({ heart });
  };

  reactHeart = heart => {
    // invoked by parent
    this.setState({ heart });
  };

  render() {
    return (
      <>
        <Rate value={this.state.star} onChange={this.changeStar} style={{ color: 'green' }} />
        <br />
        <Rate
          value={this.state.heart}
          onChange={this.changeHeart}
          character={<Icon type="heart" theme="filled" />}
          style={{ color: 'orange' }}
        />
      </>
    );
  }
}

class Parent extends Component {
  constructor(props) {
    super(props);
    this.childRef = React.createRef();
    this.state = { fire: 0 };
  }

  changeFire = fire => {
    this.setState({ fire });
    this.childRef.current.reactHeart(fire);
  };

  reactFire = fire => {
    // invoked by children
    this.setState({ fire });
  };

  render() {
    return (
      <>
        {/* Custom attribute name 'parent' */}
        <Child parent={this} ref={this.childRef} />
        <Divider />
        <Rate
          value={this.state.fire}
          onChange={this.changeFire}
          character={<Icon type="fire" theme="filled" />}
          style={{ color: 'red' }}
        />
      </>
    );
  }
}

export default Parent;

 

三、方法绑定 方式

import React, { Component } from 'react';
import { Rate, Icon, Divider } from 'antd';

class Child extends Component {
  constructor(props) {
    super(props);
    this.state = {
      star: 0,
      heart: 0,
    };
  }

  componentDidMount() {
    // Custom method name 'self'
    this.props.self(this);
  }

  changeStar = star => {
    this.setState({ star });
    this.props.parent.reactFire(star);
  };

  changeHeart = heart => {
    this.setState({ heart });
  };

  reactHeart = heart => {
    // invoked by parent
    this.setState({ heart });
  };

  render() {
    return (
      <>
        <Rate value={this.state.star} onChange={this.changeStar} style={{ color: 'green' }} />
        <br />
        <Rate
          value={this.state.heart}
          onChange={this.changeHeart}
          character={<Icon type="heart" theme="filled" />}
          style={{ color: 'orange' }}
        />
      </>
    );
  }
}

export default class Parent extends Component {
  constructor(props) {
    super(props);
    this.state = { fire: 0 };
  }

  changeFire = fire => {
    this.setState({ fire });
    this.childRef.reactHeart(fire);
  };

  reactFire = fire => {
    // invoked by children
    this.setState({ fire });
  };

  render() {
    return (
      <>
        {/* Custom attribute name 'parent' */}
        <Child parent={this} self={ref => (this.childRef = ref)} />
        <Divider />
        <Rate
          value={this.state.fire}
          onChange={this.changeFire}
          character={<Icon type="fire" theme="filled" />}
          style={{ color: 'red' }}
        />
      </>
    );
  }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值