React / Redux: Почему мои свойства в this.props не определены?

Я впервые пытаюсь настроить Redux в React, и мне кажется, что я не могу передать свое начальное состояние из хранилища компоненту. Мой файл магазина устанавливает состояние на возвращаемое значение редуктора. Вот что происходит, когда я записываю this.props в консоль

Составная часть

import React from 'react';
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
import { exampleAction } from '../../actions';

class Header extends React.Component {
  constructor(props) {
    super(props);
    this.state = {}
  }

    render() {
      console.info(this.props)
      return (
        <div>
          <p>this is {this.props.examplePropOne}</p>
        </div>
      );
    } 
  }

  const mapStateToProps = state => ({
    examplePropOne: state.examplePropOne,
    examplePropTwo: state.examplePropTwo
  });

  const mapDispatchToProps = dispatch => {
    return bindActionCreators({ exampleAction }, dispatch)
  }

export default connect(mapStateToProps, mapDispatchToProps)(Header);

Редуктор

import { EXAMPLE_ACTION } from './../actions/types'

const initialState = {
  examplePropOne : 'Example Property One',
  examplePropTwo : 'Example Property Two'
}

export default function (state = initialState, action) {
  switch(action.type) {
    case EXAMPLE_ACTION: 
      return {
        ...state,
        examplePropOne: action.payload
      }
    default: 
      return state
  }
}

Действие

import { EXAMPLE_ACTION } from './types'


export const exampleAction = text =>  ({
  type: EXAMPLE_ACTION,
  payload: text,
})

[Редактировать]

Вот что происходит, когда я регистрирую состояние в mapStateToProps

import React from 'react';
import { createStore, combineReducers } from 'redux';
import reducers from '../reducers';


export const store = createStore(
  combineReducers({
    state: reducers
  }),
);

Можете ли вы описать, что регистрируется, если вы помещаете console.info(state); внутрь mapStateToProps()? Вам придется временно немного реструктурировать функцию. Также не могли бы вы рассказать, как вы регистрируете редуктор в своем магазине (createStore())?

Alexander Staroselsky 08.11.2018 23:12

Я добавил это в вопрос, это помогает? В моем вопросе я изменил начальное состояние с «Я свойство один» на «Пример свойства один», поэтому в моем вопросе он регистрируется не так, как в исходном состоянии.

Claire 08.11.2018 23:23
Поведение ключевого слова "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) для оценки ваших знаний,...
1
2
4 428
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

С учетом того, как combineReducers() использовался с state, переданным в качестве ключа, ваш mapStateToProps() должен будет выглядеть следующим образом для доступа к examplePropOne и examplePropTwo:

const mapStateToProps = state => ({
  examplePropOne: state.state.examplePropOne,
  examplePropTwo: state.state.examplePropTwo
});

Учитывая, что combReducers ():

The state produced by combineReducers() namespaces the states of each reducer under their keys as passed to combineReducers()

Проблема в том, что:

export const store = createStore(
  combineReducers({
    state: reducers
  }),
);

Ключ state, переданный в combineReducers(), создает пространство имен / свойство state. Для аргумента state для mapStateToProps() требуется, чтобы свойства были доступны как state.state. Это, вероятно, можно решить, вместо этого присвоив ключу, переданному в combineReducers(), более информативное имя, представляющее то, что используется для управления в магазине. Например, если это связано с аутентификацией, его можно назвать auth. Это выглядело бы так:

export const store = createStore(
  combineReducers({
    auth: reducers
  }),
);

// ...

const mapStateToProps = state => ({
  examplePropOne: state.auth.examplePropOne,
  examplePropTwo: state.auth.examplePropTwo
});

Надеюсь, это поможет!

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