IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

React Discussion :

Formulaire champ texte: je ne rentre les lettres que une par une


Sujet :

React

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 280
    Par défaut Formulaire champ texte: je ne rentre les lettres que une par une
    Bonjour,

    j'ai chois de faire un formulaire un peu spécial !!!
    Je vais chercher mes options des champs select dans une BDD

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    import React, {useState, useEffect} from "react";
    import { stateForm } from "./datas";
     
    export default function AnimalForm(props) {
     
        const [form, setForm] = useState(stateForm)
     
        const Field = ({param}) => {
     
            let inputField = ""
     
            const Select = ({table}) => {
     
                const [error, setError] = useState(null)
                const [options, setOptions] = useState([])
     
                 //get iri and option name for each field
                const extractDatas = (datas) => {
                    let arrayDatas = []
                    for ( const data of datas) {
                        // nem key in data
                        const name = data["@type"].toLowerCase() + "Name"
                        // iri
                        const id = data["@id"]
                        arrayDatas.push([id, data[name]])
                    }
                    return arrayDatas
                }
     
                useEffect ( () => {
                    fetch('api/' + table)
                    .then( response => response.json())
                    .then( 
                        result => {
                            setOptions(extractDatas(result["hydra:member"]))
                        },
                        error => setError(error)
                        )
                }, [])
     
                return (   
                    <select value={form[param.entityField]} onChange={handleChange} name={param.entityField}>
                        <option value=""></option>
                        {options.map( op => <option key={op[0]} value={op[0]}>{op[1]}</option> )}
                    </select>
                )
            }
     
            const onChange = (ev) => {
     
                const {name, value} = ev.target
     
                setForm( (state) => ({
                    ...state, [name]: value
                }))
            }
     
            switch (param.type) {
                case 'text':
                    inputField =  <input type="text" id={param.entityField} onChange={onChange} value={form[param.entityField]} name={param.entityField}/>;
                    break;
                case 'select':
                    inputField = <Select table={param.table}/>;
                    break;
            }
     
            return (
                <div className="form-group">
                        <label htmlFor={param.entityField}>{param.labelName}
                        {inputField}
                        </label>
                </div>
            )
        }
     
        const handleSubmit = (ev) => {
            console.log('je soumet')
            ev.preventDefault()
            let url = "api/animal"
            for ( const key in form) {
                if (form[key]) {
                    url = url + "?" + key + "=" + form[key]
                }
            }
        }
     
        return (
            <form onSubmit={handleSubmit}>
                {props.fields.map( f => <Field param={f} key={f.entityField}/>)}
                <button type="submit" className="btn btn-primary">rechercher</button>
            </form>
        )
    }

    et voici aussi mon stateForm:
    Code text : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    const stateForm = {
        animalName: '',
        diet: '',
        species: '',
        continent: ''
    }

    et pour terminer les props.fields :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    const fullFields = [
        {'labelName': 'nom', 'type': 'text', 'entityField': 'animalName', 'table': 'animals'},
        {'labelName': 'régime', 'type': 'select', 'entityField': 'dietName', 'table': 'diets'},
        {'labelName': 'espèce', 'type': 'select', 'entityField': 'speciesName', 'table': 'species'},
        {'labelName': 'continent', 'type': 'select', 'entityField': 'continentName', 'table': 'continents'}
    ]

    Ça fonctionne presque bien.
    le résultat est un formulaire avec un champ texte et trois champs select.
    Je peux sélectionner les options dans les champs select, mais dans le champ texte, il y a un problème:
    je rentre une lettre et :
    Nom : input.png
Affichages : 249
Taille : 83,3 Ko

    Je dois par la suite cliquer dans le champ pour rentrer une nouvelle lettre...
    la valeur change et j'ai mes deux lettres dans le input, mais si je veux une troisième, je reclique, ...

    je ne comprend pas ce qu'il se passe. Pourtant, le onChange est exécuté, mon objet form a bien changé, mais je ne comprends pas ce qu'il se passe ensuite...
    avec un formulaire plus classique :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    return (
            <form onSubmit={handleSubmit}>
                <label htmlFor="animalName">
                    nom
                    <input type="text" value={form.animalName} onChange={onChange} name="animalName"/>
                </label>
                {/* {props.fields.map( f => <Field param={f} key={f.entityField}/>)} */}
                <button type="submit" className="btn btn-primary">rechercher</button>
            </form>
        )

    Je n'ai pas de souci. pourquoi les champs sélection ne posent pas de problème ?

  2. #2
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 280
    Par défaut
    Ce qui me chiffonne le plus , c'est le fait que la liste qui devrait s'afficher lors de la recherche se trouve en haut à gauche de ma page,
    au lieu d'être en-dessous du input comme d'habitude !

    Évidemment i doit y avoir un lien avec le fait que je ne peux écrire qu'un lettre à la fois.
    Mon curseur change de place ???

    C'est un phénomène que je ne connais pas , vraiment . Si quelqu'un a une idée.
    Merci,

    Laurent.

  3. #3
    Membre expérimenté
    Homme Profil pro
    OoW
    Inscrit en
    Juin 2019
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Ukraine

    Informations professionnelles :
    Activité : OoW

    Informations forums :
    Inscription : Juin 2019
    Messages : 146
    Par défaut
    \ô/
    si je ne m'abuse tu utilises une élément select et non un élément datalist, lié à ton input, qui correspondrait mieux à ce que tu veux faire et qui placerait celui-ci au bon endroit par défaut.

    Le remplissage d'un datalist est semblable à celui d'un select via les options.

  4. #4
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 280
    Par défaut
    Non, mes éléments select fonctionnent comme il se doit !

    C'est l'élément text que je dois mettre dans le dernier return ,( celui de mon composant ) , sinon, j'ai l'effet expliqué plus haut.
    Mes éléments select, je peux faire un composant Select qui va les retourner tous.
    J'aimerais en faire de même avect un composant Text , pour retourner tous les éléments texte.

    Pour l'instant , je laisse comme ça , ça fonctionne aussi...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2.x] formulaire champ text d'une entité
    Par rafleboss dans le forum Symfony
    Réponses: 5
    Dernier message: 28/10/2011, 15h38
  2. [AC-2010] Formulaires:champs texte indépendant
    Par Chenin84 dans le forum IHM
    Réponses: 7
    Dernier message: 14/08/2011, 07h14
  3. Réponses: 7
    Dernier message: 12/02/2010, 10h48
  4. [PHP 5.2] traitement formulaire champs texte
    Par tiesto95 dans le forum Langage
    Réponses: 2
    Dernier message: 21/01/2009, 16h23
  5. formulaire: champ texte + liste deroulante
    Par mat21 dans le forum Langage
    Réponses: 3
    Dernier message: 17/01/2006, 10h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo