zoukankan      html  css  js  c++  java
  • react.js父子组件通信

    这里通过todolist的功能来说明

    父组件:

    import React,{ Component,Fragment } from 'react';
    import TodoItem from './ToDoItem';
    
    class TodoList extends Component {
      
      constructor(props) {
        super(props);
        this.state = {
          inputValue: '',
          todoList: []
        };
        this.handleSubmit = this.handleSubmit.bind(this);
        this.handleChangeInput = this.handleChangeInput.bind(this);
        this.handleDelete = this.handleDelete.bind(this);
        this.parentMethod = this.parentMethod.bind(this);
        this.testChildren = this.testChildren.bind(this);
      }
    
      render() {
        const { inputValue,todoList } = this.state;
        return (
          <Fragment>
            <p><input value={inputValue} onChange={this.handleChangeInput} /><button onClick={this.handleSubmit}  type="button">提交</button></p>
            <TodoItem ref="children" parentMethod = {this.parentMethod} />
            <button onClick={this.testChildren}>测试调用子组件的方法</button>
            <ul>
              {
                todoList.map((item,index) => (
                  <li 
                    key={+new Date() + index} 
                    dangerouslySetInnerHTML={{__html:item}} 
                    onClick={() => this.handleDelete(index)}></li>
                ))
              }
            </ul>
          </Fragment>
        )
      };
    
      parentMethod() {
        alert("调动父组件方法");
      }
    
      testChildren() {
        this.refs.children.childrenMethod();
      }
    
      handleChangeInput(e) {
        this.setState({
          inputValue: e.target.value
        },() => {
          console.log(this.state);
        })
      }
    
      handleSubmit() {
        this.setState({
          todoList: [...this.state.todoList,this.state.inputValue],
          inputValue: '',
        })
      }
    
      handleDelete(index) {
        // immutable概念
        // state不允许我们做任何的改变
        let list = [...this.state.todoList]; //拷贝一份TodoList
        list.splice(index,1);
    
        this.setState({
          todoList: list
        })
      }
    
    }
    
    export default TodoList;

    子组件

    import React,{ Component } from 'react';
    
    class TodoItem extends Component {
      constructor(props) {
        super(props);
        this.childrenMethod = this.childrenMethod.bind(this);
      }
    
      render() {
        return (
          <div>
            <h3>子组件</h3>
            <button onClick={this.childrenMethod}>子组件方法</button>
            <button onClick={this.props.parentMethod}>父组件方法</button>
          </div>
        )
      }
    
      childrenMethod() {
        alert("调用子组件方法");
      }
    
    }
    
    export default TodoItem;

    总结:

    父组件给子组件传递数据:直接在调用子组件的地方传递数据即可。

    调用子组件的方法:简单说就是给子组件,通过ref起个名字,然后在父组件的点击事件中,通过this.refs.子组件的名字.子组件的方法来实现

    子组件调用父组件的方法。在调用子组件的地方将方法传递,子组件中通过this.props。父组件传递的方法即可

    子组件给父组件传递数据:通过调用父组件的方法时,通过callback回调传递数据。this.props.父组件的方法(传递的数据)

  • 相关阅读:
    7maven依赖排除
    5maven生命周期
    4maven依赖范围、依赖有效性
    3maven常用命令和配置依赖
    1maven概念作用
    6在Eclipse中创建maven和修改默认配置
    2maven下载与配置
    Class 'org.apache.tomcat.jdbc.pool.DataSource' not found
    17 alternatives to your default image viewer on Fedora
    zip压缩包解压后的文件名是乱码?
  • 原文地址:https://www.cnblogs.com/bgwhite/p/10949809.html
Copyright © 2011-2022 走看看