react的TodoList增删改

这几天需要用react写一个TodoList完成增、删、改、查,到菜鸟教程看了下,又到慕课网上学了下基础内容,本来打算通过实战视频学一下的,结果发现,里边也是用到好多前端基础,
慕课网这样要求的:1.需要有一定的JS,CSS前端基础。 2.熟悉Sass和Compass 3.了解Yeoman、Grunt、Webpack 4.了解CommonJS、NodeJS。看完这几点的时候,我当时就蒙圈了。这些东西我没学过的太多了,而且看了相关的几十篇博客,也是多数用node.js、Java做的。。。还有有些能够理解一部分,最后勉强实现增删改功能,查询还没来的急学,后面有时间,好好重头学习下react再完善吧。
以下是在HTML界面实现的代码:(改有的注释应该都写了)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.3/react.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.3/JSXTransformer.js"></script>
    <style>
        *{
            padding: 0;
            margin: 0;
        }
        ul{
            list-style: none;
        }
        .container{
            margin-left: 200px;
            margin-top: 100px;
        }
        button{
            width: 100px;
            height: 20px;
            margin-left: 10px;
        }
        input{
            margin-top: 10px;
        }
    </style>
</head>
<body>

    <div id="container" class="container"></div>
    <script type="text/jsx">

        // TodoList 组件是一个整体的组件,最终的React渲染也将只渲染这一个组件
        // 该组件用于将『新增』和『列表』两个组件集成起来,并且存储 arr 的数据
        var TodoList = React.createClass({
            // 初始化数据
            getInitialState: function () {
                return {
                    //数组存储
                    arr: [{
                        title:"早餐",
                        content:"牛奶",
                        time:"10"
                    },
                        {
                            title:"午餐",
                            content:"肉奶",
                            time:"13"
                        }]
                };
            },
            // 接收一个传入的数据,并将它实时更新到组件的 state 中,以便组件根据数据重新render
            // 只要改变了 state ,react自动执行 reader 计算

            //任务标题、内容、时间,三部分需要用到数组中的对象
            handleChange: function (rows) {
                this.setState({
    //                arr: new Mask(title,content,time)
                    arr:rows
                });
    //            console.log(arr)
            },
            render: function () {
                return (
                        <div>
                            {/*
                             AddList 组件,传入两个属性onAdd,todo
                             todo将 todolist 的数据传入到组件,当新增时,更新todolist数据
                             onAdd -  将 handleChange 函数传入到组件,新增时,用它来处理最新的todolist数据
                             */}
                            <AddList onAdd={this.handleChange} todo={this.state.arr} />
                            {/*
                             集成 DeleteList 组件,传入两个属性 onDel,todo
                             todo将 todolist 的数据传入到组件,当删除时,更新todolist数据
                             onDel - 将 handleChange 函数传入到组件,删除时,用它来处理最新的todolist数据
                             */}
                            <DeleteList onDel={this.handleChange} todo={this.state.arr} />
                        </div>
                );
            }
        });
        /*
        * ddList 组件用于新增数据,需要todo 和 onAdd 两个属性
        * 当从 input 中获取数据时,将新数据 push 到todo中,
        * 然后使用 onAdd 调用 TodoList 的 handleChange 来更新state,然后react自动render
        * */


    //    增加和查询可以合并到一起用
        var AddList = React.createClass({
    //        增加数据模块
            handleAdd: function (e) {
                e.preventDefault();
                // 通过 refs 获取相信input元素,然后获取输入的内容
                var titleDOM = this.refs.title.getDOMNode();
                var titleValue = titleDOM.value.trim();
                var contentDOM = this.refs.content.getDOMNode();
                var contentValue = contentDOM.value.trim();
                var timeDOM = this.refs.time.getDOMNode();
    //            时间强行转化位数字,方便后续排序
                var timeValue = Number(timeDOM.value.trim());

                // 获取传入的todolist数据
                var rows = this.props.todo || [];
    //            console.log("ok")
                    if (titleValue !== '' && contentValue !== '' && timeValue !== '') {
                        // 更新数据,并使用 onAdd 更新到 TodoList 组件的 state 中
                        if(!isNaN(timeValue)){
    //                        把对应的每个input的值通过对象保存到数组中
                            rows.push(
                                    {
                                        title:titleValue,
                                        content:contentValue,
                                        time:timeValue
                                    }
                            );
                            this.props.onAdd(rows);
                        }else{
                            alert("日期只能为数字(单位:天),请重新输入!");
                        }

                    }else{
                        alert("您有信息未填写,请核对后再【添加】");
                    }
    //            把值保存到数组后,及时清空input,用户体验好
                titleDOM.value = contentDOM.value = timeDOM.value= '';
            },

            /*              搜索数据模块
            * 点击搜索的时候,先把所有className的input的display设置为none隐藏
            * 数组中遍历的时候,把符合条件的,设为 显示        *
            * */
            handleSearch:function(e) {
                e.preventDefault();

                console.log(this.refs.title.getDOMNode())
                this.props.todo.map(function (item, i) {
                            if(item.time == 10){
                                 alert("10")
                             };
                    console.log(item.time + "......"+ i);
                })
            },
            render: function () {
                return (
                    // 用回车键 和 点击事件,触发 handleAdd 事件,用户体验好

                        <form onsubmit={this.handleAdd}>
                            <input type="text" ref="title" id="title" placeholder="请输入任务标题" autoComplete="off" />
                            <input type="text" ref="content" id="content" placeholder="请输入内容" autoComplete="off" />
                            <input type="text" ref="time" id="time" placeholder="请输入到期时间(单位:天)" autoComplete="off" />
                            <button className="add" onClick={this.handleAdd} >添加</button>
                            <button className="search" onClick={this.handleSearch}>搜索/排序</button>
                        </form>
                );
            }
        });

        /*      DeleteList 完成删除 修改功能
        *可以删除某一项内容,有 noDel,todo两个属性
        *遍历todo的内容,生成数据列表和删除按钮
        *对某一项执行删除时,将todo中的数据删除
        * 然后通过 onDel 事件调用 TodoList 的 handleChange 来更新state,然后react自动render
        *修改值时用的中间变量
        */
        var titleV,contentV,timeV;
        var DeleteList = React.createClass({

            //删除事件绑定
            handleDel: function (e) {
                var delIndex = e.target.getAttribute('data-key');

                // 更新数据,并使用 onDel 更新到 TodoList 的 state 中,以便 React自动render
                this.props.todo.splice(delIndex, 1);
                this.props.onDel(this.props.todo);
            },
    //        修改事件绑定
            titleChange: function (e) {
    //            console.log(e.target.value)
                titleV = e.target.value;
    //            console.log(titleV)
            },
            contentChange: function (e) {
                contentV = e.target.value;
            },
            timeChange: function (e) {
                timeV = e.target.value;
            },
            /*
            * 修改的时候,用户先直接修改数据
            * 然后点击确认修改的时候在完成对数组值的修改操作
            * */
            handleAlt: function (e) {
                e.preventDefault();
                var delIndex = e.target.getAttribute('data-key');
                this.props.todo[delIndex].title = titleV;
                this.props.todo[delIndex].content = contentV;
                this.props.todo[delIndex].time = timeV;
                console.log(this.props.todo)

            },
            render: function () {
    //            console.log(this.props.todo.map)
                return (
                        <ul id="todo-list">
                            {
                                // {/* 遍历数据 */}
                                this.props.todo && this.props.todo.map(function (item, i) {
                                    return (
                                            <li ref="tip">
                                                <input defaultValue={item.title} onChange={this.titleChange} className="val"/>
                                                <input defaultValue={item.content}  onChange={this.contentChange} className="val"/>
                                                <input defaultValue={item.time}  onChange={this.timeChange} className="val"/>
                                                <button className="destroy" onClick={this.handleDel} data-key={i}>delete</button>
                                                <button className="alter" onClick={this.handleAlt} data-key={i}>Alt</button>
                                            </li>
                                    );
                                }.bind(this)) // {/* 绑定函数的执行this - 以便 this.handleDel */}
                            }
                        </ul>
                );
            }
        });

        React.render(<TodoList />, document.getElementById('container'));

    </script>
</body>
</html>
posted @ 2016-10-31 22:28  dreamliu666  阅读(1071)  评论(0编辑  收藏  举报