我不能将多个状态项传递到其他屏幕?

I can't pass multiple state items to other screen?

提前感谢阅读。

我正在处理的这个 React Native 项目中有 2 个屏幕。一个是“输入”屏幕,我在其中输入了一些文本以从用户那里收集数据。另一个是“输出”屏幕,它只是在屏幕上显示用户在“输入”屏幕上输入的文本。

我一开始只在“输入”屏幕上输入一个文本,然后我能够将其发送到“输出”屏幕并成功显示。

当我想在“输入”屏幕上添加更多文本输入时出现问题,因为我需要更多数据。

一旦我这样做并尝试发送所有数据(而不是只发送最初的一条数据),出于某种原因而不是成功检索所有 3 条数据,只有在“输出”屏幕上成功显示的数据是 我在按下提交之前输入的最后一个输入

这是输入屏幕:

import { Text, StyleSheet, View, TextInput, Button } from "react-native";


export default class InputScreen extends React.Component {

    constructor(props) {
        super(props);
        this.state = {
            home: {
                h1: "",
                h2: "",
                h3: "",
                h4: "",
                h5: "",
                h6: "",
                h7: "",
                h8: "",
                h9: "",
                h10: "",
                h11: ""
            },
            away: {
                a1: "",
                a2: "",
                a3: "",
                a4: "",
                a5: "",
                a6: "",
                a7: "",
                a8: "",
                a9: "",
                a10: "",
                a11: ""
            }
        };
    }

    static navigationOptions = {
        title: "Input",
        headerStyle: {
            backgroundColor: "red"
        },
        headerTitleStyle: {
            fontWeight: "bold"
        }
    };

    render() {
        const { navigate } = this.props.navigation;
        return (
            <View style={styles.container}>
                <TextInput 
                value={this.state.home.h1}
                onChangeText={inputtedValue => this.setState({...this.state, home: {h1: inputtedValue}})}
                placeholder="Enter your first home fake iMessage here"
                style={styles.textInput}
                />
                <TextInput 
                value={this.state.home.h2}
                onChangeText={inputtedValue => this.setState({...this.state, home: {h2: inputtedValue}})}
                placeholder="Enter your second home fake iMessage here"
                style={styles.textInput}
                />
                <TextInput 
                value={this.state.home.h3}
                onChangeText={inputtedValue => this.setState({...this.state, home: {h3: inputtedValue}})}
                placeholder="Enter your third home fake iMessage here"
                style={styles.textInput}
                />
                <View style={styles.buttonStyle}>
                    <Button
                    title="Submit"
                    onPress={() => 
                    this.props.navigation.navigate('Output', {
                        h1: this.state.home.h1,
                        h2: this.state.home.h2,
                        h3: this.state.home.h3,
                        otherParam: '101'
                    })
                    }
                    />
                </View>
            </View>
        );
    }
}

const styles = StyleSheet.create({  
    container: {  
        flex: 1,  
        backgroundColor: '#fff',  
        alignItems: 'center',  
        padding: 16,  
    },  
    textInput: {  
        height: 45,width: "95%",borderColor: "gray",borderWidth: 1,fontSize:20,  
    },  
    buttonStyle:{  
        width: "93%",  
        marginTop: 50,  
        backgroundColor: "red",  
    }  
});  

这是输出屏幕:

import React from "react";
import { Text, View, Button, StyleSheet } from "react-native";


export default class OutputScreen extends React.Component {
  static navigationOptions = {
    title: "Ouput",
    headerStyle: {
      backgroundColor: "green"
    },
    headerTitleStyle: {
      fontWeight: "bold"
    }
  };

