美文网首页
React父子组件传值 + 值验证

React父子组件传值 + 值验证

作者: kevin5979 | 来源:发表于2020-09-24 12:53 被阅读0次

    父组件向子组件传值

    • 通过props,将父组件的state传递给了子组件。

    子组件向父组件传值

    • 父组件将更新数据的方法拿给子组件使用,子组件将自身的数据传入这个方法并调用,以此来改变父组件的数据。

    值验证prop-types

    • ChildCpn.propTypes = {key:type} 验证值类型
    • ChildCpn.defaultProps = {key:type} 设置默认值
    import React, {Component} from "react";
    import PropTypes from 'prop-types'; // 验证props
    
    /**
     * 演示父子组件传值
     */
    
    // 创建类子组件
    class ChildCpn extends Component {
      constructor(props) {
        super(props);       // 相当于 this.props = props
        console.log(props); // {name: "kevin", age: 18, btnClick: ƒ}
      }
    
      // 通过调用父组件传递的函数来修改数据
      handleClick = () => this.props.fn("我是子组件数据", -1)
    
      render() {
        const {name, age, fn, btnClick} = this.props
        console.log(fn); // foo(data) {console.log(data);}
        console.log(btnClick);  // e => this.changeAge(1)
        return (
          <div>
            <h2>我是类子组件,下面是来自父组件的传值</h2>
            <p>{"我是" + name + " 年龄 " + age}</p>
            <div>下面通过给父组件传值(自定义函数)改变年龄</div>
            {/* 这里接收到父组件传过来的函数(btnClick), 并绑定到点击事件中 */}
            {/* 一旦点击事件发生,会调用父组件的函数(btnClick) */}
            {/* 相当于onClick={e => this.changeAge(1)} */}
            <button onClick={btnClick}>年龄 + 1</button>
            <button onClick={this.handleClick}>年龄 - 1</button>
            <hr/>
          </div>
        )
      }
    }
    
    // 创建函数子组件
    function ChildCpn2(props) {
      const {name, age, btnClick} = props
      return (
        <div>
          <h2>我是函数子组件,下面是来自父组件的传值</h2>
          <p>{"我是" + name + " 年龄 " + age}</p>
          <div>下面通过给父组件传值(自定义函数)改变年龄</div>
          <button onClick={btnClick}>年龄 + 1</button>
        </div>
      )
    }
    
    // 验证props类型
    // propTypes 都为小写
    ChildCpn.propTypes = {
      name: PropTypes.string,
      age: PropTypes.number,
      fn: PropTypes.func
      /**
       更多验证学习地址: https://zh-hans.reactjs.org/docs/typechecking-with-proptypes.html
       optionalArray: PropTypes.array,
       optionalBool: PropTypes.bool,
       optionalFunc: PropTypes.func,
       optionalNumber: PropTypes.number,
       optionalObject: PropTypes.object,
       optionalString: PropTypes.string,
       optionalSymbol: PropTypes.symbol,
       */
    }
    
    ChildCpn2.defaultProps = {
      name: "默认名字",
      age: "保密"
    }
    
    export default class App extends Component {
      constructor(props) {
        super(props);
        this.state = {
          name: "kevin",
          age: 18
        }
      }
    
      // 更新年龄
      changeAge(count) {
        this.setState({
          age: this.state.age + count
        })
      }
    
      foo = (data, counter) => {
        console.log(data, counter);
        this.setState({
          age: this.state.age + counter
        })
      }
    
      render() {
        return (
          <div>
            <ChildCpn
              name={this.state.name}
              age={this.state.age}
              fn={this.foo} // 传入函数
              // 向子组件传递自定义函数
              btnClick={e => this.changeAge(1)}
            />
            <ChildCpn2
              age={this.state.age}
              btnClick={e => this.changeAge(1)}
            />
          </div>
        )
      }
    }
    
    END

    相关文章

      网友评论

          本文标题:React父子组件传值 + 值验证

          本文链接:https://www.haomeiwen.com/subject/hrejhktx.html