How to close a modal box nested in another custom component? My modal is in another component. I have a problem passing state to parent component. You can see the parent and child components below.
Parent component:
const ViewNote = ({route, navigation}) => { const [visible, setVisible] = useState(false); function visibility(cases) { setVisible(cases); console.log(cases); } return ( <View style={styles.noteContainer}> {/* 模态框 */} <FancyAlert visible={visible} /> <View style={styles.deleteContainer}> <Pressable android_ripple={{color: '#d9d9d9'}} onPress={() => setVisible(true)}> <MaterialIcons style={styles.icon} name='delete' size={40}/> </Pressable> </View> </View> ) } export default ViewNote
Subassembly:
const FancyAlert = ({visible}) => { const [showAlert, setShowAlert] = useState(false); return ( <Modal transparent visible={visible}> <View style={styles.modalContainer}> <View style={styles.dialogContainer}> <Text style={[styles.text, {fontSize: 16}]}>您确定要删除此便签吗?</Text> <View style={styles.buttonContainer}> <Pressable style={styles.cancel} android_ripple={{color: '#d9d9d9'}} onPress={() => setVisible(false)}> <Text style={[styles.text, {fontFamily: 'SofiaProBold'}]}>取消</Text> </Pressable> </View> </View> </View> </Modal> ) } export default FancyAlert
P粉5904283572023-09-12 10:49:03
Move the state to the parent component and pass the onClose function.
const ViewNote = ({route, navigation}) => { const [visible, setVisible] = useState(false); function visibility(cases) { setVisible(cases); console.log(cases); } return ( <View style={styles.noteContainer}> {/* MODAL */} <FancyAlert visible={visible} onClose={() => setVisible(false)} /> <View style={styles.deleteContainer}> <Pressable android_ripple={{color: '#d9d9d9'}} onPress={() => setVisible(true)}> <MaterialIcons style={styles.icon} name='delete' size={40}/> </Pressable> </View> </View> ) } export default ViewNote
const FancyAlert = ({visible, onClose}) => { return ( <Modal transparent visible={visible} onClose={onClose}> <View style={styles.modalContainer}> <View style={styles.dialogContainer}> <Text style={[styles.text, {fontSize: 16}]}>Are you sure you want to delete this note?</Text> <View style={styles.buttonContainer}> <Pressable style={styles.cancel} android_ripple={{color: '#d9d9d9'}} onPress={onClose}> <Text style={[styles.text, {fontFamily: 'SofiaProBold'}]}>Cancel</Text> </Pressable> </View> </View> </View> </Modal> ) } export default FancyAlert
P粉5638310522023-09-12 00:45:33
You just need to pass the "visibility" function as a property of FancyAlert. Your code should look like this:
const ViewNote = ({route, navigation}) => { const [visible, setVisible] = useState(false); function visibility(cases) { setVisible(cases); console.log(cases); } return ( <View style={styles.noteContainer}> {/* MODAL */} <FancyAlert visible={visible} visibility={visibility} /> <View style={styles.deleteContainer}> <Pressable android_ripple={{color: '#d9d9d9'}} onPress={() => visibility(true)}> <MaterialIcons style={styles.icon} name='delete' size={40}/> </Pressable> </View> </View> ) } export default ViewNote
Then, the FancyAlert component should be:
const FancyAlert = ({ visible, visibility }) => { const [showAlert, setShowAlert] = useState(false); return ( <Modal transparent visible={visible}> <View style={styles.modalContainer}> <View style={styles.dialogContainer}> <Text style={[styles.text, {fontSize: 16}]}>你确定要删除这个笔记吗?</Text> <View style={styles.buttonContainer}> <Pressable style={styles.cancel} android_ripple={{color: '#d9d9d9'}} onPress={() => visibility(false)}> <Text style={[styles.text, {fontFamily: 'SofiaProBold'}]}>取消</Text> </Pressable> </View> </View> </View> </Modal> ) } export default FancyAlert
that's it