  render() {
    const { navigation } = this.props;
    const home_message_one = navigation.getParam("h1", "no message");
    const home_message_two = navigation.getParam("h2", "no message");
    const home_message_three = navigation.getParam("h3", "no message");
    const home_message_four = navigation.getParam("h4", "no message");
    const home_message_five = navigation.getParam("h5", "no message");
    const home_message_six = navigation.getParam("h6", "no message");
    const home_message_seven = navigation.getParam("h7", "no message");
    const home_message_eight = navigation.getParam("h8", "no message");
    const home_message_nine = navigation.getParam("h9", "no message");
    const home_message_ten = navigation.getParam("h10", "no message");
    const home_message_eleven = navigation.getParam("h11", "no message");
    const other_param = navigation.getParam("otherParam", "some default value");
    return (
      <View style={{ flex: 1, alignItems: "center", justifyContent: "center" }}>
        <Text style={{ marginTop: 16,fontSize: 20,}}>
          This is output screen and we recieve value from input screen
        </Text>
        <Text style={styles.textStyle}>Home Message One: {JSON.stringify(home_message_one)}</Text>
        <Text style={styles.textStyle}>Home Message Two: {JSON.stringify(home_message_two)}</Text> 
        <Text style={styles.textStyle}>Home Message Two: {JSON.stringify(home_message_three)}</Text>      
        <Text style={styles.textStyle}>Home Message Four: {JSON.stringify(home_message_four)}</Text> 
        <Text style={styles.textStyle}>Home Message Five: {JSON.stringify(home_message_five)}</Text> 
        <Text style={styles.textStyle}>Home Message Six: {JSON.stringify(home_message_six)}</Text> 
        <Text style={styles.textStyle}>Home Message Seven: {JSON.stringify(home_message_seven)}</Text> 
        <Text style={styles.textStyle}>Home Message Eight: {JSON.stringify(home_message_eight)}</Text> 
        <Text style={styles.textStyle}>Home Message Nine: {JSON.stringify(home_message_nine)}</Text> 
        <Text style={styles.textStyle}>Home Message Ten: {JSON.stringify(home_message_ten)}</Text> 
        <Text style={styles.textStyle}>Home Message Eleven: {JSON.stringify(home_message_eleven)}</Text> 
        {/* <Text style={styles.textStyle}>Other Param: {JSON.stringify(other_param)}</Text> */}
        <View style={styles.buttonStyle}>
          <Button 
            title="Go back"
            onPress={() => this.props.navigation.goBack()}
            />
            </View>
            </View>
    );
  }
}

const styles = StyleSheet.create({  
  textStyle: {  
      fontSize: 23,  
      textAlign: 'center',  
      color: '#f00',  
  },  

  buttonStyle:{  
      width: "93%",  
      marginTop: 50,  
      backgroundColor: "red",  
  }  
});  

谁能帮我理解为什么所有 3 条数据都没有被成功显示,而是只有我在按下提交之前输入的最后一个文本输入的数据?我可以吗需要创建表格或其他东西?

谢谢, 马克

每个输入都覆盖嵌套状态。

onChangeText={inputtedValue => this.setState({
  ...this.state,
  home: {
    h1: inputtedValue, // <-- drops h2, h3, h4, ...etc...
  },
})}

React 处理根属性的浅合并,但不会比这更深,因此您需要浅复制正在更新的嵌套状态。

<TextInput 
  value={this.state.home.h1}
  onChangeText={inputtedValue => this.setState(prevState => ({
    home: {
      ...prevState.home, // <-- copies h2, h3, h4, ...etc...
      h1: inputtedValue
    },
  }))}
  placeholder="Enter your first home fake iMessage here"
  style={styles.textInput}
/>

输入画面

import { Text, StyleSheet, View, TextInput, Button } from "react-native";


export default class InputScreen extends React.Component {

    constructor(props) {
        super(props);
        this.state = {
            home: {
                h1: "",
                h2: "",
            }
        };
    }



    render() {
        const { navigate } = this.props.navigation;
        return (
            <View>
                <TextInput 
                value={this.state.home.h1}
                onChangeText={inputtedValue => this.setState({home: {...this.state.home,h1: inputtedValue}})}
                />
                <TextInput 
                value={this.state.home.h2}
                onChangeText={inputtedValue => this.setState({home: {...this.state.home,h2: inputtedValue}})}
                />
                <View>
                    <Button
                    title="Submit"
                    onPress={() => {
                    navigate('Output', {...this.state.home})
                    }}
                    />
                </View>
            </View>
        );
    }
}

输出画面

如果您使用 class 个组件

class OutputScreen extends React.component{
constructor(props){}
render(){
   const params = this.props.route.params;
   return <Text>h1:{params?.h1} || h2: {params?.h2}</Text>
   }
}
export default OutputScreen;

如果您使用功能组件

const OutputScreen = ()=>{
 const route = useRoute();
 const {params} = route;
 return <Text>h1:{params?.h1} || h2: {params?.h2}</Text> 
}
export default OutputScreen;