美文网首页
React-todo-list 系列四

React-todo-list 系列四

作者: Mark同学 | 来源:发表于2019-12-09 23:45 被阅读0次

    状态组件 => Redux

    src
    ——TodoList.js

    import React from 'react';
    import TodoItem from './TodoItem';
    import store from './store';
    
    class TodoList extends React.Component {
      constructor() {
        super();   
        this.state = store.getState();
        this.handleDelete = this.handleDelete.bind(this);
        this.handleBtnClick = this.handleBtnClick.bind(this);
        this.handleInputChange = this.handleInputChange.bind(this);
        this.handleStoreChange = this.handleStoreChange.bind(this);
        store.subscribe(this.handleStoreChange);
      }
    
      handleStoreChange() {
        this.setState(store.getState());
      }
    
      handleBtnClick() {
        // this.setState({
        //   list: [...this.state.list, this.state.inputValue],
        //   inputValue: ''
        // })
        const action = {
          type: 'add_todo_item'
        }
        store.dispatch(action);
      }
    
      handleInputChange(e) {
        // this.setState({
        //   inputValue: e.target.value
        // })
        const action = {
          type: 'change_input_value',
          value: e.target.value
        }
        store.dispatch(action);
      }
    
      handleDelete(index) {
        // const list = [...this.state.list];
        // list.splice(index, 1);
        // this.setState({
        //   list: list
        // })
        const action = {
          type: 'delete_todo_item',
          value: index
        }
        store.dispatch(action);
      }
    
      getTodoItems() {
    
        const { list } = this.state;
    
        return (
          list.map((item, index) => {
            return (
              <TodoItem 
                key={index} 
                index={index} 
                content={item}
                delete={this.handleDelete}
              />
            );
          })
        );
      }
    
      render() {
    
        const { inputValue } = this.state;
    
        return (
          <div>
            <div>
              <input value={inputValue} onChange={this.handleInputChange}/>
              <button onClick={this.handleBtnClick}>add</button>
            </div>
            <ul>{this.getTodoItems()}</ul>
          </div>
        );
      }
    }
    
    export default TodoList;
    

    src
    ——store
    ————index.js

    import { createStore } from 'redux';
    import reducer from './reducer';
    
    const store = createStore(reducer, window.__REDUX_DEVTOOLS_EXTENSION__ &&window.__REDUX_DEVTOOLS_EXTENSION__());
    
    export default store;
    

    src
    ——store
    ————reducer.js

    const defaultState = {
      list: [],
      inputValue: ''
    }
    
    export default (state = defaultState, action) => {
      if (action.type === 'change_input_value') {
        const newState = JSON.parse(JSON.stringify(state));
        newState.inputValue = action.value;
        return newState;
      }
      if (action.type === 'add_todo_item') {
        const newState = JSON.parse(JSON.stringify(state));
        newState.list.push(newState.inputValue);
        newState.inputValue = '';
        return newState;
      }
      if (action.type === 'delete_todo_item') {
        const newState = JSON.parse(JSON.stringify(state));
        newState.list.splice(action.value, 1);
        return newState;
      }
      return state;
    }
    

    src
    ——TodoItem.js

    import React from 'react';
    
    class TodoItem extends React.Component {
    
      constructor(){
        super();
        this.handleDelete = this.handleDelete.bind(this);
      }
    
      handleDelete() {
        this.props.delete(this.props.index);
      }
    
      render() {
        return (
          <li onClick={this.handleDelete}>{this.props.content}</li>
        );
      }
    }
    
    export default TodoItem;
    

    相关文章

      网友评论

          本文标题:React-todo-list 系列四

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