Действие Redux возвращает undefined

У меня такой редуктор:

export const showResult = (state = [], action) => {
    switch (action.type) {
      case 'GET_NUMBER': 
        return [
          ...state,
          action.n
        ]
      case 'CLEAR_NUMBER':
         return [
          ...state
        ].pop()
      case 'RESET_RESULT': 
        return []
      default:
        return state
    }
  }

случай «CLEAR_NUMBER» выполняется при нажатии «deleteNumber»:

import React, { Component } from 'react'
import Display from './Container'
import Operator from './Container'
import { selectOperator } from './../util'

class Calculator extends Component {
    constructor(props) {
      super(props)

      this.state = {
          val1: '',
          val2: ''
      }

    }
    displayNumber = e => {
        const { getNumber, resetResult, getOperator } = this.props
        getNumber(parseInt(e.target.dataset.n))
    }

    getOperator = e => {
        const { getOperator, n, resetResult, resetOperator } = this.props
        resetOperator()
        getOperator(e.target.dataset.sign)

        if (this.state.val1 == "") {
            this.setState({
                val1: n
            })
            resetResult()
        }

    }
    getSum = val => {
        val.reduce((acc, val) => acc + val)
    }
    deleteNumber = () => {
        const { clearNumber } = this.props
        clearNumber()
    }
    getTotal = () => {
        const { n, operator, resetResult } = this.props,
            { val1, val2 } = this.state,
            value1 = this.getSum(val1),
            value2 = val2 != "" ? this.getSum(val2) : null;
        let operatorVal = operator[0]

        this.setState({ val2: n })
        resetResult()
        selectOperator(operatorVal, value1, value2)

    }
    render() {
        const { n, operator, getNumber } = this.props
        return (
            <div>
                <Display val = {n == "" ? null : n} />
                <Operator val = {operator} />

                {/* NUMBERS */}
                    <p data-n = "1" onClick = {this.displayNumber}>1</p>
                    <p data-n = "2" onClick = {this.displayNumber}>2</p>
                    <p data-n = "3" onClick = {this.displayNumber}>3</p>

                {/* OPERATORS */}
                    <p data-sign = "+" onClick = {this.getOperator}>+</p>
                    <p data-sign = "-" onClick = {this.getOperator}>-</p>
                    <p data-sign = "/" onClick = {this.getOperator}>/</p>
                    <p data-sign = "*" onClick = {this.getOperator}>*</p>
                    <p onClick = {this.getTotal}>equal</p>
                    <p onClick = {this.deleteNumber}>clear</p>
            </div>
        )
    }
}
   
export default Calculator

он по существу удаляет последний элемент из массива (как если бы у вас была четкая функция на калькуляторе).

Я получаю ошибку, когда в массиве остается один элемент:

Действие Redux возвращает undefined

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

Ответы 3

Это красиво, но что делать, если массив пуст? pop вернет undefined, следовательно, ошибка.

case 'CLEAR_NUMBER':
     return [
      ...state
    ].pop()

Обновлено:

case 'CLEAR_NUMBER': {
  if (state.length > 0) {
    return [
      ...state
    ].pop()
  }

  return state;
}

не совсем, я получаю ошибку, даже если в массиве осталось одно число

Alessandro 04.05.2018 12:13

@Alex не могли бы вы сделать простую проверку, как при редактировании? И, кстати, pop возвращает последний элемент из массива, не уверен, знаете ли вы.

Tomasz Mularczyk 04.05.2018 12:16

pop возвращает удаленный элемент, а не измененный массив.

Вам нужно сделать

const newState = [...state];
newState.pop();
return newState;

В качестве альтернативы используйте return state.slice(0, -1).

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

Вы должны использовать это, чтобы избежать такой ошибки:

case 'CLEAR_NUMBER':
  if ([...state].length > 1) {
    return [...state].pop()
  }
  return [] // or return null, but not undefined ie. no explicit return

@Alex это сработало для state.length> = 2? Это изменило бы ваше состояние с массива на элемент ...

Roy Wang 04.05.2018 13:53

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