UseState, чтобы скрыть / показать модальное окно в React Native

Я хочу модифицировать свой экран входа в систему в любом месте приложения на основе обновления useState. У меня есть экран, на котором есть кнопка:

    const [needLogin, setNeedLogin] = useState(false);

    return (
...
            <TouchableOpacity onPress = {() => {
                setNeedLogin(true) //This is hardcoded I'll set this value later via an  API response but for now, I just want to show the screen every time it's pressed so hard coding it to true
            }}>
                <Text>Ask Your Question</Text>
            </TouchableOpacity >
            
            {needLogin && <AuthScreen />}
...
    )

Теперь AuthScreen кодируется как:

    const [showModal, setShowModal] = useState(true);

    return (
        <View style = {{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
            <Modal visible = {showModal} animationType = {'slide'} >
                <View style = {styles.modal}>
                    <View style = {styles.modalContainer}>
                            <View style = {styles.header}>
                                <TouchableOpacity onPress = {() => { setShowModal(false) }}>
                                    <Image source = {require('../assets/close-icon.png')} />
                                </TouchableOpacity>
                            </View>
                            <LoginForm />
                    </View>
                </View>
            </Modal >
        </View >
    );

Эта логика работает один раз, это означает, что я нажимаю кнопку Ask Question, она покажет AuthScreen, а затем, когда я нажму на close-icon, она закроет ее, но затем, если я снова нажму на Ask Question, она не покажет AuthScreen. .

Умерло ли Create-React-App?
Умерло ли Create-React-App?
В этом документальном фильме React.dev мы исследуем, мертв ли Create React App (CRA) и какое будущее ждет этот популярный фреймворк React.
Освоение React Native: Пошаговое руководство для начинающих
Освоение React Native: Пошаговое руководство для начинающих
React Native - это популярный фреймворк с открытым исходным кодом, используемый для разработки мобильных приложений. Он был разработан компанией...
В чем разница между react native и react ?
В чем разница между react native и react ?
React и React Native - два популярных фреймворка для создания пользовательских интерфейсов, но они предназначены для разных платформ. React - это...
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
Если вы уже умеете работать с React, создание мобильных приложений для iOS и Android - это новое приключение, в котором вы сможете применить свои...
Хуки React: что это такое и как их использовать
Хуки React: что это такое и как их использовать
Хуки React - это мощная функция библиотеки React, которая позволяет разработчикам использовать состояние и другие возможности React без написания...
0
0
24
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Причина того, что ваш AuthScreen не показывает второй раз во второй раз, заключается в том, что вы никогда не устанавливали для состояния needLogin значение false. Поэтому в следующий раз, когда вы попытаетесь установить для него значение true, это не вызовет повторной визуализации.

Лучший способ справиться с этим будет заключаться в том, чтобы не поддерживать отдельное состояние AuthScreen, а выводить его из реквизита, а также предоставлять способ обновления состояния в родительском

    const [needLogin, setNeedLogin] = useState(false);

    return (
    ...
            <TouchableOpacity onPress = {() => {
                setNeedLogin(true) //This is hardcoded I'll set this value later via an  API response but for now, I just want to show the screen every time it's pressed so hard coding it to true
            }}>
                <Text>Ask Your Question</Text>
            </TouchableOpacity >
            
            <AuthScreen open = {needLogin} closeModal = {() => setNeedLogin(false)}/>
       ...
    )

const { open, closeModal } = props;

return (
    <View style = {{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
        <Modal visible = {open} animationType = {'slide'} >
            <View style = {styles.modal}>
                <View style = {styles.modalContainer}>
                        <View style = {styles.header}>
                            <TouchableOpacity onPress = {() => { closeModal() }}>
                                <Image source = {require('../assets/close-icon.png')} />
                            </TouchableOpacity>
                        </View>
                        <LoginForm />
                </View>
            </View>
        </Modal >
    </View >
);

Другие вопросы по теме