Как успешно получить выпадающий выбор, чтобы вызвать отправку действия в реагировать-редуктора - PullRequest
0 голосов
/ 11 сентября 2018

Я запустил простую систему React / Redux с использованием response-redux, в основном скопированную с примеров.(В конечном итоге я хочу разработать более сложную систему, для которой будет подходить redux.)

У меня есть вещи, называемые Places, с идентификатором placeCode.Все детали каждого Места хранятся в базе данных Мест на сервере.В целом все работает нормально (с большой помощью документации и блогов).Однако я не могу выяснить, как сделать то, что, как я ожидал, было простым.

Существует placeReceived action и процедура fetchPlace для поиска базы данных на сервере, чтобы получить Place.record

function placeReceived(place) {
  return {
    type: actionTypes.PLACE_RECEIVED,
    place,
  };
}

export function fetchPlace(placecode) {
  return dispatch => fetch(`/places/${placecode}`)
    .then(response => response.json())
    .then(data => dispatch(placeReceived(data.data)))
    .catch(e => console.log(e));
}

Соответствующая часть редуктора равна

const initialState = {
  place: { placeCode: 'HcN' },
};

export default (state = initialState, action) => {
  const updated = { ...state };

  switch (action.type) {
    case constants.PLACE_RECEIVED:
      updated.place = action.place;
      return updated;

    default:
      return state;
  }
};

Один компонент - PlaceDetails, который показывает placeCode и placeName.

import React, { Component, Fragment } from 'react';
import { connect } from 'react-redux';

class PlaceDetails extends Component {

  render() {
    const place = this.props ? this.props.place : { placeCode: '' };
    const placeName = place.placeCode ? `${place.placeCode} ${place.placeName}` : 'Missing Place';

    return (
      <Fragment>
        {placeName}
      </Fragment>
    );
  }
}

const mapStateToProps = state => ({
  place: state.plac.place,
});

export default connect(mapStateToProps)(PlaceDetails);

Если я соединю их вместе, поместив

  componentDidMount() {
    const { dispatch } = this.props;
    dispatch(fetchPlace('BBR'));
  }

в класс PlaceDetails для поиска постоянного Place, тогда все это будет работать, и PlaceDetails покажет BBR и его placeName посмотрел вверхиз базы данных.

Однако я хочу выбрать placeCode с помощью раскрывающегося списка (на самом деле это каскад Ant Design), и я предположил, что могу просто вызвать fetchPlace в onChange() изэтот выпадающийКаскад работает отлично, и это, безусловно, вызывает fetchPlace с правильным аргументом, однако я не вижу никаких признаков того, что место является неправдоподобным (PlaceDetails упорно продолжает показывать свои по умолчанию, и контрольные точки не показаны действия, которые направляются).

1027 * Iчувствую, что я не понимаю некоторые основы React или Redux.

Как мне получить выбор в раскрывающемся списке, чтобы инициировать выборку места и, следовательно, обновление PlaceDetails?

Обновление

По просьбе стрельцов я создал урезанную песочницу моего клиента.Я новичок во всем этом, так что это заняло некоторое время.

Я не вижу, как поместить сервер node.js в песочницу, поэтому я предполагаю, что мне нужно найти способ, чтобы высмеивать выборки,Я посмотрел на sinon-stub-обещание и MockServer, и они кажутся сложными.fetch-mock кажется проще, но я еще не пробовал.Любой совет приветствуется, иначе, когда я настрою макеты, я снова обновлю этот вопрос.

1 Ответ

0 голосов
/ 14 сентября 2018

Я чувствую, что не понимаю некоторые основы React или Redux.

Как это было правдой. После нескольких дней исследований и чтения, и особенно учебного пособия Валентино и рефакторинга с шаблоном контейнера / представления, у меня теперь работает моя маленькая система.

Оказывается, то, что я следовал вначале, помогло мне с mapStateToProps, но важность mapDispatchToProps прошла мимо меня.

Кроме того, CodeSandbox кажется очень полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...