React ES6扩展运算符、父传子props现实TodoList增加、删除

//***父组件 TodoList.js>
import React, { Component } from 'react'
import TodoItem from './TodoItem';
import "./style.css"

class TodoList extends Component {
    //类中必有constructor函数 而且会最先执行
    constructor(props) {
        super(props);
        this.state = {
            inputValue: 'dd', //input框内容
            list: [] //列表的每一项
        }
        //组件初始化时就把this指向改好,有益性能
        this.handleInputChange = this.handleInputChange.bind(this)
        this.handleButtonClick = this.handleButtonClick.bind(this)
        this.handleItemDelete = this.handleItemDelete.bind(this)
    }
    //页面初加载函后发送ajax请求
    componentDidMount() {
        axios.get('/api/todolist').then((res) => {
            this.setState({
                list: [...res.data]
            })
        }).catch(() => {
            alert('err')
        })
    }
    //双向绑定
    handleInputChange(e) {
        this.setState({ inputValue: e.target.value },)
    }
    //点击提交按钮给this.state.list加一项并渲染在页面
    handleButtonClick() {
        this.setState({
            //...this.state.list相当于目前的展开的this.state.list"学习英文", "学习react",将新的这项也加给list
            list: [...this.state.list, this.state.inputValue],
            inputValue: ''
        })
    }
    //点击删除某个todolist
    handleItemDelete(index) {
        const list = [...this.state.list];//拷贝数组 因为immutable--state不允许修改
        list.splice(index, 1)
        this.setState({
            list: list
        })
    }
    render() {
        return (
            <React.Fragment>
                <div>
                    <label htmlFor="insert">输入内容</label>
                    <input
                        id="insert"
                        className="input"
                        value={this.state.inputValue}
                        onChange={this.handleInputChange} />
                    <button onClick={this.handleButtonClick}>提交</button>
                </div>
                <ul>
                    {
                        this.state.list.map((item, index) => {
                            // 以下全是父传子,子组件中以props接收
                            return (
                                <TodoItem
                                    key={index}
                                    content={item}
                                    idx={index}
                                    deleteItem={this.handleItemDelete}>
                                </TodoItem>
                            )
                            //如果不用子组件 在return中就是以下写法
                            // <li
                            //     key={index}
                            //     onClick={this.handleItemDelete}>
                            //     {item}
                            // </li>
                        })
                    }
                </ul>
            </React.Fragment>
        )
    }
}
export default TodoList;

//***子组件 TodoItem.js>
import React, { Component } from "react";
import Proptypes from 'prop-types'

export default class TodoItem extends Component {
  constructor(props) {
    super(props);
    this.handleClick = this.handleClick.bind(this)
  }
  //点击时调用父组件传过来的方法,参数为父组件传过来的index
  handleClick() {
    //解构赋值改变this.props.xxx写法
    const { deleteItem, idx } = this.props
    deleteItem(idx)
  }

  render() {
    //解构赋值改变this.props.xxx写法
    const { content, test } = this.props
    return <div onClick={this.handleClick}>{test}-{content}</div>
  }
}

TodoItem.propsTypes = {
  test: Proptypes.string.isRequired,
  content: Proptypes.oneOfType([Proptypes.number, Proptypes.string]),
  deleteItem: Proptypes.func,
  index: Proptypes.number
}

TodoItem.defaultProps = {
  test: 'hello world'
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值