zoukankan      html  css  js  c++  java
  • 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 />
        )
      }
    }
    
    
  • 相关阅读:
    vue比较模板来跟新数据
    iframe自适应高度
    springmvc接口ios网络请求
    spring mvc实现接口参数统一更改
    spring mvc实现自定义注解
    基于redis集群实现的分布式锁,可用于秒杀,定时器。
    java使用javax.mail进行免费的邮件发送
    前端图片压缩上传(纯js的质量压缩,非长宽压缩)
    java项目中的路径获取,request
    阿里云(腾讯云类似)服务器控制台配置开放所有的端口
  • 原文地址:https://www.cnblogs.com/Bonnie3449/p/9642205.html
Copyright © 2011-2022 走看看