首页 > 其他 > 详细

[Redux] Extracting Presentational Components -- Todo, TodoList

时间:2016-01-27 21:30:20      阅读:172      评论:0      收藏:0      [点我收藏+]

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>
    );
  }
}

 

First extact a single Todo as a persental component: which doesn‘t know what to do, just response for showing the interface:

So it accept a callback function to the onClick handler:

//remove
               onClick={() => {
                  store.dispatch({
                    type: ‘TOGGLE_TODO‘,
                    id: todo.id
                  });         
                }}

-------------
// replace

onClick={onTodoClick}

 

const Todo = ({
  text,
  completed,
  onTodoClick
})=>{
  return (
    <li 
                onClick={onTodoClick}
                style={{
                  textDecoration:
                    completed ?
                      ‘line-through‘ :
                      ‘none‘
                }}>
              {text}
            </li>
  );
}

 

TodoList, should also be a persentional component:

const TodoList = ({
  todos,
  onTodoClick
}) => {
  return (
    <ul>
          {todos.map(todo =>
            <Todo 
             key={todo.id}
             {...todo}
             onClick={
                ()=>{
                  onTodoClick
                }
             } 
           />
          )}
        </ul>
  );
}

 

The TodoApp is the ‘contianer component‘ which tell ‘persentional componet‘ what to display and the action to dispatch.

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
              })
           }
        />
        <TodoList 
          todos={visibleTodos}
          onTodoClick={
            (id)=>{
              store.dispatch({
                type: ‘TOGGLE_TODO‘,
                id
              })
            }
          }
        />
        <Footer 
           visibilityFilter = {visibilityFilter}
           onFilterClick={ (filter) => {
              store.dispatch({
                 type: ‘SET_VISIBILITY_FILTER‘,
                 filter
             });
           }}
        />
      </div>
    );
  }
}

 

in a word:

Presentaional compnent doesn‘t need to know what to do, only response for display.

Container component dispatch the action, and pass down to the persentional component.

 

[Redux] Extracting Presentational Components -- Todo, TodoList

原文:http://www.cnblogs.com/Answer1215/p/5164425.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!