使用 react-navigation 时在 react-native 中管理状态

Managing state in react-native when using react-navigation

我正在尝试在 react-native 中创建一个待办事项应用程序。它有一些额外的功能,例如编辑现有任务和查看任务历史记录。我有两个嵌套在 TabNavigator 中的 StackNavigators - 但我正在努力找出我应该如何将状态传递到我的应用程序中,然后一旦 state/data 可用于应用程序,我应该如何更新申请状态。

这是我的应用程序的相关代码:

export default class App extends React.Component {

    constructor(props){
        super(props)
        this.state = {
            data: [

                //Array of to-do objects here.
            ]
        }
    }

    updateAppData(id, ){

    //define function that wraps this.setState(). This will be passed into 
    application to update application state.
    }

    render(){
        return(
            <Root screenProps={this.state}/>
        )
    }
}

//make Todos Stack-Nav section to sit inside tab1
const TodosWrapper = StackNavigator({

    CurrentTodos: { screen: CurrentTodos },
    Details: { screen: Details},
    EditTodo: { screen: EditTodo},
    AddNewTodo: { screen: AddNewTodo}

})

//make History Stack-Nav section to sit inside tab2
const HistoryWrapper = StackNavigator({

    CompletedTodos: { screen: CompletedTodos },
    CompletedDetails: { screen: CompletedDetails }

})

//Make main tab navigation that wraps tabs 1 and 2
const Root = TabNavigator({

    Todos : { 
        screen: TodosWrapper,
        title: "Open Tasks"
    },
    History: { screen: HistoryWrapper }
})

然后我想将我的应用程序的状态传递到我的屏幕中,如下图所示:

export default class CurrentTodos extends React.Component {

static navigationOptions = {
    header: null
}
render(){
    const { navigate } = this.props.navigation;
    let { data } = this.props.screenProps;
    data = data.map( (item, id) => (

            <ListItem style={styles.listItem} key={"_"+id}>
                <View style={styles.textWrapper}>
                    <Text style={styles.listItemTitle}>{item.title}</Text>
                    <Text note>{ item.isComplete ? "Complete" : "In Progress" }</Text>
                    <Text note>{item.description}</Text>
                </View>
                <View>
                    <Button
                        onPress={() => this.props.navigation.navigate('Details')}
                        title="Full Details"
                        style={styles.fullDetails}
                    />
                </View>
            </ListItem>
        ) 
    );

    return (
        <ScrollView style={styles.scrollView}>
            <View style={styles.viewHeader}>
                <Text style={styles.title}>
                    Current Tasks
                </Text>
                <Text 
                    style={styles.addNew}
                    onPress={() => navigate("AddNewTodo")}
                >
                    +
                </Text>
            </View>
            <List>
                {data}
            </List>
        </ScrollView>
    )
}

}

我目前正计划使用 screenProps={this.state} 将状态传递到我的屏幕,然后还传递一个包装 this.setState() 的函数,以便屏幕组件可以更新应用程序的状态.

由于我是这一切的新手,我想确保我不会接受不良做法。

谁能帮我看看这是否是正确的方法?大量的文档有时会让人不知所措!提前致谢!

如果你想要一个中心化的状态,你一定要试试 redux。 Redux 是一个全局不可变的状态管理器。

总而言之,在 redux 中,你所有的状态都存储在一个 "Store" 中,它包装了你的顶级导航器。该商店由许多 "Reducers" 组成,它们保存着您应用程序的当前状态。您的组件使用 actions 与 store 通信,reducer 接收这些 actions 并将新状态传达给您的视图并处理所需的更改。

如果您需要我添加更多详细信息,请告诉我。在这里你有一些参考资料供你检查:

官方网站: http://redux.js.org

来自创作者的教程: https://egghead.io

课程: https://www.udemy.com/the-complete-react-native-and-redux-course/

这应该能让您朝着正确的方向前进! 祝你好运!