Основная проблема в том, что ваши флажки не являются контролируемыми входами . Вы просматриваете свойство completed
, чтобы увидеть, установлены ли флажки, но их значения не связаны с этим свойством и не обновляют состояние при их изменении. Вам нужно будет передать это значение входным данным как его свойство checked
и добавить обработчик onChange
, чтобы сохранить его текущим:
{todos.map((todo, index) => {
return (
<li key={todo.id}>
// checkbox should be toggling here when somene clicks on the selectAll checkbox.
<input type="checkbox" checked={todo.completed} onChange={() => checkTodo(index)}/>
{todo.text}
<span onClick={e => removeTodo(todo.id, 1)}>x</span>
</li>
)
} )}
А для обработчика вам нужно добавить новое действие и регистр редуктора:
case 'CHECK_TODO':
const copy = Array.from(state);
copy[action.index].completed = !copy[action.index].completed;
return copy;
break;
Вам, конечно, нужно добавить индекс к действию или использовать идентификатор, если хотите, и сопоставить его отправку. Также, как указал Junius , убедитесь, что вы правильно ссылаетесь на свои реквизиты, но я не думаю, что вам нужен this
для функционального компонента, и, возможно, я просто никогда не видел его раньше, но я не думайте, что JSX-компонент будет отображаться без скобок:
const CheckAll = (props) => {
return (
<div>
<TodoList/> <input type="checkbox" onChange={e => {
e.preventDefault();
props.selectAll()
}}/>
</div>
)
}