0
votes

useState pour les éléments Dropdown - ReactJS

Problème

Lorsque je sélectionne une option dans le menu déroulant, rien n'est sélectionné car la valeur du role est une chaîne vide. Le framework d'interface utilisateur utilisé est l'interface utilisateur sémantique.

Comment fonctionne le programme

Lorsque l'utilisateur saisit les champs d'entrée, la fonction onChange prend l'entrée et la sauvegarde dans la chaîne vide dans les values . Cependant, cela n'est pas valide lorsque le type d'entrée est un menu déroulant avec des entrées prédéfinies. Par conséquent, lorsque l'utilisateur sélectionne l'une des options, il devient automatiquement une chaîne vide.

Je ne suis pas en mesure de comprendre comment résoudre ce problème.

Le code

 const [values, setValues] = useState({
      username: '',
      password: '',
      confirmPassword: '',
      email: '',
      role: '' // This here seems to be the issue.
  })

//OnChange Function (works for Input types)

 const onChange = (e) => {
        setValues({...values, [e.target.name]: e.target.value});
 }

//FormInput for reference (working)

<Form.Input 
      label="Full Name"
      placeholder="Full Name"
      type="text"
      name="username"
      value={values.username}
      onChange={onChange}
/>


//DropDown menu from SemanticUI

<Dropdown
    placeholder="Select Role"
    name="role"
    fluid
    selection
    options={options}
    value={values.role}
    onChange={onChange}
/>

//Options for Dropdown Menu

const options =[
        {
            key: 'Client',
            text: 'Client',
            value: 'Client'
        },
        {
            key: 'Employee',
            text: 'Employee',
            value: 'Employee'
        }
    ]

Mise à jour: ajout de "name"=role dans le menu déroulant. Cependant ne fonctionne toujours pas.

Capture d'écran avant de sélectionner l'élément du menu déroulant

img1

Capture d'écran après avoir sélectionné l'élément du menu déroulant

img2 après avoir rempli

Mise à jour: images ajoutées pour référence


2 commentaires

Que voyez-vous dans e.target.name ? Pouvez-vous console.log(e.target.name)


Est-ce que c'est parce que les éléments de liste déroulante n'ont pas de nom?


3 Réponses :


2
votes

Votre Dropdown onChange devrait être quelque chose comme ça

<Dropdown
    placeholder="Select Role"
    fluid
    selection
    options={options}
    value={values.role}
    onChange={(e, {value}) => onChange({
     target: {name: 'role', value}
    })}
/>

Reportez-vous à la démo d'entrée contrôlée ici: https://react.semantic-ui.com/modules/dropdown/#usage-controlled

EDIT: Si vous ne voulez pas mettre à jour votre fonction onChange , cela le ferait peut-être.

 const onChange = (e, {value}) => {
    setValues({...values, role: value});
 }


2 commentaires

Merci, mais je pense que ma fonction onChange est la même. Il prend la valeur des éléments nommés et les ajoute aux valeurs useState.


e.target.name n'est pas défini, cela ne fonctionnera pas pour Dropdown car e.target représente votre élément de liste déroulante



0
votes
    <Dropdown
        placeholder="Select Role"
        name="role"
        id="role"
        fluid
        selection
        options={options}
        value={values.role}
        onChange={onChange}
    />
on Dropdown props:
add name="role"

Reason why you need to provide "name" prop on each form element to get value on onChange function.

onChange functions looks "e.target.name"
which is you didn't provide any "name" prop on your Dropdown Input.


2 commentaires

Merci, mais ça ne marche toujours pas. Lorsque je sélectionne une option, elle redevient vide.


pouvez-vous s'il vous plaît le journal de la console ci-dessous sur la fonction onChange. Voyons ce que vous obtenez lorsque vous modifiez les options de liste déroulante du navigateur. const onChange = (e) => {console.log (e.target.name, e.target.value); setValues ({... valeurs, [e.target.name]: e.target.value}); }



1
votes

J'ai rencontré le même problème avec un formulaire que je crée et ma solution n'est pas du tout SÈCHE, mais cela fonctionne.

const [state, setState] = useState({
prayer_request:{
name: '',
state:'',
temptation:'',
}
})
const handleChange = (event) =>{
const updateInput = Object.assign({}, formInputs, { [event.target.id]: 
event.target.value}, )
updateFormInputs(updateInput)
}
const [requests, setRequests] = useState([])
const [formInputs, updateFormInputs] = useState({
name: '',
state: state,
temptation: state,
})

Pour chaque option dans la liste déroulante, j'ai ajouté l' id="state" pour mon handleChange() et il a pu ensuite prendre n'importe quelle option sélectionnée dans le menu déroulant et la mettre dans mon objet pour la transmettre à ma base de données.

Et mon gestionnaire de changement et useState() hooks useState() sont ci-dessous:

 <select name="State" id="state" value={props.formInputs.state} onChange={props.handleChange}> 
           <option id="state" value="Alabama">AL</option>
           <option id="state" value="Alaska">AK</option>


0 commentaires