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

VueJS Discussion :

Vue.JS3 passer un objet à un composant


Sujet :

VueJS

  1. #1
    Membre du Club
    Inscrit en
    novembre 2010
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : novembre 2010
    Messages : 135
    Points : 53
    Points
    53
    Par défaut Vue.JS3 passer un objet à un composant
    Bonjour,

    Je tente de passer un objet à un composant enfant mais je bloque.
    Je procède de la façon suivante :

    Composant parent :
    Dans mon setup()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    let agent = reactive({})
        //Appel a mon api pour charger mes donnees
        agent = response.data

    Dans mon template j'appel mon composant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <monComposant:agent="agent"/>
    Ensuite dans mon template enfant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <template>
      <q-card>
        <q-card-section>
          <div class="row justify-center">
            <q-input class="col-5 q-mr-sm" v-model="form.nom" label="Nom" stack-label :dense="dense" readonly />
            <q-input class="col-5 q-ml-sm" v-model="form.dateNai" label="Date de naissance" stack-label :dense="dense" readonly />
          </div>
    ...
    mon setup enfant:

    Code : 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
    import {defineComponent, toRefs, ref} from 'vue'
     
    export default defineComponent({
      name: "monComposant",
      props: {
        agent: Object
      },
      setup (props) {
        const { agent } = toRefs(props)
        let form = ref(agent)
     
        return {
          form
        }
      }
    })
    Mais aucune valeur s'éffiche dans mes input. Vous avez une idée?

  2. #2
    Membre du Club
    Inscrit en
    novembre 2010
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : novembre 2010
    Messages : 135
    Points : 53
    Points
    53
    Par défaut
    Je m'auto répond pour ceux a qui cela intéresse
    Il faut utiliser les Provide et Inject de vue pour passer les propriétés.

  3. #3
    Membre expérimenté
    Avatar de gwyohm
    Homme Profil pro
    Développeur informatique
    Inscrit en
    octobre 2007
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : octobre 2007
    Messages : 925
    Points : 1 333
    Points
    1 333
    Par défaut
    hello,

    Utiliser provide et inject est un contournement, tu introduis une dépendance entre tes 2 composants.

    Je pense que ton souci venait de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    const { agent } = toRefs(props)
    let form = ref(agent)
    en faisant ca, form est une ref sur une ref, donc dans ton template, il aurait fallu faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    form.value.nom par exemple
    Si tu changes pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const { agent: form } = toRefs(props)
    je pense que ca passait
    Par ailleurs un autre point dont je ne suis pas sur que ce soit bon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    let agent = reactive({})
    //Appel a mon api pour charger mes donnees
    agent = response.data
    En écrivant agent = response.data, je pense que tu casses l'objet réactif.
    J'aurai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    let agent = reactive({})
    //Appel a mon api pour charger mes donnees
    agent = reactive(response.data)
    on ne dit pas "ça ne marche pas" on dit "je suis incapable de faire fonctionner correctement les outils mis à ma disposition"
    Pas de question technique par MP

  4. #4
    Membre du Club
    Inscrit en
    novembre 2010
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : novembre 2010
    Messages : 135
    Points : 53
    Points
    53
    Par défaut
    Merci @gwyohm pour tes explications.

    C'est vrai qu'avec provide je trouve ca plus simple.
    J'ai testé de la facons suivante :

    Dans mon composant parent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    const agent = reactive({})
    ...
    //Appel api
    agent.value = response.data
    provide('agent', agent)
    Et dans mon composant enfant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    const agent = inject('agent', {})
    return {
          agent
        }
    Pour le template :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <q-input class="col-5 q-mr-sm" v-model="agent.value.nom" label="Nom" stack-label :dense="dense" readonly />
    Cela fonctionne si j'ai une valeur mais au chargement de ma page ca plante et m'indique que value n'est pas définie. Et si je n'indique pas value, il ne m'affiche rien.
    J'ai testé également avec ta remarque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    agent.value = reactive(response.data)
    Mais cela ne change rien.

  5. #5
    Membre du Club
    Inscrit en
    novembre 2010
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : novembre 2010
    Messages : 135
    Points : 53
    Points
    53
    Par défaut
    J'ai finalement résolu mon problème de la sorte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //Si mon API me retourne une valeur
    agent.value = response.data
     
    //Sinon
    agent.value = {value: {}}

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 14/05/2008, 21h50
  2. [RCP][débutant] Comment passer un objet d'une vue à une autre
    Par jycronier dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 20/07/2006, 15h13
  3. [SAX] Passer d'objet java en fichier XML?
    Par spoutyoyo dans le forum Format d'échange (XML, JSON...)
    Réponses: 15
    Dernier message: 05/01/2005, 08h31
  4. [POO] Passer un objet HTML en argument.
    Par defacta dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/12/2004, 10h44
  5. Plusieurs vues pour le même objet
    Par nicolas66 dans le forum OpenGL
    Réponses: 4
    Dernier message: 25/10/2004, 10h27

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