Running into "TypeError: Cannot read properties of undefined (reading 'num1') (14)"

Running into "TypeError: Cannot read properties of undefined (reading 'num1') (14)"

我不知道我的代码有什么问题,但我 运行 遇到了这个 TypeError。 这是我的代码;我正在尝试创建一个带按钮的简单计算器,但代码尚未完成。

import React, { Component } from 'react';
import { AppRegistry, Text, View, StyleSheet, TextInput, TouchableHighlight, Dimensions } from 'react-native';
import Constants from 'expo-constants';

let deviceHeight = Dimensions.get('window').height;
let deviceWidth = Dimensions.get('window').width;

export default class App extends Component {
    
    state = {
        num1: 0,
        num2: 0,
        operation: '+',
        answer: Number(this.state.num1) + Number(this.state.num2)
    };

第14行出现错误:answer: Number(this.state.num1) + Number(this.state.num2)

    plus = () => {
        this.setState({
            operation: '+'
        }),
        this.setState({
            answer: Number(this.state.num1) + Number(this.state.num2)
        })
    };
    
    minus = () => {
        this.setState({
            operation: '-'
        }),
        this.setState({
            answer: Number(this.state.num1) - Number(this.state.num2)
        })
    };
    
    multiply = () => {
        this.setState({
            operation: 'x'
        }),
        this.setState({
            answer: Number(this.state.num1) * Number(this.state.num2)
        })
    };
    
    divide = () => {
        this.setState({
            operation: '/'
        }),
        this.setState({
            answer: Number(this.state.num1) / Number(this.state.num2)
        })
    };
    
    render() {
        return (
            <View style={styles.container}>
                <Text style={styles.title}>
                    Calculator
                </Text>
                <View style={styles.textInputContainer}>
                    <TextInput style={styles.textInput}
                        keyboardType = 'numeric'
                        onChangeText={(num1) => this.setState({num1})}
                        value={this.state.num1}
                    />
                    
                    <Text style={styles.textInput}>
                        {this.state.operation}
                    </Text>
                    
                    <TextInput style={styles.textInput}
                        keyboardType = 'numeric'
                        onChangeText={(num2) => this.setState({num2})}
                        value={this.state.num2}
                    />
                </View>
                
                <View style={styles.textInputContainer}>
                    
                    <TouchableHighlight
                        style={styles.button}
                        onPress={this.plus}
                    >
                        <Text style={styles.title}>
                            +
                        </Text>
                    </TouchableHighlight>
                </View>
            </View>
        );
    }
}

这是我目前所拥有的,还有一个样式表。如果您发现任何其他错误,我将不胜感激。谢谢。

您正在尝试访问初始设置时的状态。这是不可能的。

因此,

state = {
        num1: 0,
        num2: 0,
        operation: '+',
        answer: Number(this.state.num1) + Number(this.state.num2)
    };

不起作用。由于这是初始状态,您可以将 answer 设置为零。

state = {
        num1: 0,
        num2: 0,
        operation: '+',
        answer: 0
    };

之后可以更改 answer

您的代码中可能还有另一个问题。您将状态设置为不包含对象定义属性的新对象。此外,您为设置 answeroperation 设置了两次状态。这将触发两次重新渲染,这是不必要的。您可以使用 spread-syntax 一次设置所有内容,并覆盖您要覆盖的状态的值。

multiply = () => {
        this.setState(previousState => ({
            ...previousState,
            operation: 'x',
            answer: previousState.num1 * previousState.num2
        })),
    };