React Native - 跨屏幕传递数据

时间:2017-10-02 13:56:18

标签: javascript reactjs react-native stack-navigator

我在使用react-native应用时遇到了一些问题。我无法弄清楚如何跨屏幕传递数据。

我意识到还有其他类似问题已在SO上得到解答,但解决方案并不适用于我。

我正在使用StackNavigator。这是我在App.js文件中的设置。

export default SimpleApp = StackNavigator({
    Home: { screen: HomeScreen },
    Categories: { screen: CategoriesScreen }, // send from here
    Category: { screen: CategoryScreen }      // to here
});

我有一个TouchableHighlight组件,其onPress事件会导航到所需的屏幕。这是在我的Categories.js文件/屏幕上。

<TouchableHighlight onPress={(id) => {
    const { navigate } = this.props.navigation;
    navigate('Category', { category: id });
}}>
    <Text>{name}</Text>
</TouchableHighlight>

当我点击该元素时,屏幕确实切换到category,但无法发送props数据。

因此,当我在Category屏幕中检查数据时,它会返回undefined。我尝试了以下方法:

this.props.category
this.props.navigation.state.category;
this.props.navigation.state.params.category

我究竟能如何访问我传入的数据 navigate方法?

navigate('Category', { category: id });

编辑:这是我的实际代码结构:

data来自API

for (var i = 0; i < data.length; i++) {
    var name = data[i].name;
    var id = data[i].id;
    categoryComponents.push(
        <Card key={id}>
            <CardItem>
                <Body>
                    <TouchableHighlight onPress={(id) => {
                        const { navigate } = this.props.navigation;
                        navigate('Category', { params: { category: id } });
                    }}>
                        <Text>{name + " " + id}</Text>
                    </TouchableHighlight>
                </Body>
            </CardItem>
        </Card>
    );
}

4 个答案:

答案 0 :(得分:4)

您的问题不是发送参数。你正确地发送并正确阅读。您的错误与id未定义相关。

您应修改下面的代码,

for (var i = 0; i < data.length; i++) {
    var name = data[i].name;
    var id = data[i].id;
    categoryComponents.push(
        <Card key={id}>
            <CardItem>
                <Body>
                    <TouchableHighlight onPress={(event) => {
                        // onPress event fires with an event object
                        const { navigate } = this.props.navigation;
                        navigate('Category', { category: id });
                    }}>
                        <Text>{name + " " + id}</Text>
                    </TouchableHighlight>
                </Body>
            </CardItem>
        </Card>
    );
}

您可以阅读以下参数。

this.props.navigation.state.params.category

答案 1 :(得分:0)

从父屏幕:

navigate({ routeName: 'Category',  params: { category: id } })

navigate('Category', { category: id })

从儿童屏幕:

const category = this.props.navigation.state.params.category

答案 2 :(得分:0)

所以看看上面提到的问题,我认为你正在寻找像screenProps这样的东西(记录here)。

这允许您跨屏幕传递特定道具。

我希望这会有所帮助。如果您还有其他需要,请告诉我。

答案 3 :(得分:0)

使用以下代码段,您可以导航到带有某些值的另一个屏幕。

navigate({ Home: 'HomeScreen',  params: { username: 'abcd' } })

您可以使用以下方法在HomeScreen上收集参数:

this.props.navigation.state.params.username