2017-01-09 23 views
0

我跟随Dan的egghead.io Redux课程。 但是我不知道为什么我的待办事项应用程序无法正常工作。它不输出任何错误和任何警告,只是不起作用。Redux React Todo应用程序没有错误的迹象,但不起作用

你可以给我一些提示。

这是我的jsbin。 https://jsbin.com/cozecip/33/edit?js,output

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 { 
     id: state.id, 
     text: state.text, 
     completed: !state.completed 
     }; 
    default: 
     return state; 
    } 
}; 

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

const visibilityFilter = (state = 'SHOW_ALL', action) => 
{ 
    switch (action.type) { 
    case 'SET_VISIBILITY_FILTER': 
     return action.filter; 
    default: 
     return state; 
    } 
}; 

const { combineReducers } = Redux; 

const todoApp = combineReducers({ 
    todos, 
    visibilityFilter 
}); 

const { createStore } = Redux; 
const store = createStore(todoApp); 

const { Component } = React; 

const FilterLink = ({ 
    filter, 
    currentFilter, 
    children, 
    onClick 
}) => { 
    if (filter === currentFilter){ 
     return <span>{children}</span> 
    } 

    return (
     <a href="#" onClick ={onClick}>{children}</a> 
    ); 
}; 

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


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

const AddTodo = ({ 
    onAddClick 
}) => { 
    let input; 

    return (
    <div> 
    <input ref={node => { 
     input = node; 
    }} /> 
    <button onClick={() => { 
     onAddClick(input.value) 
     input.value = ''; 
    }}> 
    Add Todo 
    </button> 
    </div> 
); 
} 

const Footer = ({ 
    visibilityFilter, 
    onFilterClick 
}) => (
     <p> 
      Show: 
      {' '} 
      <FilterLink 
      filter='SHOW_ALL' 
      currentFilter={visibilityFilter} 
      onClick={onFilterClick}> 
       All 
      </FilterLink> 
      {' '} 
      <FilterLink 
      filter='SHOW_ACTIVE' 
      currentFilter={visibilityFilter} 
      onClick={onFilterClick}> 
      Active 
      </FilterLink> 
      {' '} 
      <FilterLink 
      filter='SHOW_COMPLETED' 
      currentFilter={visibilityFilter} 
      onClick={onFilterClick}> 
      Completed 
      </FilterLink> 
     </p> 

) 

const getVisibleTodos = (todos, filter) => { 
    switch(filter){ 
    case 'SHOW_ALL': 
     return todos; 
    case 'SHOW_COMPLETED': 
     return todos.filter(t => t.completed); 
    case 'SHOW_ACTIVE': 
     return todos.filter(t => !t.completed); 
    default: 
     return todos; 
    } 
} 

let nextTodoId = 0; 
const TodoApp = ({ 
    todos, 
    visibilityFilter 
}) => { 
    return (
    <div> 
    <AddTodo 
     onAddClick={ 
     text => 
      store.dispatch({ 
      type: 'ADD_TODO', 
      text: this.input.value, 
      id: nextTodoId++ 
      }) 
     } 
    /> 
    <TodoList 
     todos={ 
     getVisibleTodos(
       todos, 
       visibilityFilter 
     ) 
     } 
     onTodoClick={id => 
     store.dispatch({ 
      type: 'TOGGLE_TODO', 
      id 
     }) 
     } 
    /> 
    <Footer 
     visibilityFilter={visibilityFilter} 
     onFilterClick={filter => 
     store.dispatch({ 
      type: 'SET_VISIBILITY_FILTER', 
      filter 
     }) 
     } 
    /> 
</div> 
); 
} 

const render =() => { 
    ReactDOM.render(
    // Render the TodoApp Component to the <div> with id 'root' 
    <TodoApp 
     {...store.getState()} 
    />, 
    document.getElementById('root') 
); 
}; 

store.subscribe(render); 
render(); 
+0

检查控制台有一个错误,说没有定义redux,所以换句话说你忘了添加redux库 – Sam

+0

看不到控制台上的任何错误。 – user3405462

+0

https://jsbin.com/help/adding-custom-libraries如果你不想打扰复制你的代码,并通过它到这个小提琴https://jsfiddle.net/ypnnkjk7/3/它会更容易 – Sam

回答

0

确保您已经添加在index.js 正确的ID应该是这样的。 document.getElementById('你的div id从index.html应该在这里')

+0

该div ID是正确的。 – user3405462

+0

你还有问题吗? –

+0

是的,詹姆斯,我仍然有这个问题,我放弃了这个。 – user3405462

相关问题