具有条件渲染的模态上的自定义回调
Custom callBack on a Modal with conditional rendering
我正在构建一个拼车应用程序来学习 react-native。为了发布一个新的 Ride,我有一个 Modal
,它在 step
状态下有条件地呈现,并且每个步骤都有一个不同的 UI。喜欢:
let screen;
if (step===1){
ecraStep=<Screen1/>
} if (step===2){
ecraStep=<Screen2/>
} ...
On step=1
(初始值)我希望回调按钮关闭 Modal
并且每当 step>1 我希望它调用以下函数:
function togglePreviousStep() {
setStep(step-1);
};
这实际上是回到上次渲染的屏幕。我已经通过在 Modal
函数组件中编写这个来尝试它:
useFocusEffect(
React.useCallback(() => {
const onBackPress = () => {
if (step>1) {
togglePreviousStep();
return true;
} else if (step===1) {
props.closeModal();
return false;
}
};
BackHandler.addEventListener('hardwareBackPress', onBackPress);
return () =>
BackHandler.removeEventListener('hardwareBackPress', onBackPress);
}, [step, togglePreviousStep])
);
但是,无论 step
状态如何,每当我按下后退按钮时,它都会关闭 Modal
。我不明白我做错了什么。
已编辑
我从 react-native-modal
实现了 Modal
。我像这样使用道具 onBackButtonPress
:
<Modal
onBackButtonPress={props.onBackButtonPress}
visible={showModal}
//...
>
<NewRidesModal
//...
/>
</Modal>
我在模态屏幕中写道:
if (step===1) {
onBackPressButton=(() => props.closeModal());
} else if (step>1){
onBackPressButton=(() => togglePreviousStep())
}
但是,当我按下 android 后退按钮时,它仍然会关闭模式...
这应该有效。如果不把你所有的代码都参与进来,因为它们的分割部分很难连接你在做什么。
<Modal
onBackButtonPress={() => {
if (step===1) {
props.closeModal();
} else if (step>1){
togglePreviousStep()
}
}}
visible={showModal}
//...
>
<NewRidesModal
//...
/>
</Modal>
onBackBackButtonPress 实际上已弃用或删除。
后来,我在 https://reactnative.dev/docs/modal#onrequestclose 上阅读了更多关于模态文档的内容,我发现:
The onRequestClose callback is called when the user taps the hardware
back button on Android or the menu button on Apple TV.
我应该在提出这个问题之前调查过这个问题。我需要的一切都可以使用 onRequestClose
道具完成,如下所示:
<Modal
onRequestClose={() => {
if (step===1) {
toggleModal();
} else if (step>1 && step<8){
togglePreviousStep();
}
}}
>
//...
</Modal>
我正在构建一个拼车应用程序来学习 react-native。为了发布一个新的 Ride,我有一个 Modal
,它在 step
状态下有条件地呈现,并且每个步骤都有一个不同的 UI。喜欢:
let screen;
if (step===1){
ecraStep=<Screen1/>
} if (step===2){
ecraStep=<Screen2/>
} ...
On step=1
(初始值)我希望回调按钮关闭 Modal
并且每当 step>1 我希望它调用以下函数:
function togglePreviousStep() {
setStep(step-1);
};
这实际上是回到上次渲染的屏幕。我已经通过在 Modal
函数组件中编写这个来尝试它:
useFocusEffect(
React.useCallback(() => {
const onBackPress = () => {
if (step>1) {
togglePreviousStep();
return true;
} else if (step===1) {
props.closeModal();
return false;
}
};
BackHandler.addEventListener('hardwareBackPress', onBackPress);
return () =>
BackHandler.removeEventListener('hardwareBackPress', onBackPress);
}, [step, togglePreviousStep])
);
但是,无论 step
状态如何,每当我按下后退按钮时,它都会关闭 Modal
。我不明白我做错了什么。
已编辑
我从 react-native-modal
实现了 Modal
。我像这样使用道具 onBackButtonPress
:
<Modal
onBackButtonPress={props.onBackButtonPress}
visible={showModal}
//...
>
<NewRidesModal
//...
/>
</Modal>
我在模态屏幕中写道:
if (step===1) {
onBackPressButton=(() => props.closeModal());
} else if (step>1){
onBackPressButton=(() => togglePreviousStep())
}
但是,当我按下 android 后退按钮时,它仍然会关闭模式...
这应该有效。如果不把你所有的代码都参与进来,因为它们的分割部分很难连接你在做什么。
<Modal
onBackButtonPress={() => {
if (step===1) {
props.closeModal();
} else if (step>1){
togglePreviousStep()
}
}}
visible={showModal}
//...
>
<NewRidesModal
//...
/>
</Modal>
onBackBackButtonPress 实际上已弃用或删除。
后来,我在 https://reactnative.dev/docs/modal#onrequestclose 上阅读了更多关于模态文档的内容,我发现:
The onRequestClose callback is called when the user taps the hardware back button on Android or the menu button on Apple TV.
我应该在提出这个问题之前调查过这个问题。我需要的一切都可以使用 onRequestClose
道具完成,如下所示:
<Modal
onRequestClose={() => {
if (step===1) {
toggleModal();
} else if (step>1 && step<8){
togglePreviousStep();
}
}}
>
//...
</Modal>