美文网首页React.js
用react做输入TODOS自动添加列表

用react做输入TODOS自动添加列表

作者: 西西里的姑娘 | 来源:发表于2016-11-27 20:01 被阅读0次

    适用于React初学者实现一个从输入框输入内容,自动添加列表的小案例

    一般的TODOlist事项列表功能都是添加事项,完成事项,删除事项,查看分类事项,

    我们暂时分类按照待完成事项和已完成事项,按照一个一个功能模块来完成,更加轻易上手

    一、配置环境,建立一个index.js

    搭建react环境,跑通环境

    import React from 'react';

    import ReactDOM from 'react-dom';

    import Todo from './todo';

    ReactDOM.render(,document.getElementById('root'));

    二、建立todo.js父组件

    先实现简单的添加功能,通过form表单实现

    class Todo extends React.Component { 

     constructor(props){  

       super(); 

        this.state={      items:[],      text:''    }

      } ;

     handleSubmit(e){   

            e.preventDefault();

           let newItem = this.refs.input.value.trim();  

           this.refs.input.value=null  //清空内容   

           if (newItem==''&& !newItem) {      

                 this.refs.input.focus();   

         return alert('不能为空')   

            }  //排除空值 

             this.state.items.push(newItem)  //将输入的内容  

             this.setState({  items:this.state.items  }) 

      }

     render () {    

         return(

           <div>

               <h1> Todo<h1> 

            <form onSubmit={this.handleSubmit.bind(this)}>

                  <input  type="text" placeholder='add a todo' />

                  <button>add#{this.state.items.length+1}</button>

              </form>

          </div>

           )

      }

    }

    export default Todo;

    三、简单的todolist.js子组件

    实现简单的添加功能.props将父组件定义的数组items传过来,用es6的map遍历传递数组

    export default class TodoList extends Component { 

     render() {   

     let list = this.props.items.map( (item,index) =>

           <div key={index}>{item}</div>)   

       return (

         <div>{list}</div>

    ); 

    }}

    四.扩展删除功能

    添加 todo.js 一个删除的方法

    handleDel(i){

       this.state.items.splice(index,1)

       this.setState({

           items:this.state.items

      })

    }

    添加到 todolist.js  中button组件按钮

    let list = this.props.items.map( (item,index) =>

    <div key={index}>

    {item.title}

    <button onClick={this.handleDelete.bind(this,index)}}>delete</button>

    </div>

    五.添加完成事项功能

    添加已完成事项选中的功能,用radio实现。

    通过设置传入的item.completed 的true 或者false的值处理判断是否选中

    添加方法

    handleComponent(){

    this.state.items[index].completed=!this.state.items[index].completed

    this.setState({

    items:this.state.items

    })}

    如下代码通过map将item 传入一个div中

    let list = this.props.items.map( (item,index) =>      

    <div key="index">

    <input type = "radio"  checked={item.completed}  onChange={this.handleChange.bind(this,index)} />

    <span style={item.completed ? {textDecoration: "line-through",color:'#ccc'} : null}>{item.title}</span>

    <button onClick={this.handleDelete.bind(this,index)}>删除</button>

    </div>

    )

    从todo.js传入删除方法和完成事项方法到todolist.js中

    handleChange(i){

    //传入一个方法,必须加i,传入的形参

    this.props.handleComponent(i)

    }

    handleDelete(i){

    this.props.handleDel(i)

    }

    todo.js组件添加初始设定

    constructor(props){

    super();

    this.state={

    items:[

    {title:'aa',completed:false},

    {title:'bb',completed:true}//用completed的布尔值判断事项是否已完成

    ],

    show:0}}

    六、实现分类查看功能

    我们分为待办事项和已完成事项,查看就可以查看全部事项,待办事项,已完成事项

    首先我们定义添加三个按钮组件,"All","Active","Completed"

    let name = ["All","Active","Completed"];                  

    let button = name.map( (item,index) =>

    <button key={index} onClick={this.handleShow.bind(this,index)}

    style = {this.state.show == index ? {backgroundColor:'#00bcd4'} : null}>{items}

    </button>

    在render中添加判断状态,0为all状态,1为Active  2为Completed

    if (this.state.show==0) {

    var showItems=this.state.items;

    }else if (this.state.show==1) {

    var showItems=this.state.items.filter(function (element) {

    return element.completed== false

    })

    }else {

    var showItems=this.state.items.filter(function (element) {

    return element.completed== true

    })//`add# ${this.items.length+1}`

    };

    添加 handleShow功能

    handleShow(i){

    this.setState({show:i})

    }

    OK,现在一个事项添加几乎完成了,但是功能还不够完善,因为index值在分类查看时会出现问题,所以用id传值更加严谨,后续改善功能代码如下

    完整的todo.js代码

    class Todo extends React.Component { 

     constructor(props){ 

       super(); 

       this.state={ 

          items:[     

             {title:'aa',completed:false,id:1},     

             {title:'bb',completed:true,id:2}   

        ],     

          show:0    }  } 

     handleSubmit(e){ 

         e.preventDefault();   

         let inputValue = this.refs.input.value.trim(); 

         this.refs.input.value=null //清空内容 

         if (inputValue==''&& !inputValue) {   

               this.refs.input.focus();   

                return alert('不能为空')    } //排除空值 

         let date = new Date; 

        let newItem={title:inputValue,completed:false,id:date.getTime()}   

        this.state.items.push(newItem) //将输入的内容   

         this.setState({  items:this.state.items  }) 

       } 

     handleComponent(id){ 

         var index = this.state.items.findIndex(function(ele){ 

               return id == ele.id    })  

         this.state.items[index].completed=!this.state.items[index].completed  

       this.setState({      items:this.state.items    }) 

    handleDel(id){   

        var index = this.state.items.findIndex(function(ele){ 

            return id == ele.id 

       })   

      this.state.items.splice(index,1) 

      this.setState({      items:this.state.items    }) 

    }

    handleShow(id){ 

        this.setState({show:id}) 

     }

    render () { 

       if (this.state.show==0) {     

       var showItems=this.state.items;   

     }else if (this.state.show==1) {     

     var showItems=this.state.items.filter(function (element) { 

          return element.completed== false     

    })   

    }else {   

       var showItems=this.state.items.filter(function (element) {     

              return element.completed== true      })

       };     

      let name = ["All","Active","Completed"];     

      let button = name.map( (item,index) =>{item})  return(

            <h1>Todo</h1>

            <TodoList items={showItems}

                handleComponent{this.handleComponent.bind(this)}

                handleDel={this.handleDel.bind(this)}/>

           <form onSubmit={this.handleSubmit.bind(this)}>

           <input placeholder='add a todo' ref="input"/>

          <button>add#{this.state.items.length+1}</button>

        {button}

      ) 

    }}

    export default Todo;

    todolist.js代码如下

    export default class TodoList extends Component {

    handleChange(id){ 

     this.props.handleComponent(id)

    }

    handleDelete(id){

       this.props.handleDel(id)

    render() {   

    let list = this.props.items.map( item =>  

    <div key={item.id} className="li">

    <input type="radio" checked={item.completed} onChange=

    {this.handleChange.bind(this,item.id)} />

    <span style={item.completed ? {textDecoration: "line-through",color:'#999'} :

    null}>{item.title}</span>

    <buttononClick={this.handleDelete.bind(this,item.id)} >删除</button>

    )   

    return (

    <div>

    {list}

    </div>

    );  }}

    成功完成功能,后续样式可以自己修改了!

    相关文章

      网友评论

        本文标题:用react做输入TODOS自动添加列表

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