redux mapDispatchToProps не обновляет состояние - PullRequest
1 голос
/ 18 апреля 2020

Я новичок в редуксе и столкнулся с проблемой с mapDispatchToProps, в моем приложении для реагирования есть компонент с разными div, каждый раз, когда пользователь щелкает div, он должен менять выбранный цвет через аргумент, который затем передается вниз опять как опора.

Я получаю реквизит из исходного состояния, но не могу заставить mapDispatchToProps работать должным образом. кажется, что есть разные способы обработки mapDispatchToProps, я пробовал несколько, но ни один из них не работал, вот то, что у меня есть на данный момент, без ошибок, но все еще не функционирующий

компонент:

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

const ColorPalette = ({ selectedColor, changeSelectedColor }) => {

    return(
        <div>
            <div className='flex justify-center mb-2'>
                <p>Selected color: {selectedColor}</p>
            </div>
            <div className='flex justify-center mb-2'>
                <button onClick={() => changeSelectedColor('test')} className='border border-black'>
                   click to change
                </button>
            </div>
        </div>
    )
}

const mapStateToProps = (state) => {
    return { 
        selectedColor: state.colorReducer.selectedColor, 
    }
}

const mapDispatchToProps = (dispatch) => {
    return {
        changeSelectedColor: (color) => dispatch(changeSelectedColor(color))    
    }
}

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

редуктор:

import { combineReducers } from "redux";

const initialState = {
  selectedColor: 'black',
};

const colorReducer = (state = initialState, action) => {
    switch(action.payload) {
        case 'SET_SELECTED_COLOR':
            console.log('changing color to ', action)
            return {...state, selectedColor: action.payload};
        default:
            return state;
    }       
}

export default combineReducers({
  colorReducer,
});

действие:

export const changeSelectedColor = (color) => {
    return {
        type: 'SET_SELECTED_COLOR',
        payload: color
    }
}

Я также попытался передать mapDispatchToProps как объект, и в этом случае каждая функция должна автоматически переноситься с отправкой если я правильно понял? а также не передавая второй аргумент для подключения и имея диспетчеризацию в качестве реквизита, отправляя действие непосредственно по щелчку, но, как я сказал, оба метода завершились неудачно

1 Ответ

2 голосов
/ 18 апреля 2020

Проблема связана с вашим редуктором:

const colorReducer = (state = initialState, action) => {
    switch(action.type) { // <== here should be type not payload
        case 'SET_SELECTED_COLOR':
            console.log('changing color to ', action)
            return {...state, selectedColor: action.payload};
        default:
            return state;
    }       
}

Предложение (не связано с ответом)

напишите свои функции подключения, как показано ниже:

const mapStateToProps = ({ colorReducer: { selectedColor } = {} }) => ({ 
  selectedColor, 
});

const mapDispatchToProps = dispatch => ({
  changeSelectedColor: color => dispatch(changeSelectedColor(color)),
});

Также ваши действия и редуктор:

export const changeSelectedColor = payload => ({
  type: 'SET_SELECTED_COLOR',
  payload,
});
const colorReducer = (state = initialState, { type, payload }) => {
  switch (type) {
    case 'SET_SELECTED_COLOR':
      return { ...state, selectedColor: payload };
    default:
      return state;
  }
};

Используйте присвоение реструктуризации в ReactJS, оно настолько распространено и делает ваши коды более читабельными и более удобными для отладки.

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