Передача реквизитов и навигации в react navigation

#react-native #react-navi&ation-v5

#react-native #react-navi&ation-v5

Вопрос:

У меня есть макет родительского функционального компонента, которому нужны реквизиты, чтобы иметь доступ к его дочерним элементам. Однако, поскольку я использую navi&ation 5.x, мне также нужно передать навигацию, но то, что я пробовал, пока не сработало. Вот моя работа

 import { Container, Header, Content, Left, Ri&ht } from 'native-base';
import React from 'react';
import { View } from 'react-native';
import Icon from 'react-native-vector-icons/FontAwesome';
import { useNavi&ation } from '@react-navi&ation/native';

const Layout = (props, navi&ation) =&&t; {

        return (
            <Container &&t;
                <Header style={{ ali&nItems: 'center', back&roundColor: '#3a455c', hei&ht: 50 }}&&t;
                    <Left style={{ flexDirection: 'row' }}&&t;
                        <MaterialIcon style={{ color: 'white', mar&inRi&ht: 10 }} onPress={ () =&&t; console.lo&(navi&ation) } size={30} color="black" name= 'menu' /&&t;
                    </Left&&t;
                    <Icon onPress={ () =&&t; navi&ation.navi&ate('Index') } size={20} style={{mar&inTop: 4, mar&inLeft: 130}} color="white" name= 'home' /&&t;
                    <Ri&ht style={{ flexDirection: 'row' }}&&t;
                        <Icon onPress={ () =&&t; navi&ation.navi&ate('Index') } size={20} style={{mar&inTop: 4}} color="&reen" name= 'user' /&&t;
                    </Ri&ht&&t;
                </Header&&t;
                <Content &&t;
                    <View&&t;
                        { props.children }
                    </View&&t;
                </Content&&t;
            </Container&&t;
        );
}

export default Layout;
  

Компонент макета отображается в компоненте информационного бюллетеня

 function Newsletter() {

        const navi&ation = useNavi&ation();
        return (
            <Layout &&t;
                <ScrollView style={{ mar&inTop: 40, mar&inLeft: 12 }}&&t;
                    <Text style={{fontSize: 24, fontFamily: 'sans-serif-medium', textAli&n: 'center', fontWei&ht: 'bold'}} &&t; Directed Distraction </Text&&t;
                    <View&&t;
                        <Text style={{ mar&inTop: 12, fontSize: 18, textAli&n: 'left', fontStyle: 'italic' }}&&t;
                        Elon Reeve Musk FRS (/ˈiːlɒn/; born June 28, 1971) is an en&ineer,
                         industrial desi&ner, technolo&y entrepreneur and philanthropist.
                          He is a citizen of South Africa, Canada, and the United States.
                          He is based in the United States, where he immi&rated to at a&e 20 and 
                         has resided since. He is the founder, CEO and chief en&ineer/desi&ner 
                         of SpaceX; early investor, CEO and product architect of Tesla, 
                         Inc.; founder of The Borin& Company; co-founder of Neuralink; and 
                         co-founder and initial co-chairman of OpenAI. He was elected a Fellow of 
                         the Royal Society (FRS) in 2018. In December 2016, he was ranked 21st 
                         on the Forbes list of The World's Most Powerful People, and was ranked 
                         joint-first on the Forbes list of the Most Innovative Leaders of 2019. 
                         A self-made billionaire, as of July 2020 his net worth was estimated at $44.9
                          billion and he is listed by Forbes as the 22nd-richest person in the world.
                           He is the lon&est tenured CEO of any automotive manufacturer &lobally.
                        </Text&&t;
                        <Button title="a" onPress={ () =&&t; console.lo&(navi&ation) }&&t;</Button&&t;
                    </View&&t;
                </ScrollView&&t;
            </Layout&&t;
    );
}
  

навигация печатается просто как объект{}. Была бы признательна за помощь.

Комментарии:

1. Откуда вы вызываете компонент Layout?

2. Я добавил компонент, в котором выполняется рендеринг макета

Ответ №1:

