Задать вопрос
@glebvvs

Почему не перерендеривается React компонент после диспатча в Redux?

Проблема в том, что после диспатча в декораторе connect() в redux происходят изменения и эти изменения можно словить к примеру если напрямую подписаться к redux и получить состояние хранилища, но в свойствах самого компонента, который вызвал диспатч изменения не происходят и компонент не перерендериватся...

В чем может быть проблема?

Вот мой главный компонент...

import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import Login from './auth/Login'
import Registration from './auth/Registration'
import { Provider } from 'react-redux';
import { createStore } from 'redux';

let myStore = function(state = ['test'], action) {
	if ( action.type === 'ADD_TEXT' ) {
		state.push(action.payload);
		return state;
	}
	return state;
};

const store = createStore(myStore);

store.subscribe(() => {
	console.log(store.getState());//после dispatch внутри компонента Login состояни ехранилища меняется
});

export default class Main extends Component {

	constructor(props) {
		super(props);
	}

	renderForGuest() {
		return (
			<Provider store={store}>
				<div className="auth">
					<Login />
					<Registration />
				</div>
			</Provider>
		);
	}

	render() {
		return this.renderForGuest();
	}
}


//вот компонент, где вызывается диспатч к редаксу
import React, { Component } from 'react';
import { connect } from 'react-redux';

class Login extends Component {

	constructor(props) {
		super(props);

		this.state = {
			errorMessagesForForm: null
		};
	}

	submitForm(event) {
		event.preventDefault();
		this.props.onSubmitForm();


	}

	render() {
		return (
			<div className="login">

				<ul>
					{
						this.props.testStore.map((text, index) => (
							<li key={index}>{text}</li>
						))//а этот список не перерендеривается после dispatch
					}
				</ul>

				<form>
					<div><input className="form-field" type="text" placeholder="username" /></div>
					<div><input className="form-field" type="password" placeholder="password" /></div>
					<button onClick={this.submitForm.bind(this)}>Login</button>
				</form>
			</div>
		);
	}

}

export default connect(
	state => ({
		testStore: state
	}),
	dispatch => ({
		onSubmitForm: () => {
			dispatch({type: 'ADD_TEXT', payload: 'wtf'});
		}
	})
)(Login);
  • Вопрос задан
  • 1132 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
@webe
frontend
glebvvs,

state.push(action.payload);
    return state;


замени на:

return [...state, action.payload];
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы