在`App`中没有指定必需的prop`visibleTodos [0] .text`

时间:2016-01-20 09:39:09

标签: reactjs redux

请我尝试使用示例Here作为反应 - 反应教程。但是,当onTodoClick因以下错误而失败时,代码可以正常工作

Warning: Failed propType: Required prop visibleTodos [0]的.text was not specified in应用. Check the render method of连接(APP).

Warning: Failed propType: Required prop待办事项[0]的.text was not specified in {TodoList的{1}}应用. Check the render method of

以下是我的App.js

.

和我的TodoList

class App extends Component {
    render(){
        // Injected by connect() call:
    const { dispatch, visibleTodos, visibilityFilter } = this.props
        return (
          <div>
                <AddTodo
                    onAddClick={text =>
                    dispatch(addTodo(text))
              } />
                <TodoList
                    todos={visibleTodos}
                    onTodoClick={id =>
                    dispatch(completeTodo(id))
              } />
                <Footer
                    filter={visibilityFilter}
                    onFilterChange={nextFilter =>
                    dispatch(setVisibilityFilter(nextFilter))
              } />
          </div>
        )
    }
}
App.propTypes = {
  visibleTodos: PropTypes.arrayOf(PropTypes.shape({
    text: PropTypes.string.isRequired,
    completed: PropTypes.bool.isRequired
  }).isRequired).isRequired,
  visibilityFilter: PropTypes.oneOf([
    'SHOW_ALL',
    'SHOW_COMPLETED',
    'SHOW_ACTIVE'
  ]).isRequired
}

function selectTodos(todos, filter) {
  switch (filter) {
    case VisibilityFilters.SHOW_ALL:
      return todos
    case VisibilityFilters.SHOW_COMPLETED:
      return todos.filter(todo => todo.completed)
    case VisibilityFilters.SHOW_ACTIVE:
      return todos.filter(todo => !todo.completed)
  }
}

function select(state) {
  return {
    visibleTodos: selectTodos(state.todos, state.visibilityFilter),
    visibilityFilter: state.visibilityFilter
  }
}

export default connect(select)(App)

当我运行我的应用程序时。我能够在待办事项列表中添加一个项目。但是,当点击todoItem时,文本消失,上面的两个警告显示在控制台中。

研究警告后。我删除了两个文本道具声明,如

import React, { Component, PropTypes } from 'react'
import Todo from './Todo'

export default class TodoList extends Component{
    render(){
        return(
            <ul>
                {this.props.todos.map((todo, index) =>
                    <Todo {...todo}
                        key={index}
                        onClick={() => this.props.onTodoClick(index)} />
                )}

            </ul>
        )
    }
}

TodoList.propTypes = {
  onTodoClick: PropTypes.func.isRequired,
  todos: PropTypes.arrayOf(PropTypes.shape({
    text: PropTypes.string.isRequired,
    completed: PropTypes.bool.isRequired
  }).isRequired).isRequired
}

并且

TodoList.propTypes = {
  onTodoClick: PropTypes.func.isRequired,
  todos: PropTypes.arrayOf(PropTypes.shape({
    completed: PropTypes.bool.isRequired
  }).isRequired).isRequired
} 

之后,警告消失。但是,我的todoItem消失App.propTypes = { visibleTodos: PropTypes.arrayOf(PropTypes.shape({ completed: PropTypes.bool.isRequired }).isRequired).isRequired, ...... } 。请你解决这个问题吗?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

您的错误是由于没有为id项生成todo。所以警告是正确的,并且正确地告诉了什么。

reducers.js添加例如id: Math.random(),您的警告将消失。

整个减速机功能:

function todos(state = [], action) {
  switch (action.type) {
    case ADD_TODO:
        return [
            ...state,
            {
                text: action.text,
                completed: false,
                id: Math.random()
            }
        ]
    // other cases 
  }
}

答案 1 :(得分:0)

如果有人帮助......

我今天正在关注相同的教程并遇到了这个问题。在ADD_TODO中插入一个数字会修复上面提到的错误,但TOGGLE_TODO仍然无效。

我不知道这是否是世界上最好的解决方案,但是当我在相同的 reducers.js 文件中向下移动几行时,我得到了切换工作到case TOGGLE_TODO bit,并将if函数中的state.map语句更改为:

if (todo.id === action.id) { return Object.assign... }