zoukankan      html  css  js  c++  java
  • [Redux] React Todo List Example (Adding a Todo)

    Learn how to create a React todo list application using the reducers we wrote before.

    /**
     * A reducer for a single todo
     * @param state
     * @param action
     * @returns {*}
     */
    const todo = ( state, action ) => {
        switch ( action.type ) {
            case 'ADD_TODO':
                return {
                    id: action.id,
                    text: action.text,
                    completed: false
                };
            case 'TOGGLE_TODO':
                if ( state.id !== action.id ) {
                    return state;
                }
    
                return {
                    ...state,
                    completed: !state.completed
                };
            default:
                return state;
        }
    };
    
    /**
     * The reducer for the todos
     * @param state
     * @param action
     * @returns {*}
     */
    const todos = ( state = [], action ) => {
        switch ( action.type ) {
            case 'ADD_TODO':
                return [
                    ...state,
                    todo( undefined, action )
                ];
            case 'TOGGLE_TODO':
                return state.map( t => todo( t, action ) );
            default:
                return state;
    
        }
    };
    
    /**
     * Reducer for the visibilityFilter
     * @param state
     * @param action
     * @returns {*}
     */
    const visibilityFilter = ( state = 'SHOW_ALL',
                               action ) => {
        switch ( action.type ) {
            case 'SET_VISIBILITY_FILTER':
                return action.filter;
            default:
                return state;
        }
    };
    
    /**
     * combineReducers: used for merge reducers togethger
     * createStore: create a redux store
     */
    const { combineReducers, createStore } = Redux;
    const todoApp = combineReducers( {
        todos,
        visibilityFilter
    } );
    
    const store = createStore( todoApp );
    
    /**
     * For generate todo's id
     * @type {number}
     */
    let nextTodoId = 0;
    
    /**
     * React related
     */
    const {Component} = React;
    class TodoApp extends Component {
        render() {
            return (
                <div>
                    <input ref={
            (node)=>{
                this.input = node
            }
        }/>
                    <button onClick={
            ()=>{
            //After clicking the button, dispatch a add todo action
                store.dispatch({
                    type: 'ADD_TODO',
                    id: nextTodoId++,
                    text: this.input.value
                })
                this.input.value = "";
            }
        }>ADD todo
                    </button>
                    <ul>
                        //loop thought the todo list
                        {this.props.todos.map( ( todo )=> {
                            return <li key={todo.id}>{todo.text}</li>
                        } )}
                    </ul>
                </div>
            );
        }
    }
    
    const render = () => {
        ReactDOM.render(
            <TodoApp todos={store.getState().todos}/>,
            document.getElementById( 'root' )
        );
    };
    
    //Every time, store updated, also fire the render() function
    store.subscribe( render );
    render();
    <!DOCTYPE html>
    <html>
    <head>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/redux/3.0.4/redux.js"></script>
       <script src="https://fb.me/react-0.14.0.js"></script>
      <script src="https://fb.me/react-dom-0.14.0.js"></script>
    
      <title>JS Bin</title>
    </head>
    <body>
    
      <div id="root"></div>
    </body>
    </html>
  • 相关阅读:
    CSS函数
    CSS布局方式
    实现文件下载的方式
    JS编码和解码方式
    Mac系统重置PostgreSQL密码
    使用CSS3 +JS实现图片预加载的动画效果
    GitBook学习入门教程
    Mac删除node.js 命令
    读取HTML文件并替换其中的特定内容,然后保存文件
    Java使用HttpURLConnection模拟浏览器发送HTTP请求
  • 原文地址:https://www.cnblogs.com/Answer1215/p/5125218.html
Copyright © 2011-2022 走看看