Please i am trying the example Here as a react-react tutorial. The code works , however, when
onTodoClick
Warning: Failed propType: Required prop
was not specified in
. Check the render method of
.
Warning: Failed propType: Required prop
was not specified in
. Check the render method of
.
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)
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
}
App.propTypes = {
visibleTodos: PropTypes.arrayOf(PropTypes.shape({
completed: PropTypes.bool.isRequired
}).isRequired).isRequired,
......
}
onTodoClick
Your error is due to that no id
is generated for a todo
item. So the warning is correct and is telling what is missing correctly.
In reducers.js
add for example id: Math.random()
and your warning will dissapear.
Whole reducer function:
function todos(state = [], action) {
switch (action.type) {
case ADD_TODO:
return [
...state,
{
text: action.text,
completed: false,
id: Math.random()
}
]
// other cases
}
}