请我尝试使用示例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,
......
}
。请你解决这个问题吗?任何帮助将不胜感激。
答案 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... }