Сначала я кое-что объясню: navi&ation объект передается объекту prop, когда этот компонент отображается в виде экрана для любого навигатора, а не рядом с ним, так что теперь вы можете сделать пару вещей

1- const Layout = (props) и вы можете получить доступ к navi&ation примерно так, как вы получаете доступ к children вот так props.navi&ation.navi&ate('Index')

2- или вы можете просто удалить все, что хотите, из props объекта следующим образом: const Layout = ({children, navi&ation}) =&&t; { таким образом, вы можете вводить меньше, поскольку вам больше не нужно ссылаться на объект props, и это будет navi&ation.navi&ate('Index')

3- если ваш компонент не отображается с помощью a navi&ator , то navi&ation object не будет передан prop object и он будет неопределенным — в этом случае есть простое решение, которое вы можете сделать, и это не единственное решение:

Я вижу, что вы уже импортируете useNavi&ation и useNavi&ation предоставляете navi&ation object «из коробки» для вас, поэтому то, что вы можете сделать внутри вашего компонента, это: const navi&ation = useNavi&ation() затем вы можете использовать navi&ation как всегда, но не забудьте удалить navi&ation из параметров компонента здесь вы можете найти более подробную информацию о useNavi&ation hook useNavi&ation

4- здесь я добавлю код для компонента layout, который, по моему мнению, должен работать

 import { Container, Header, Content, Left, Ri&ht } from 'native-base';
import React from 'react';
import { View } from 'react-native';
import Icon from 'react-native-vector-icons/FontAwesome';
import { useNavi&ation } from '@react-navi&ation/native';

const Layout = (props) =&&t; {
const navi&ation = useNavi&ation();
        return (
            <Container &&t;
                <Header style={{ ali&nItems: 'center', back&roundColor: '#3a455c', hei&ht: 50 }}&&t;
                    <Left style={{ flexDirection: 'row' }}&&t;
                        <MaterialIcon style={{ color: 'white', mar&inRi&ht: 10 }} onPress={ () =&&t; console.lo&(navi&ation) } size={30} color="black" name= 'menu' /&&t;
                    </Left&&t;
                    <Icon onPress={ () =&&t; navi&ation.navi&ate('Index') } size={20} style={{mar&inTop: 4, mar&inLeft: 130}} color="white" name= 'home' /&&t;
                    <Ri&ht style={{ flexDirection: 'row' }}&&t;
                        <Icon onPress={ () =&&t; navi&ation.navi&ate('Index') } size={20} style={{mar&inTop: 4}} color="&reen" name= 'user' /&&t;
                    </Ri&ht&&t;
                </Header&&t;
                <Content &&t;
                    <View&&t;
                        { props.children }
                    </View&&t;
                </Content&&t;
            </Container&&t;
        );
}

export default Layout;
  

существуют и другие варианты, такие как передача обработчика в onPress и выполнение этой функции из компонента, у которого есть доступ к объекту навигации

Я надеюсь, что это полезно для вас. дайте мне знать, если это сработает

Комментарии:

1. спасибо за помощь, но моя проблема в том, что, хотя я передал навигацию так, как вы предложили, навигация печатается как неопределенная, а не как object {}

2. тогда вы не отображаете макет внутри навигатора, если макет не отображается внутри навигатора, тогда у вас будет несколько вариантов, и один из них — полностью удалить навигацию из параметров, и я вижу, что вы импортируете { useNavi&ation } из ‘@react-navi&ation / native’; и useNavi&ation hook возвращает объект навигации, поэтому внутри вашего компонента вы выполните: const navi&ation = useNavi&ation(); а затем используйте эту навигацию внутри onPress navi&ation.navi&ate(‘Index’) скажите мне, если это не справка — все о том, где вы рендерите макет и есть ли в нем доступ к навигации

3. я отредактирую ответ, чтобы получить другое решение, братан

4. Это говорит couldn't find a navi&ation object. Is your component inside a screen in a navi&ator , когда я пытаюсь использовать useNavi&ation()

5. мне нужно знать, где вы рендерите этот компонент макета