【问题标题】:React Native: Send component state to other component using Tab NavigatorReact Native:使用 Tab Navigator 将组件状态发送到其他组件
【发布时间】:2017-12-19 10:29:29
【问题描述】:

我有一个组件可以添加待办事项 AddTodo,它可以正常工作并使用我添加的待办事项更新状态,我有一个组件 TodoItems 可以在<FlatList/> 中显示待办事项.我正在使用 React Native Tab Navigator 在组件之间切换,但我不确定如何将状态 this.state.todosAddTodo 组件发送到 TodoItems 组件。

我一直在研究,但在 Tab Navigator 中找不到解决方案,但 Stack Navigator 有很多解决方案。


组件添加待办事项

export default class AddTodo extends Component {

    constructor(props) {
       super(props);
       this.state = {
           todoText: null,
           todos: []
       }
    }

    onAdd = () => {
        if (this.state.todoText) {
            this.state.todos.push({'todoItem': this.state.todoText});
            this.setState({todos: this.state.todos});
        }
    }

    render() {
        return(
             <View>
                  <TextInput onChangeText={(text) => {
                       this.setState({todoText: text});
                  }} />
                  <TouchableOpacity onPress={() => {
                       this.onAdd;
                  }}>
             </View>
        );
    }

}

组件 TodoItems

export default class TodoItems extends Component {

    constructor(props) {
       super(props);
       this.state = {
           todosList: []
       }
    }

    render() {
        return(
            <View>
                  <FlatList
                      data={this.state.todosList}
                      renderItem={(item, index) => {
                          <Text>{item.todoItem}</Text>
                      }} 
                  />
            </View>
        );
    }

}

组件标签

import {TabNavigator} from 'react-navigation';
import AddTodo from "./AddTodo";
import TodoItems from "./TodoItems";

var myTabs = TabNavigator(
    {
    'AddTodo':{screen: AddTodo,},
    'TodoItems':{screen: TodoItems, },
    },
    {
    tabBarPosition: 'top',
    swipeEnabled: false,
    tabBarOptions: {
        labelStyle:{
            fontSize: 13,
            fontWeight: 'bold',

        },
        indicatorStyle: {
            borderBottomColor: '#003E7D',
            borderBottomWidth: 2,
        },
        style:{
            backgroundColor: '#F30076',
            elevation: 0,
        },
    },
});


export default myTabs;

【问题讨论】:

  • 为什么 AddTodo 和 TodoItems 是独立的组件?
  • 因为我希望它们是两个不同的屏幕

标签: javascript android ios react-native


【解决方案1】:

我认为你有两个选择:

  1. 您可以使用 Redux,它允许您全球化您的状态对象,以便您可以在整个应用程序中使用它们,但它可能相当复杂 https://redux.js.org/
  2. 或者您可以在 AddTodo 中渲染 TodoItems:

    render() {
      return(
         <View>
              <TextInput onChangeText={(text) => {
                   this.setState({todoText: text});
              }} />
              <TouchableOpacity onPress={() => {
                   this.onAdd;
              }}>
         </View>
         <TodoItems data={this.state.todos} />
      );
    }
    

然后您可以从 TodoItems 中访问该数据: 希望这会有所帮助!

【讨论】:

  • 是的,我看到很多人说在类似的问题上使用 Redux。你是不是建议我不应该有两个标签,而只有一个?
  • @Omer 我认为您可以在一个屏幕上拥有添加功能和平面列表。当用户添加一个项目时,它会出现在平面列表中,他们不需要导航到其他任何地方来查看这些数据。对于用户而言,最简单、最整洁的往往是最好的。
  • 完全同意...我现在可能需要更改设计:/
  • 顺便说一句,我在另一个应用程序中使用 Stack Navigator 实现了这一点。希望标签导航也能做到这一点:(
  • @Omer Cool :) 如果我的回答有帮助,请将其标记为已接受此问题。希望设计顺利!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-14
  • 1970-01-01
  • 2018-11-12
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
  • 2020-07-25
相关资源
最近更新 更多