#react-native #react-navigation #react-native-navigation #react-navigation-v5 #react-navigation-bottom-tab
#react-native #react-навигация #react-native-navigation #react-navigation-v5 #реакция-навигация-нижняя вкладка
Вопрос:
В моем приложении есть два стека
- Навигатор вкладок (основной стек)
- Навигатор стека (стек приложений)
Элементы стекового навигатора
- Начальный экран
- Подробный экран
- Экран входа в систему
Элементы навигатора вкладок
- Начальный экран (Stack Navigor)
- Экономические новости
- Политические новости
- Социальные новости
Я хочу перейти к подробному экрану из экономических новостей, политических новостей и социальных новостей, потому что я отображаю все новости на этих экранах, и когда пользователь нажимает на любой новый, он должен перейти к подробному экрану с новым, который щелкнул. Я использовал navigate(‘Home’, {screen: ‘Detail’, params: {id: new.ID }}); Но он всегда отображает предыдущую новую деталь.
Также я пытался
navigation.dispatch(
CommonActions.reset({
routes: [
{
name: 'Home',
},
{
name: 'Detail',
params: {
id: new.ID,
},
},
],
}),
);
Но все равно это не работает, мне нужно помочь с этой проблемой, я перепробовал так много вещей, но всегда отображаю детали предыдущего экрана.
Комментарии:
1. можете ли вы опубликовать больше кода, потому что navigate(‘Home’, {screen: ‘Detail’, params: {id: new. ID}}); должен сбросить ваш параметр
2. конечно, я напишу ответ, которым поделюсь там
Ответ №1:
Это моя домашняя навигация по стеку
<Stack.Navigator
initialRouteName="Home"
headerMode="none"
transitionConfig={transitionConfig}
>
<Stack.Screen
name="Detail"
component={DetailScreen}
initialParams={props.route.params}
/>
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen name="Profile" component={ProfileScreen} />
<Stack.Screen name="Login" component={LoginPage} />
<Stack.Screen name="Settings" component={SettingsScreen} />
</Stack.Navigator>
и это моя основная вкладка nav
<Tab.Navigator
tabBar={props => <Footer {...props} />}
transitionConfig={transitionConfig}
>
<Tab.Screen name="Home" component={StackNavigator} />
<Tab.Screen name="EconomyNews" component={ContentScreen} />
<Tab.Screen name="PoliticNews" component={ContentScreen} />
<Tab.Screen name="SocialNews" component={ContentScreen} />
</Tab.Navigator>
Я хочу перейти к подробному экрану с экранов EconomyNews, PoliticNews или SocialNews с новыми значениями, такими как id, но он всегда отображает предыдущий экран
Комментарии:
1. все выглядит нормально, добавьте подробный экран, полный код и экран содержимого
2. я не могу поделиться всем кодом, потому что, когда я делюсь, модератор удаляет мой ответ, но я могу поделиться немного.
3.
const Detail = React.memo(props => { const [content, setContent] = useState(null); const dispatch = useDispatch(); const contentProps = useSelector(state => state.contentReducer); const { loading, error, detail } = contentProps; useEffect(() => {function fetchData() {dispatch(getDetail({endpoint:
URL}));}fetchData();}, []);return (<Container><Image source={{uri:'URL'}}/><View style={styles.content_container}><Title>{content.title}</Title><OverView style={styles.content}>{content.overview}</OverView></Container>);});
4. Экран содержимого>
const Content = React.memo(props => {const { item, navigation } = props; return ( <View> <TouchableWithoutFeedback /n onPress={() => { navigation.navigate('Home', {screen: 'Detail', params: {id: item.ID}});}}> <Container> <Image source={{uri: 'URL'}}/> <Title>{item.original_title} ({item.title})</Title> <OverView numberOfLines={5}>{item.overview}</OverView> </Container></View>); });
Ответ №2:
Трудно следовать вашему коду, но я не вижу, чтобы вы подробно использовали компонент id, поэтому невозможно, чтобы у вас были другие данные. В вашем случае memo не нужен …
const Detail = props => {
const [content, setContent] = useState(null);
const dispatch = useDispatch();
const contentProps = useSelector(state => state.contentReducer);
const { loading, error, detail } = contentProps;
const URL = `URL/${props.navigation?.route?.params?.id}`
useEffect(() => {
function fetchData() {
dispatch(getDetail({endpoint: URL}));}
fetchData();
}, [dispatch, props.navigation?.route?.params?.id]);
return (<Container><Image source={{uri:'URL'}}/><View style={styles.content_container}><Title>{content.title}</Title><OverView style={styles.content}>{content.overview}</OverView></Container>);};
Ответ №3:
Я использую идентификатор в URL, который используется в функции выборки. Я использую его для получения данных из сервиса, поэтому я не написал точный URL. Основная цель — открыть подробный экран с помощью сброса. Сегодня я также попробовал другой способ, и он не сработал;
import {useNavigation} from '@react-navigation/native';
const Content = (props => {
const _nav = useNavigation();
const goToRoute = () => {
_nav.reset({
index: 1,
routes: [
{
name: 'Home',
},
{
name: 'Detail',
params: {
id: item.ID,
},
},
],
});
};
});
Комментарии:
1. не могли бы вы перекусить, потому что вам не нужно использовать сброс. Для сброса параметров что-то не так, и я этого не вижу. Вот готовый шаблон с react navigation v5 snack.expo.io/@anthowm/41a9b3
2. snack.expo.io/ye !rF6rv6 это мой код закуски, похожий
3. На этой выставке все рабочие параметры постоянно обновляются.
4. Я исправил проблему 🙂 спасибо за любую помощь. Я только что понял, что сохраняю свои параметры, но не реагирую на состояние, я немного изменил код о своих параметрах. Пока я получаю параметры, я назначил состояние реакции и начал использовать эти переменные состояния реакции в своей функции useEffect, и это работает. Все дело в инструкции react и виртуальном dom. Я не понял эту проблему. Теперь это работает: D : D