Je veux inviter les utilisateurs à obtenir des informations sur onPress, mais le retour de JSX à partir d'un onPress n'a jamais fonctionné, alors quelle est une solution de contournement possible pour retourner JSX en fonction d'un clic sur le bouton. Voici mon code:
const InputPrompt = (props) => { const [name, setName] = useState(''); return( <View> <DialogInput title={"New Activity"} submitText={"Add"} hintInput ={"Enter activity name....."} submitInput={ (inputText) => {setName(inputText), props.setPrompt(false)} } closeDialog={ () => {props.setPrompt(false)}}> </DialogInput> <Text>{name}</Text> </View> ); }
Voilà à quoi ressemble mon code:
const Newact = props => { const [prompt, setPrompt] = useState(false); return( <View style={styles.button} > <TouchableOpacity style={styles.center} onPress={() => setPrompt(true)}> <Text style={styles.plusSign}>+</Text> </TouchableOpacity> {prompt ? <InputPrompt setPrompt={setPrompt} /> : null} </View> ); }
et Le composant InputPrompt
est:
import React, { useState } from 'react'; import { StyleSheet, KeyboardAvoidingView, View, Text, TouchableOpacity } from 'react-native'; import InputPrompt from './InputPrompt' const Newact = (props) => { const [visible, setVisible] = useState(false) return( <View> <View style={styles.button} > <TouchableOpacity style={styles.center} onPress={getTitle}> <Text style={styles.plusSign}>+</Text> </TouchableOpacity> </View> </View> ); } const getTitle = () =>{ return( <InputPrompt /> ) }
3 Réponses :
Lorsqu'ils appuient sur, vous devez définir l'état. Cela provoque le rendu du composant, et sur ce nouveau rendu, vous pouvez renvoyer JSX décrivant à quoi vous voulez que l'écran ressemble. Je ne sais pas exactement où vous souhaitez afficher l'invite de saisie, mais peut-être quelque chose comme ceci:
const Newact = (props) => { const [visible, setVisible] = useState(false) const [prompt, setPrompt] = useState(false); return ( <View> <View style={styles.button} > <TouchableOpacity style={styles.center} onPress={() => setPrompt(true)}> <Text style={styles.plusSign}>+</Text> </TouchableOpacity> </View> {prompt && <InputPrompt />} </View> ); }
Tu es incroyable!! merci pour la réponse rapide de son fonctionnement.
comme suivi, je vois que l'invite n'est renseignée qu'au premier clic. Comment puis-je inclure une réinitialisation à l'invite var
? quelque chose comme {prompt?
Dépend de la condition que vous souhaitez réinitialiser. Si le même TouchableOpacity doit être capable de le masquer s'il est actuellement affiché, changez-le en onPress = {() => setPrompt (! Prompt)}
. Si une presse différente est censée le cacher, écrivez un onPress pour ce composant qui appelle setPrompt (false)
. Ou peut-être est-il censé disparaître en fonction d'une heure, auquel cas vous utiliseriez un effet. Il existe de nombreuses options, en fonction de votre objectif.
@OmarOdaini puis sélectionnez la réponse comme la bonne
Vous devez changer votre code en quelque chose comme ceci:
const Newact = props => { const [visible, setVisible] = useState(false); const getTitle = () => { setVisible(true); } return ( <View> <View style={styles.button}> <TouchableOpacity style={styles.center} onPress={getTitle}> <Text style={styles.plusSign}>+</Text> </TouchableOpacity> { visible && <InputPrompt /> } </View> </View> ); };
Tu es incroyable!! merci pour la réponse rapide, même idée que le commentaire précédent;)
La mise à jour de l'état onPress est un moyen simple d'y parvenir car il restituera ensuite le composant et vous pouvez exécuter n'importe quel jsx en fonction de cet état que vous avez mis à jour.
Vous pouvez utiliser une expression ternaire
{isPressed?
voici à quoi il ressemblera dans votre cas
const Newact = (props) => { const [visible, setVisible] = useState(false) const [prompt, setPrompt] = useState(false); return ( <View> <View style={styles.button} > <TouchableOpacity style={styles.center} onPress={() => setPrompt(true)}> <Text style={styles.plusSign}>+</Text> </TouchableOpacity> </View> {prompt ? <InputPrompt /> : null} </View> ); }