@Pogran

Почему не видит state?

У меня есть такой код
const mapDispatchToProps = (dispatch) => {
	return {
		fetchEntities: (limit, offset) => {
			dispatch(fetchEntities(limit, offset)).then(response => {
				this.setState({data: response.data, pageNum: Math.ceil(response.data.length / 2)});
			}) ;
		},
		requestDeleteEntity: (id) => {
			dispatch(requestDeleteEntity(id));
		}
	}
};


и мне пишет что this - undefined . Как здесь сделать связывание?
  • Вопрос задан
  • 455 просмотров
Решения вопроса 1
maxfarseer
@maxfarseer
https://maxpfrontend.ru, обучаю реакту и компании
Давайте по порядку:
1) this не видит, потому что у стрелочной функции нет своего контекста (пример, учебник)

2) прокидывать this в mapDispatchToProps не нужно. Если вы хотите изменить state опираясь на новые данные, то это нужно делать в componentWillReceiveProps методе.

3) чтобы пришли новые props, вам нужно их обработать в редьюсере, а для этого вам нужно вызывать в mapDispatchToProps ваш экшен-крейтор. То есть mapDispatchToProps будет выглядеть так (обратите внимание на круглые скобки после => , это сделано, чтобы не писать rerturn {...}):
const mapDispatchToProps = (dispatch) => ({
  fetchEntities: (limit, offset) => dispatch(fetchEntities(limit, offset))
})


для этого, конечно же импортировать из actions ваш fetchEntities. В котором у вас promise версия, в которой будете обрабатывать пришедшие данные. Теория по этому поводу здесь, либо можете посмотреть теорию+пример на русском языке здесь.

3.5) В mapStateToProps у вас должно быть соответствующее свойство, в которое вы будете из reducer'a прокидывать ваши новые props, и из-за этого сработает componentWillReceiveProps внутри которого вы сможете вызывать this.setState.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
miraage
@miraage
Старый прогер
Так нельзя писать.
mapDispatchToProps вызывает что-то вроде dispatch({type: 'FETCH_ENTITIES_REQUEST', ... }).
Затем по завершению запросов надо вызвать dispatch({ type: 'FETCH_ENTITIES_SUCCESS', ... }), который обработается редьюсером, и Ваша функция mapStateToProps подхватит изменения.

Пример реализации. (смотрите middleware/api.js)

И еще совет.
Ввиду того, что mapStateToProps вызывается при любых изменениях store, в целях производительности есть смысл использовать библиотеку reselect, чтобы не вызывать холостой render в компонентах, чьи props не изменились по факту.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы