Почему я не могу напечатать сумму чисел из состояния реакции-редукции?

Может кто-нибудь, пожалуйста, помогите мне узнать, почему я не могу отразить «сумму», которая представляет собой сумму двух чисел, переданных из значений поля ввода «numOne» и «numTwo» в пользовательском интерфейсе. Пожалуйста, обратитесь к AddNum.jsx.

Ниже представлен action.js

'use strict';

export const ADD_NUMBERS = 'ADD_NUMBERS';
export const RESET = 'RESET';

export const addNum = () => {
    return {
        "type" : ADD_NUMBERS,
    }
}

export const reset = () => {
    return {
        "type" : RESET
    }
}

Ниже находится AddNumReducer.js.

'use strict';

import {ADD_NUMBERS, RESET} from './action';

const addNumReducer = (state = { "sum" : 0}, action) => {
    console.info(`AddNumReducer: sum ${state.sum}`);
    console.info(`AddNumReducer: action.type ${action.type}`);
    switch(action.type){
        case ADD_NUMBERS:
            return {
                "sum" : state.sum
            }
        case RESET:
            return {
                "sum" : 0
            }
        default:
            return state;    
    }
}

export default addNumReducer;

Ниже находится AddNumContainer.js.

import AddNum from './AddNum';
import * as ActionCreator from './action';
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';

const mapStateToProps = (state) => {
    return {
        "sum" : state.addNums.sum        
    }
}

const mapDispatchToProps = (dispatch) => {
    return {
        "actions" : bindActionCreators(ActionCreator, dispatch)
    }
}

const AddNumContainer = connect(mapStateToProps, mapDispatchToProps)(AddNum); 

export default AddNumContainer;

Ниже приведен редуктор.js

'use strict';

import { combineReducers } from 'redux';
import addNumReducer from './AddNumReducer';

export default combineReducers({
  "addNums" : addNumReducer
});

Ниже находится AddNum.jsx

'use strict';
import React, {Component, Fragment, useState} from 'react';


const AddNum = (props) => {
    const [stateObj, setStateObj] = useState({
        "numOne" : "",
        "numTwo" : ""
    });

    const [counterStyle, setCounterStyle] = useState({
        "fontSize" : "350px",
        "fontWeight" : "bold",
        "color" : "#483d8b"
    });

    const obj = {
        "sum" : props.sum,         
        "actions" : props.actions
    }
    
    const submitForm = () => {
        let total = parseInt(stateObj.numOne) + parseInt(stateObj.numTwo);                               
        obj.actions.addNum({
            "sum" : total
        });
    }

    return (
        <Fragment>
            <form className = "form-inline">
                <div className = "form-group">
                    <label  for = "numOneId" 
                            className = "sr-only">Num One</label>
                    <input  type = "text" 
                            className = "form-control" 
                            id = "numOneId" 
                            placeholder = "Num One" 
                            value = {stateObj.numOne}
                            onChange = {event => setStateObj({
                                ...stateObj,  
                                "numOne" : event.target.value
                            })} />
                </div>
                &nbsp;
                <div className = "form-group">
                    <label  for = "numTwoId" 
                            className = "sr-only">Num Two</label>
                    <input  type = "text" 
                            className = "form-control" 
                            id = "numTwoId" 
                            placeholder = "Num Two"
                            value = {stateObj.numTwo} 
                            onChange = {(event) =>{
                                setStateObj({
                                    ...stateObj,
                                    "numTwo" : event.target.value
                                });
                            }}/>
                </div>
                &nbsp;
                <button type = "button" 
                        className = "btn btn-primary"
                        onClick = {submitForm}>Add</button>
                &nbsp;
                <button type = "button" 
                        className = "btn btn-default"
                        onClick = {obj.actions.reset}>Reset</button>        
            </form>
            <div>
                <span style = {counterStyle}>{obj.sum}</span>
            </div>
        </Fragment>
    )
     
}

export default AddNum;

Ниже находится AddNumUI.jsx

'use strict';
import React, {Component, Fragment} from 'react';
import { createStore } from 'redux';
import { Provider } from 'react-redux';
import AddNumContainer from './AddNumContainer';
import rootReducer from './reducer';

const store = createStore(rootReducer);

const AddNumUI = () => {
    return (
        <Provider store = {store}>
            <AddNumContainer />
        </Provider>
    );
} 

export default AddNumUI;

Если вы используете функции компонентов с хуками, вы можете переключиться на инструментарий React. Это упрощает диспетчеризацию действий.

Mr. Polywhirl 21.03.2022 18:16

Хорошо, но вы можете решить мою проблему, просто просмотрите мой код, пожалуйста

Rahul Shivsharan 21.03.2022 18:18

Ваш редьюсер для ADD_SUM не возвращает другое состояние, поэтому он ничего не сделает с этим действием.

Chad S. 21.03.2022 19:03
Поведение ключевого слова "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) для оценки ваших знаний,...
0
3
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Возникла проблема с вашими действиями и редуктором. Вы не используете значение action.payload в своем действии addNum внутри редуктора. Кроме того, вы не правильно обновляете состояние магазина. Вам нужно распространить существующее состояние, а затем обновить значение sum до нового значения.

AddNum.jsx

const submitForm = () => {
    let total = parseInt(stateObj.numOne) + parseInt(stateObj.numTwo); 
    obj.actions.addNum({
        sum: total       // action.payload.sum
    });
}

action.js

export const ADD_NUMBERS = 'ADD_NUMBERS';
export const RESET = 'RESET';

export const addNum = (value) => {
    return {
        type: ADD_NUMBERS,
        payload: value
    }
}

export const reset = () => {
    return {
        type: RESET
    }
}

AddNumReducer.js

import { ADD_NUMBERS, RESET } from './action';

const initialState = { sum: 0 }

const addNumReducer = (state = initialState, action) => {
    switch (action.type) {
        case ADD_NUMBERS:
            return {
                ...state,
                sum: action.payload.sum
            };
        case RESET:
            return {
                ...state,
                sum: 0
            };
        default:
            return state;
    }
}

export default addNumReducer;

Спасибо, сработало, обязательно посмотрю на react-toolkit

Rahul Shivsharan 22.03.2022 13:59

@RahulShivsharan Извините, редукс-инструментарий, точнее создатьSlice

Mr. Polywhirl 22.03.2022 14:07

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