React组件传值方式总结

1. 子组件向父组件传值

父组件Header:

import Nav from 'Nav.js';
class Header extends React.Component {
  constructor(props) {
    super(props);
    this.state = {

    }
    this.callbackForNav = this.callbackForNav.bind(this);
  }
  callbackForNav({ selectedTopChannelOrder, selectedSubChannelOrder, selectedTopChannelName, selectedSubChannelName }) {
    this.setState({ 
      selectedTopChannelOrder, 
      selectedSubChannelOrder, 
      selectedTopChannelName, 
      selectedSubChannelName 
    })
  }
  render() {
    return (<Nav channels={navChannelData} dynamicnav={dynamicNav}  defaultSelectedTopChannelOrder={navDefaultTopOrder} defaultSelectedSubChannelOrder={navDefaultSubOrder} callbackFunc={this.callbackForNav} sticky="top" />)
  }
}

子组件Nav:

class Nav extends React.Component {
  constructor() {
    this.state = {
      selectedTopChannelOrder:0, 
      selectedSubChannelOrder:-1,
      selectedTopChannelName: "", 
      selectedSubChannelName:""
    }
  }
  static propTypes = {
    callbackFunc: PropTypes.func
  }
  componentDidMount() {
    const {selectedTopChannelOrder, selectedSubChannelOrder, selectedTopChannelName, selectedSubChannelName} = this.state;
    this.props.callbackFunc({selectedTopChannelOrder, selectedSubChannelOrder, selectedTopChannelName, selectedSubChannelName}) 
  }
  clickSubChannel() {
     this.setState({
        selectedTopChannelOrder: topOrder,
        selectedTopChannelName: topName,
        selectedSubChannelOrder: subOrder,
        selectedSubChannelName: subName
    });
    this.props.callbackFunc({
        selectedTopChannelOrder: topOrder,
        selectedTopChannelName: topName,
        selectedSubChannelOrder: subOrder,
        selectedSubChannelName: subName
    });
  }

  render() {
    return (...)
  }
}

2. 跨级组件传值

利用context

父组件:

class List extends React.Component {
  static childContextType = {
    color:PropTypes.string
  }

  getChildContext() {
    return {
      color:'red'
    }
  }
  render() {
    return (...)
  }
}

子组件:

class ListItem extends React.Component {
  static contextTypes = {
    color:PropTypes.string
  }

  render(){
    return (
      <li style={{background:this.context.color}}>someword</li>
    )
  }
}

3. 无嵌套关系的组件传值

import {EventEmitter} from 'events';

const emitter = new EventEitter();

class A extends React.Component {
  clickHandler(data,e) {
    this.setState({
      ...
    });
    emitter.emit('theclick', data);
  }
  render() {
    const data = 'xxx';
    return (<div onClick={this.clickHandler.bind(this, data)} />)
  }
}

App containing A and B:

import {EventEmitter} from 'events';

const emitter = new EventEitter();

class App extends React.Component {
  componentDidMount() {
    this.listenerForTheClick = emitter.on('theclick', (data) => {
      this.setState({
        propForB: data;
      })
    })
  }
  componentWillUnmount() {
    emitter.remove(this.listenerForTheClick);
  }

  render() {
    return (
      <B someprop={this.state.propForB} />
      <A />
    )
  }
}

转载于:https://www.cnblogs.com/Bonnie3449/p/9642205.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值