在React Native中添加数据并保存状态

时间:2018-06-19 17:10:53

标签: reactjs react-native react-navigation

我正在构建一个基本的React Native应用程序,在该应用程序中,用户在TextInput中输入其名称,然后在按下按钮时将其名称及其图像添加到另一个View的ScrollView中。图像的存储和命名要与人的名字一致。示例-名称:“ ABC”,从资产中获取的图像将是“ ABC.jpg”。

我能够做到一个人,但是每次添加新条目时,上一个条目都会被覆盖。如何保留上一个条目但又添加另一个条目?

首页

import React, {Component} from 'react';
import { StyleSheet, Text, View, Image, ScrollView, Button, TouchableWithoutFeedback, TextInput} from 'react-native';
import { createStackNavigator } from 'react-navigation';

class HomeScreen extends React.Component {
    render() {
        const { navigation } = this.props;
        const name0 = navigation.getParam('name0', 'NO-ID');
        return (
            <View style={styles.container}>
              <ScrollView vertical={true} contentContainerStyle={{flexGrow: 1}}>
              <Text style={styles.category}>Category 1</Text>


              <ScrollView horizontal={true} showsHorizontalScrollIndicator={false}>
                  <TouchableWithoutFeedback onPress={() => {
                        this.props.navigation.navigate('Details', {
                        name: name0,
                        intro: 'lorem ipsum',
                        detail1: 'XYZ',
                        detail2: 'ABC',
                        });
                  }}>
                  <View style={styles.view}>
                      <Image source={require('./assets/rohit.jpg')} style={styles.image}></Image>
                      <Text style={styles.text}>{name0}</Text>
                  </View>
                  </TouchableWithoutFeedback>
                  </ScrollView>



              </ScrollView>
            </View>
        )
    }
}

添加数据

class AddData extends React.Component {
    constructor(props) {
    super(props);
    this.state = { text: '' };
}
  render() {
      function onPressLearnMore() {
          alert('Hi')
      }
    return (
      <View style={{flex: 1, flexDirection: 'column', justifyContent:'center', alignItems: 'center'}}>
          <TextInput
          style={{height: 40,width:200}}
          onChangeText={(text) => this.setState({input: text})}
        />
        <Button
        onPress={() => {
              this.props.navigation.navigate('Home', {
              name0: this.state.input
              });
        }}
        title="Pass Data"
        />

      </View>
    );
  }
}

导航器

const RootStack = createStackNavigator(
  {
    Home: HomeScreen,
    Details: DetailsScreen,
    Data: AddData
  },
  {
    initialRouteName: 'Data',
  }
);

export default class App extends React.Component {
  render() {
    return <RootStack />;
  }
}

Screen 1 Screen 2

1 个答案:

答案 0 :(得分:1)

因为您没有从任何地方的用户输入中保存数据,只是将其传递回首页,它就会被覆盖,并且随着代码的建立,它就可以工作了! ;)

简单地在执行操作时使用创可贴,因为这种传递数据的方法有点禁忌..如果没有某种状态持久性(如AsyncStorage或...),您就无法实现您所要的内容有两个屏幕。因为每次React重新渲染屏幕时,状态对象中的所有数据都会消失...

在home组件内部,在进行装载后,您可以将用户输入存储为状态,作为数组内的对象。在下面的示例中,我使用的是您发送回家庭的用户数据,但这需要从某种持久性中检索出来。

class HomeScreen extends React.Component {
constructor(props) {
super(props)
this.state = {
  usersArray: []
}
}
componentDidMount() {
  let userInfo = this.props.navigation.getParam('name0', 'NO-ID');
  userInfo !== undefined ? this.setState({usersArray: 
[...this.state.usersArray, userInfo]}) : console.log('NO USER DATA to add')
}
render() {
    const { navigation } = this.props;
    const name0 = navigation.getParam('name0', 'NO-ID');
    return (
        <View style={styles.container}>
          <ScrollView vertical={true} contentContainerStyle={{flexGrow: 1}}>
          <Text style={styles.category}>Category 1</Text>


          <ScrollView horizontal={true} showsHorizontalScrollIndicator={false}>
              <TouchableWithoutFeedback onPress={() => {
                    this.props.navigation.navigate('Details', {
                    name: name0,
                    intro: 'lorem ipsum',
                    detail1: 'XYZ',
                    detail2: 'ABC',
                    });
              }}>
              <View style={styles.view}>
                  <Image source={require('./assets/rohit.jpg')} style={styles.image}></Image>
                  {/* <Text style={styles.text}>{name0}</Text> */}
                 { this.state.usersArray.map((ele, index) => {
                    return <Text key={index} style={styles.text}>{ele.name}</Text>

                  })}
              </View>
              </TouchableWithoutFeedback>
              </ScrollView>



          </ScrollView>
        </View>
    )
  }
}

请记住,您可能需要将用户数据更改为该对象的对象,然后才能正常工作。