React-js-todo-list-sortable(1)

Building a Todo app with React.js

这是我首次尝试用React-JS建立一个待办事项应用。React-JS是一个JavaScript库,用于构建用户界面,主要是因为它是由Facebook的建立。我们将学习如何使用。

让我们开始.您可以按照从GitHub库的步骤本教程

  1. ##Demo
  2. ##Download
  3. ##Practice

TodoListApp

在本文中,我们将使用建立一个非常的应用程序Facebook的 react.js. 如果你不熟悉这个库,那么我会强烈建议阅读使用React构建了完整的Comment system教程.

Thinking in components

建设React.js应用的根本出路在于您的应用程序分解成一堆有用的组件,然后你的工作方式向后分别构建它们。一旦各个部件都是准备就绪,可以它们连接起来,以在组件之间交换数据。例如,我们的Todo应用程序可以分解为以下组件和层次结构,

- TODO APP
    - TODO BANNER
    - TODO FORM
    - TODO LIST
        - TODO LIST ITEM #1
        - TODO LIST ITEM #2
        ...
        - TODO LIST ITEM #n

Basic Skeleton

/* [TODO APP] */ 
var TodoApp = React.createClass({ ... }); 
    /* [TODO BANNER] && [TODO LIST] */ 
    var TodoBanner = React.createClass({ ... });
    /* [TODO FORM] */ 
    var TodoForm = React.createClass({ ... });                     
    var TodoList = React.createClass({ ... }); 
        /* [TODO LIST ITEM] */ 
        var TodoListItem = React.createClass({ ... }); 

React.render(<TodoApp/>, document.body);

Component 1 - TodoApp

这个组件将持有将由它的子组件以各种形式来共享待办事项列表。 items的初始状态将是一个空白列表。该列表将尽快作为一个新的项目通过TodoForm组件添加更新。

/* [TODO APP] */ 
var TodoApp = React.createClass({ 
    getInitialState: function(){ 
        return {items: []}; 
    }, 
    updateItems: function(newItem){ 
        var allItems = this.state.items.concat([newItem]); 
        this.setState({items: allItems});
    }, 
    render: function(){ 
        return ( 
            <div> 
                <TodoBanner/>
                <TodoForm onFormSubmit={this.updateItems}/>                                 
                <TodoList items={this.state.items}/>     
            </div> 
        ); 
    } 
});

Component 2 - TodoBanner

它只是包含了一个标题标签。

/* [TODO BANNER] */ 
var TodoBanner = React.createClass({ 
    render: function(){ 
        return ( 
        <h3>TODO....react.js</h3> 
        ); 
    } 
});

Component 3 - TodoList

它接受的项目的列表和环绕一个TodoListItem组件的每个项目。最终的结果,然后以<ul>标签包裹。

/* [TODO LIST] */ 
var TodoList = React.createClass({ 
    render: function() { 
    var createItem = function(itemText) { 
        return ( 
            <TodoListItem>{itemText}</TodoListItem> 
            );
        }; 
        return <ul>{this.props.items.map(createItem)}</ul>;
    } 
});

Component 4 - TodoListItem

它以<li>标签列出所有项目 ,以便它呈现为在最终的HTML的列表的块。 this.props.children预见包含传递给TodoListItem标签从其父组件的所有后代。

/* [TODO LISTITEM] */
var TodoListItem = React.createClass({
    render: function(){
        return (
            <li data-id={this.props.value} key={this.props.value}>{this.props.children}</li>
        );
    }
});

Component 5 - TodoForm

它包含一个文本字段后跟一个按钮,触发在待办事项列表中的另外的项目。此组件将保持当前的项目在文本框输入并且两者都使用onChange事件保持同步。由于作为提交按钮被按下很快,该项目被传递给其父组件,焦点返回到文本框。

/* [TODO FORM] */
var TodoForm = React.createClass({
    getInitialState: function() {
        return {item: ''};
    },
    handleSubmit: function(e){
        e.preventDefault();
        this.props.onFormSubmit(this.state.item);
        this.setState({item: ''});
        ReactDOM.findDOMNode(this.refs.item).focus();
        return;
    },
    onChange: function(e){
        this.setState({
            item: e.target.value
        });
    },
    render: function(){
        return (
            <div className="row">
              <form  onSubmit={this.handleSubmit}>
                <div className="form-group col-sm-10">
                    <input type='text' className="todoField form-control"  ref='item' onChange={this.onChange} value={this.state.item}/>
                    <input type='submit' className="btn btn-default" style={{"float":"left","marginLeft":"5px"}} value='Add'/>
                </div>
              </form>
            </div>
        );
    }
});

Render - TodoApp

最后一步是绘制 TodoApp

ReactDOM.render(
        <TodoApp/>,
        document.getElementById('todo')
      );

当你完成,你可以看到 TodoApp.
TodoListApp
The complete working demo can be found here .

##Building a Todo app with React.js (1) - A simple todos list

##Building a Todo app with React.js (2) - Improve Component & Remove Component

##Building a Todo app with React.js (3) - Adding Filters for Search and showing complete/incompleted tasks

##Building a Todo app with React.js (4) - Multiple Todos

##Building a Todo app with React.js (5) - Sort item