Во-первых, я знаю, что многие вещи в этом фрагменте кода отключены. Я только пытаюсь ответить на этот вопрос. По какой-то причине мое приложение сообщает, что не может читать свойство todo для undefined, и выделяет todos: [... state.todos] в моем методе mapStateToProps в Form.js. Разве я не импортирую то, что должен быть здесь?
Form.js
import React, { Component } from 'react';
import { connect } from 'react-redux';
import uuidv1 from 'uuid';
import { addTodo } from '../actions';
import TodoInput from './todo-input';
import TodoList from './TodoList';
const mapDispatchToProps = dispatch => {
return {
addTodo: todo => dispatch(addTodo(todo))
};
};
const mapStateToProps = (state) => ({
todos: [...state.todos]
})
class ConnectedForm extends Component {
constructor(props){
super(props);
this.state = {
inputValue: ''
}
this.handleChangeEvent = this.handleChangeEvent.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
this.handleToggle = this.handleToggle.bind(this);
};
handleChangeEvent = (e) => {
e.preventDefault();
this.setState({
inputValue: e.target.value
});
}
handleSubmit = (e) => {
e.preventDefault();
const { inputValue} = this.state;
const id = uuidv1();
this.props.addTodo({inputValue, id});
this.setState({inputValue: ''});
}
handleToggle (e) {
const id = parseInt(e.target.id);
this.setState((prevState) => ({
todos: prevState.todos.map(todo => todo.id === id ? {...todo, done: !todo.done} : todo)
}));
console.info(e.target);
}
render() {
const { inputValue } = this.state;
return (
<div className='form-group'>
<TodoInput
value = {inputValue}
onChange = {this.handleChangeEvent}
onSubmit = {this.handleSubmit}
/>
<TodoList />
</div>
);
}
}
const Form = connect(mapStateToProps, mapDispatchToProps) (ConnectedForm);
export default Form;
TodoList.js
import React, { Component } from 'react';
import TodoItem from './TodoItem';
import { removeTodo, toggleComplete } from '../actions';
import { connect } from 'react-redux';
const mapDispatchToProps = dispatch => {
return {
removeTodo: id => dispatch(removeTodo(id)),
toggleComplete: isDone => dispatch(toggleComplete(isDone))
};
};
const mapStateToProps = state => {
return {todos: [...state.todos]};
};
class List extends Component {
render() {
const mappedTodos = this.props.todos.map((todo, index) => (
<TodoItem
todo = {todo}
title = {todo.title}
key = {index}
removeHandler = {this.props.removeTodo}
toggleComplete = {this.props.toggleComplete}
/>
));
return (
mappedTodos
);
}
}
const TodoList = connect(mapStateToProps, mapDispatchToProps) (List)
export default TodoList;
Редукторы
import { ADD_TODO, REMOVE_TODO, TOGGLE_COMPLETE } from '../constants/action-types';
import uuidv1 from 'uuid';
const initialState = {
todos: []
};
const rootReducer = (state = initialState, action) => {
switch (action.type) {
case ADD_TODO:
return {
...state,
todos: [...state.todos,
{
title: action.payload.inputValue,
id: uuidv1(),
createdAt: Date(),
priority: '',
deadline: '',
isComplete: false
}]
}
case REMOVE_TODO:
return {
...state,
todos: [...state.todos.filter(todo => todo.id !== action.payload)]
}
case TOGGLE_COMPLETE:
return (
console.info(action.payload)
)
default:
return state;
}
На самом деле это не имеет значения. Смотрите здесь: return ( console.info(action.payload) ). Возможно, у вас есть опечатка, но вы возвращаете результат функции console.info.
О, черт возьми, какая уловка! СПАСИБО, хахаха
Возможно, вы захотите использовать какой-нибудь JS-линтер, чтобы помочь вам отловить такие ошибки, все еще печатая. По мере роста проекта становится все труднее увидеть их в одиночку.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Прежде всего, ваш вопрос не так ясен, потому что вы не говорите, откуда именно возникает ошибка, но в целом я вижу, что на handleToggle в ConnectedForm class вы пытаетесь перебрать prevState.todos, но еще в состоянии что class, у вас нет никакого свойства todos, и вы не установили его где-либо в этом class. Следовательно, вы пытаетесь получить доступ к todo, который на самом деле нигде не определен в вашем state.
Я сказал «выделяет задачи: [... state.todos] в моем методе mapStateToProps в Form.js».
И также, как я уже сказал в вопросе, я знаю, что многое не имеет смысла, класс handleToggle, который вы видите, был создан до того, как я начал рефакторинг своего кода, чтобы включить сокращение. Этот метод ничего не делает и ни к чему не привязан. Но спасибо, что напомнил мне вынуть его.
имеет смысл, что вы сейчас проводите рефакторинг, чтобы включить redux
Да, я еще новичок во всем этом. Ха-ха
Это происходит сразу после загрузки страницы или после некоторого взаимодействия с пользовательским интерфейсом?