zoukankan      html  css  js  c++  java
  • [Redux] Extracting Presentational Components -- AddTodo

    The code to be refactored:

    let nextTodoId = 0;
    class TodoApp extends Component {
      render() {
        const {
          todos,
          visibilityFilter
        } = this.props;
        const visibleTodos = getVisibleTodos(
          todos,
          visibilityFilter
        );
        return (
          <div>
            <input ref={node => {
              this.input = node;
            }} />
            <button onClick={() => {
              store.dispatch({
                type: 'ADD_TODO',
                text: this.input.value,
                id: nextTodoId++
              });
              this.input.value = '';
            }}>
              Add Todo
            </button>
            <ul>
              {visibleTodos.map(todo =>
                <li key={todo.id}
                    onClick={() => {
                      store.dispatch({
                        type: 'TOGGLE_TODO',
                        id: todo.id
                      });         
                    }}
                    style={{
                      textDecoration:
                        todo.completed ?
                          'line-through' :
                          'none'
                    }}>
                  {todo.text}
                </li>
              )}
            </ul>
            <p>
              Show:
              {' '}
              <FilterLink
                filter='SHOW_ALL'
                currentFilter={visibilityFilter}
              >
                All
              </FilterLink>
              {', '}
              <FilterLink
                filter='SHOW_ACTIVE'
                currentFilter={visibilityFilter}
              >
                Active
              </FilterLink>
              {', '}
              <FilterLink
                filter='SHOW_COMPLETED'
                currentFilter={visibilityFilter}
              >
                Completed
              </FilterLink>
            </p>
          </div>
        );
      }
    }

    We extracting the Add todo input and button to a functional component, the functional components don't have instances. So we remove 

    this.input

    Also  I want it to be a presentational component and not specify behavior, so I just called the function called, "AddTodo," passing the current input value. I make on at click a prop so that the component that uses OnAddTodo can specify what happens when that button is clicked.

    const AddTodo = ({
      onAddTodo
    }) => {
      
      let input;
      return (
         <div>
              <input ref={node => {
              input = node;
            }} />
            <button onClick={() => {
              onAddTodo(input.value);
              input.value = '';
            }}>
              Add Todo
            </button>
         </div>
      );
    }
    let nextTodoId = 0;
    class TodoApp extends Component {
      render() {
        const {
          todos,
          visibilityFilter
        } = this.props;
        const visibleTodos = getVisibleTodos(
          todos,
          visibilityFilter
        );
        return (
          <div>
            <AddTodo 
               onAddTodo={ text =>
                  store.dispatch({
                      type: 'ADD_TODO',
                      id: nextTodoId++,
                      text
                  })
               }
            ></AddTodo>
            <ul>
              {visibleTodos.map(todo =>
                <li key={todo.id}
                    onClick={() => {
                      store.dispatch({
                        type: 'TOGGLE_TODO',
                        id: todo.id
                      });         
                    }}
                    style={{
                      textDecoration:
                        todo.completed ?
                          'line-through' :
                          'none'
                    }}>
                  {todo.text}
                </li>
              )}
            </ul>
            <p>
              Show:
              {' '}
              <FilterLink
                filter='SHOW_ALL'
                currentFilter={visibilityFilter}
              >
                All
              </FilterLink>
              {', '}
              <FilterLink
                filter='SHOW_ACTIVE'
                currentFilter={visibilityFilter}
              >
                Active
              </FilterLink>
              {', '}
              <FilterLink
                filter='SHOW_COMPLETED'
                currentFilter={visibilityFilter}
              >
                Completed
              </FilterLink>
            </p>
          </div>
        );
      }
    }
  • 相关阅读:
    第五章 面向方面编程___通知类型
    从 C++ 到ObjectiveC
    iPhone/Mac ObjectiveC内存管理教程和原理剖析(三)@property (retain)和@synthesize的默认实现
    两个操作字符串的方法:读取指定位置的字符和找出某个字符串的位置
    SQLITE3使用总结
    iphone中如何进行多线程编程
    sqlite数据库在IOS中的运用
    重载、覆盖、隐藏
    (转)c/c++ 内存管理
    iPhone/Mac ObjectiveC内存管理教程和原理剖析(四)系统自动创建新的autorelease pool
  • 原文地址:https://www.cnblogs.com/Answer1215/p/5164218.html
Copyright © 2011-2022 走看看