【问题标题】:How to prevent state reset while navigating between screens? react native在屏幕之间导航时如何防止状态重置?反应原生
【发布时间】:2021-11-09 23:29:40
【问题描述】:

在 react native 应用程序中,我有一个主屏幕和第二个屏幕,用户可以使用它来添加应在主屏幕上显示的项目。问题是当我在第二个屏幕中添加项目并转到主屏幕时,我可以看到添加的项目,但是当我再次进入第二个屏幕添加其他项目时,它会删除以前添加的项目。

任何帮助解释为什么会发生这种情况以及如何处理它? 提前致谢 这是应用程序的代码。

export default function App() {
  return (
    <NavigationContainer>
      <Stack.Navigator>
        <Stack.Screen name="Home" component={Home} />
        <Stack.Screen name="AddItem" component={AddItem} />
      </Stack.Navigator>
    </NavigationContainer>
  );
}

这是主屏幕组件

class Home extends Component {
  render() {
    const { expenseList } = this.props.route.params || '';
    return (
      <View style={styles.container}>
        <Text style={styles.text}>Budget:</Text>
        <Button
          title="+"
          onPress={() => this.props.navigation.navigate('AddItem')}
        />
        <View>
          {expenseList === '' && (
            <TouchableOpacity
              onPress={() => this.props.navigation.navigate('AddItem')}>
              <Text>Create your first entry</Text>
            </TouchableOpacity>
          )}
          {expenseList !== '' && (
            <FlatList
              style={styles.listContainer}
              data={expenseList}
              renderItem={(data) => <Text> title={data.item.name} </Text>}
            />
          )}
        </View>
      </View>
    );
  }
}

和第二个屏幕

class AddItem extends Component {
  state = {
    name: '',
    amount: '',
    expenseList: [],
  };

  submitExpense = (name, amount) => {
    this.setState({
      expenseList: [
        ...this.state.expenseList,
        {
          key: Math.random(),
          name: name,
          amount: amount,
        },
      ],
    });
  };

  deleteExpense = (key) => {
    this.setState({
      expenseList: [
        ...this.state.expenseList.filter((item) => item.key !== key),
      ],
    });
  };
  render() {
    return (
      <View style={styles.container}>
        <TextInput
          style={styles.input}
          onChangeText={(name) => this.setState({ name })}
          value={this.state.name}
          placeholder="Name"
          keyboardType="default"
        />
        {this.state.name === '' && (
          <Text style={{ color: 'red', fontSize: 12, paddingLeft: 12 }}>
            Name is required
          </Text>
        )}
        <TextInput
          style={styles.input}
          onChangeText={(amount) => this.setState({ amount })}
          value={this.state.amount}
          placeholder="Amount"
          keyboardType="numeric"
        />
        {this.state.amount === '' && (
          <Text style={{ color: 'red', fontSize: 12, paddingLeft: 12 }}>
            Amount is required
          </Text>
        )}
        
        <Button
          title="Add"
          style={styles.btn}
          onPress={() => {
            if (
              this.state.name.trim() === '' ||
              this.state.amount.trim() === ''
            ) {
              alert('Please Enter the required values.');
            } else {
              this.submitExpense(
                this.state.name,
                this.state.amount
              );
            }
             
          }}
        />
        <Button
        title="Go to Dashboard"
          style={styles.btn}
        onPress = {() => { this.props.navigation.navigate("Home", {
                expenseList: this.state.expenseList,
              });}}
        />
        <FlatList
          style={styles.listContainer}
          data={this.state.expenseList}
          renderItem={(data) => <Text> title={data.item.name} </Text>}
        />
      </View>
    );
  }
}

【问题讨论】:

  • 您可以将现有列表作为导航参数发送到第二个屏幕,然后添加到其中并将其作为另一个导航参数发送回来。或者将状态提升到 React.context 并从那里使用它。
  • @windowsill 当我尝试将其发回时,我在此链接中发现了错误reactjs.org/docs/error-decoder.html/?invariant=185

标签: react-native react-navigation react-navigation-v6


【解决方案1】:

你有几个选择:

1- 使用 Redux:

https://react-redux.js.org/using-react-redux/connect-mapstate

2- 将您的状态保存在 AsyncStorage 中,然后随时随地获取

3- 在路由中将您的状态作为参数传递:

navigation.navigate('Details', {
            itemId: 86,
            otherParam: 'anything you want here',
          });

【讨论】:

  • 感谢您的回答,我是 react-native 和 redux 的新手。我之前尝试过使用 redux,但我很难理解和应用它,所以我想我会使用 AsyncStorage 并搜索它。但是,对于选项 3,您在路线中是什么意思?
  • @MennaMagdy 我的建议是使用 Redux,它并不复杂。正如我在回答中提到的那样,当您导航时将状态作为参数传递并从第二条路线的道具中获取它(您已经在代码中使用了它)。但我认为对你来说最好使用 AsyncStorage 传递参数不是一个好的选择,因为你应该把它传回去。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多