【问题标题】:How to get the route params using route.params in react native navigation?如何在反应原生导航中使用 route.params 获取路由参数?
【发布时间】:2020-04-27 16:10:09
【问题描述】:

我正在使用 react native 和 react native 导航。当我尝试访问 route.params 时,它说它是一个未定义的对象。我可以使用 this.props.navigation.navigate 方法导航到 PokeDetails 屏幕,但我无法从 route.params.etc 获取参数.....请参阅下面的代码。谢谢!

//Home.js

import React, { useState } from "react";
import { View, Text , Button, FlatList, ActivityIndicator, TouchableOpacity, Image } from "react-native";
import { GlobalStyles } from "../styles/GlobalStyles";
import PokeDetails from "./PokeDetails";



class Home extends React.Component {

    constructor(props) {
        super(props);
        this.state = {
            isLoading: true,
            dataSource: [],
        }
    }

    componentDidMount() {
        fetch(`https://pokeapi.co/api/v2/pokemon/?limit=20`)
            .then((res)=> res.json())
            .then((response)=> {
                this.setState({
                    isLoading: false,
                    dataSource: response.results,
                })
                console.log("RESPONSE",response)
                console.log("RESPONSE.RESSSULTS",response.results)
            })

    }

    render() {
        const showIndicator = this.state.isLoading == true ? <ActivityIndicator size="large" color="#0000ff" /> : null;
        return(
            <View style={GlobalStyles.container}>
                <View style={GlobalStyles.activityIndicator}>{showIndicator}</View>
                <FlatList 
                    numColumns={1}
                    data={this.state.dataSource} 
                    renderItem={({item})=> 
                    <TouchableOpacity onPress={()=> this.props.navigation.navigate("PokeDetails", {item} )}>
                        <PokeDetails imageUrl={`https://projectpokemon.org/images/normal-sprite/${item.name}.gif`} name={item.name} item={item} />
                    </TouchableOpacity>
                    }/>
                <Button onPress={()=> this.props.navigation.navigate("About")} title="Go to about"/>
            </View>
        )
    }
}


export default Home;



// PokeDetails.js

import React from "react";
import { View, Text , Image, Button} from "react-native";
import {GlobalStyles} from "../styles/GlobalStyles";
import { TouchableOpacity } from "react-native-gesture-handler";



const PokeDetails =({route})=> {
    return(
        <View style={GlobalStyles.container}>  
                <Text>{route.params.item}</Text>
                {/* <Image source={{uri: imageUrl}} style={{height: 50, width: 50}}/>
                <Text style={GlobalStyles.pokeText}>{name}</Text> */}
        </View>
    )
}


export default PokeDetails;


// Root.js

import React from "react"
import { createStackNavigator } from "@react-navigation/stack";
import Home from "../screens/Home";
import PokeDetails from "../screens/PokeDetails";
import { NavigationContainer } from '@react-navigation/native';



const Root =() => {
    const Stack = createStackNavigator();
    return(
        <Stack.Navigator>
            <Stack.Screen name="Home" component={Home}/>
            <Stack.Screen name="PokeDetails" component={PokeDetails}/>
        </Stack.Navigator>
    )
}


export default Root;



// App.js


import 'react-native-gesture-handler';
import React from 'react';
import { View , StyleSheet } from 'react-native';
import { NavigationContainer } from '@react-navigation/native';
import { createDrawerNavigator } from "@react-navigation/drawer";
import About from "./screens/About";
import Root from "./Route/Root";
import PokeDetails from "./screens/PokeDetails"



const App =()=> {

  const Drawer = createDrawerNavigator();

  return(
    <View style={styles.container}>
      <NavigationContainer>
        <Drawer.Navigator>
          <Drawer.Screen name="Home" component={Root}/>
          <Drawer.Screen name="About" component={About}/>
        </Drawer.Navigator>
      </NavigationContainer>
    </View>
  )
}


const styles = StyleSheet.create({
  container: {
    flex: 1
  }
})



export default App;

【问题讨论】:

  • 你能分享你的 react-navigation 版本吗?
  • 好的,它是 React 导航版本 5。谢谢!
  • 这两个屏幕是否在同一个堆栈导航器中?
  • 你好,Dushan,我已经进行了编辑并在上面添加了 Root.js 和 App.js 以显示堆栈导航器和抽屉导航器的代码。基本上,Root.js 拥有堆栈导航容器。 App.js 包含嵌套堆栈导航器根组件的抽屉导航。再次感谢!

标签: javascript react-native react-navigation react-navigation-drawer react-navigation-v5


【解决方案1】:

如果你使用 React Navigation v5.x,你可以使用 useRoute 钩子。

Documentation here

例子:

import * as React from 'react';
import { Text } from 'react-native';
import { useRoute } from '@react-navigation/native';

function MyText() {
  const route = useRoute();

  return <Text>{route.params.caption}</Text>;
}

【讨论】:

  • 感谢您的回复!我已经做到了。在我实现了这个之后,我 console.log const route 和 params 键在那里,但由于某种原因值未定义。
【解决方案2】:

改变

const PokeDetails =({route})=> {
    return(
        <View style={GlobalStyles.container}>  
                <Text>{route.params.item}</Text>
                {/* <Image source={{uri: imageUrl}} style={{height: 50, width: 50}}/>
                <Text style={GlobalStyles.pokeText}>{name}</Text> */}
        </View>
    )
}

const PokeDetails =(route)=> {
    return(
        <View>  
                <Text>{route.route.params.item.name}</Text>
                {/* <Image source={{uri: imageUrl}} style={{height: 50, width: 50}}/>
                <Text style={GlobalStyles.pokeText}>{name}</Text> */}
        </View>
    )
}

希望这会有所帮助!

【讨论】:

  • 谢谢!我发现这是答案
猜你喜欢
  • 2020-09-23
  • 2018-08-05
  • 1970-01-01
  • 2020-11-11
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
  • 1970-01-01
相关资源
最近更新 更多