Я хочу модифицировать свой экран входа в систему в любом месте приложения на основе обновления 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. .





Причина того, что ваш 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 >
);