#javascript #reactjs #react-native #react-navigation #routeparams
Вопрос:
Я пытаюсь передать некоторые данные между двумя экранами в своем приложении. Я использую для этого route.params из react-навигации (вот документы https://reactnavigation.org/docs/params/).
В первом компоненте — home.js — У меня есть массив с некоторыми данными и компонентом FlatList. Home.js правильно отображает данные в моем приложении.
Во втором компоненте — reviewsDetails.js — Я пытаюсь отобразить данные /элемент.название/ из дома.js, но у меня эта ошибка: «Ошибка типа: Не удается прочитать свойства неопределенного (чтение «элемента»)».
Я ищу решение этой проблемы
Вот мой код:
home.js
import React, { useState } from 'react';
import {StyleSheet, View, Text, FlatList,TouchableOpacity} from 'react-native'
function Home({navigation}) {
const [reviews, setReviews] = useState(
[
{title:"Zelda", rating:1, body:'lorem ipsum', key:1},
{title:"Cruella", rating:1, body:'lorem ipsum', key:2},
{title:"Voldemort", rating:1, body:'lorem ipsum', key:3},
]
)
return (
<View style={styles.container}>
<FlatList
data={reviews}
renderItem={({item})=>(
<TouchableOpacity onPress={()=> navigation.navigate("reviewDetails", item)}>
<Text>{item.title}</Text>
</TouchableOpacity>
)}
/>
</View>
);
}
export default Home;
reviewDetails.js
import React from "react";
import { View, Text, Button, StyleSheet } from "react-native";
export default function ReviewDetails({ route, navigation }) {
const { item } = route.params;
return (
<View style={globalStyles.container}>
<Text>{item.title}</Text>
</View>
);
}
И вот
изображение ошибки
Codesandbox с исходным кодом: ссылка
Я буду благодарен за любые советы
Редактировать.
Дополнительная информация 🙂
Вот также мой navigation.js:
mport { createBottomTabNavigator } from "@react-navigation/bottom-tabs";
import React from 'react';
import about from '../screens/about'
import home from '../screens/home'
import reviewDetails from '../screens/reviewDetails'
const Tab= createBottomTabNavigator();
const AppNavigator=()=>(
<Tab.Navigator>
<Tab.Screen name="about" component={about}></Tab.Screen>
<Tab.Screen name="home" component={home}></Tab.Screen>
<Tab.Screen name="reviewDetails" component={reviewDetails}></Tab.Screen>
</Tab.Navigator>
)
export default AppNavigator;
и app.js
import React from 'react';
import { NavigationContainer, useNavigation } from "@react-navigation/native";
import AppNavigator from "./navigation/navigation.js"
export default function App(){
return(
<NavigationContainer>
<AppNavigator>
</AppNavigator> </NavigationContainer>
)
}
Если это полезно — я использую версию 6.0.2 react-навигации/родной и 6.0.7 react-навигации/стека
Комментарии:
1. Как регистрируется экран ReviewDetails в навигаторе? Кроме того, я бы не ожидал, что свойство
item
будет существовать в параметрах, которые вы отправляете. Может быть, вы имели в видуnavigation.navigate("reviewDetails", {item})
2. @windowsill, вот как я регистрирую свой обзорный экран в своем navigation.js : Вкладка const= createBottomTabNavigator(); Приложение const=()=>( ><Вкладка.Навигатор> <Вкладка.Навигатор><Имя экрана вкладки=»о компоненте»={о}><Имя экрана вкладки=»о компоненте»={о}></Вкладка.Экран> </Вкладка.Экран><Имя экрана вкладки=»главная» компонент={главная}><Имя экрана вкладки=»главная» компонент={главная}></Вкладка.Экран> </Вкладка.Экран><Вкладка.Имя экрана=компонент»Обзорные данные»={Обзорные данные}><Вкладка.Имя экрана=компонент»Обзорные данные»={Обзорные данные}></Вкладка.Экран> </Вкладка.Экран></Вкладка.Навигатор> Вот как app.js выглядит: </Tab.Навигатор><Навигационный контейнер> <Навигационный контейнер><Навигатор> <Навигатор><Навигатор > < /Навигатор> </Навигатор></Навигатор>
3. Я пытался использовать этот вариант, который вы предлагаете: навигация.навигация(«reviewDetails», {элемент}), но все равно у меня та же ошибка в reviewDetails.js. Если это поможет, я использую версию 6.0.2 react-навигации/родной и 6.0.7 react-навигации/стека
4. Вместо этого попробуйте использовать этот синтаксис
navigate({routeName, params, action, key})
5. Все та же ошибка в результатах проверки: не удается прочитать свойства неопределенного «элемента»
Ответ №1:
Вы должны передавать такие параметры с home
экрана. Передайте его в объект с именем data
(его можно назвать как угодно).
onPress={() => {
navigation.navigate("reviewDetails", {
data: item,
});
}}
А затем выведите его на следующий экран, вот так, на reviewDetails
экране
const { data } = route.params;
Комментарии:
1. Я также внес изменения в детали моего обзора <Текст>{data.title}<Текст></Текст> теперь все работает хорошо, спасибо!