MapStateToProps неопределенное значение состояния?

Во-первых, я знаю, что многие вещи в этом фрагменте кода отключены. Я только пытаюсь ответить на этот вопрос. По какой-то причине мое приложение сообщает, что не может читать свойство 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;
  }

Это происходит сразу после загрузки страницы или после некоторого взаимодействия с пользовательским интерфейсом?

Al.G. 18.12.2018 20:57

На самом деле это не имеет значения. Смотрите здесь: return ( console.info(action.payload) ). Возможно, у вас есть опечатка, но вы возвращаете результат функции console.info.

Al.G. 18.12.2018 20:58

О, черт возьми, какая уловка! СПАСИБО, хахаха

Cole Gonzales 18.12.2018 21:03

Возможно, вы захотите использовать какой-нибудь JS-линтер, чтобы помочь вам отловить такие ошибки, все еще печатая. По мере роста проекта становится все труднее увидеть их в одиночку.

Al.G. 18.12.2018 23:53
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
257
1

Ответы 1

Прежде всего, ваш вопрос не так ясен, потому что вы не говорите, откуда именно возникает ошибка, но в целом я вижу, что на handleToggle в ConnectedForm class вы пытаетесь перебрать prevState.todos, но еще в состоянии что class, у вас нет никакого свойства todos, и вы не установили его где-либо в этом class. Следовательно, вы пытаетесь получить доступ к todo, который на самом деле нигде не определен в вашем state.

Я сказал «выделяет задачи: [... state.todos] в моем методе mapStateToProps в Form.js».

Cole Gonzales 18.12.2018 21:29

И также, как я уже сказал в вопросе, я знаю, что многое не имеет смысла, класс handleToggle, который вы видите, был создан до того, как я начал рефакторинг своего кода, чтобы включить сокращение. Этот метод ничего не делает и ни к чему не привязан. Но спасибо, что напомнил мне вынуть его.

Cole Gonzales 18.12.2018 21:31

имеет смысл, что вы сейчас проводите рефакторинг, чтобы включить redux

Dennis Wanjiru 18.12.2018 21:37

Да, я еще новичок во всем этом. Ха-ха

Cole Gonzales 19.12.2018 18:18

Другие вопросы по теме