react——组件通信、高阶组件

高阶组件

博主文档

父组件

import React, { Component, Fragment } from 'react'
// 组件首字母大写
import TodoItem from './TodoItem'

class TodoList extends Component {
  constructor(props) {
    super(props)
    this.state = {
      inputValue: '',
      list: []
    }
    this.handleInputChange = this.handleInputChange.bind(this)
    this.handleBtnClick = this.handleBtnClick.bind(this)
    this.handleItemDelete = this.handleItemDelete.bind(this)
  }

  render() {
    return (
      < Fragment >
        <div>
          <input
            value={this.state.inputValue}
            onChange={this.handleInputChange}
          />
          <button onClick={this.handleBtnClick}>提交</button>
        </div>
        <ul>
          {this.getTodoItem()}
        </ul>
      </Fragment >
    )
  }

  getTodoItem() {
    return this.state.list.map((item, index) => {
      return (
        <TodoItem
          // 父向子传数据
          item={item}
          index={index}
          // 父向子传方法(注意绑定 this,因为子组件没有这个方法)
          deleteItem={this.handleItemDelete}
          key={index}
        />
      )
    })
  }

  handleInputChange(e) {
    const value = e.target.value
    this.setState(() => ({
      inputValue: value
    }))
  }

  handleBtnClick() {
    // prevState 等于 this.state
    this.setState((prevState) => ({
      list: [...prevState.list, prevState.inputValue],
      inputValue: ''
    }))
  }

  handleItemDelete(index) {
    this.setState((prevState) => {
      const list = [...prevState.list]
      list.splice(index, 1)
      return { list }
    })
  }
}

export default TodoList;

子组件

import React, { Component } from 'react'
import PropTypes from 'prop-types'

class TodoItem extends Component {
	// 通过这种方式设置默认值
	static defaultProps = {
    	test: 'hello world'
	}
    constructor(props) {
        super(props)
        // 这种写法在后期复杂组件会节约性能
        this.handleItemDelete = this.handleItemDelete.bind(this)
    }
    render() {
        const { item, test } = this.props
        return (
            <div onClick={this.handleItemDelete}>
                {test} ———— {item}
            </div>
        )
    }

    handleItemDelete() {
    	// 注意:子组件仅可以使用父组件的传值,但不可以改变它(单向数据流)
        // 获取父组件方法和数据(子组件也可以通过父组件传来的方法给父组件传值)
        const { deleteItem, index } = this.props
        deleteItem(index)
    }
}

// 验证类型
// https://reactjs.org/docs/typechecking-with-proptypes.html#proptypes
TodoItem.propTypes = {
    item: PropTypes.string.isRequired,// 要求 string 类型且必须传递
    deleteItem: PropTypes.func,
    index: PropTypes.number,
    test: PropTypes.string.isRequired
}

// 设置默认值
TodoItem.defaultProps = {
    test: 'hello world'
}

export default TodoItem
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值