156 votes

Passer des props dynamiquement à un composant dynamique dans VueJS

J'ai une vue dynamique :

<div id="myview">
  <div :is="currentComponent"></div>
</div>

avec une instance Vue associée :

new Vue ({
  data: function () {
    return {
      currentComponent: 'myComponent',
    }
  },
}).$mount('#myview');

Cela me permet de modifier mon composant de manière dynamique.

Dans mon cas, j'ai trois composants différents : myComponent , myComponent1 y myComponent2 . Et je passe de l'un à l'autre comme ça :

Vue.component('myComponent', {
  template: "<button @click=\"$parent.currentComponent = 'myComponent1'\"></button>"
}

Maintenant, j'aimerais passer des props à myComponent1 .

Comment puis-je passer ces props lorsque je change le type de composant en myComponent1 ?

0 votes

Vous passez les props via les attributs de l'élément propName="propValue" . C'est votre question ?

0 votes

Je ne peux pas parce que je n'écris jamais <myComponent1 propName="propValue"> Je modifie le composant de manière programmatique avec $parent.currentComponent = componentName

0 votes

Oui, mais vous écrivez <div :is="currentComponent"></div> . C'est là qu'il faut ajouter l'attribut.

291voto

thanksd Points 25423

Pour passer les props de manière dynamique, vous pouvez ajouter l'option v-bind à votre composant dynamique et passez-lui un objet contenant les noms et les valeurs de vos prop :

Votre composant dynamique ressemblerait donc à ceci :

<component :is="currentComponent" v-bind="currentProperties"></component>

Et dans votre instance Vue, currentProperties peut changer en fonction du composant actuel :

data: function () {
  return {
    currentComponent: 'myComponent',
  }
},
computed: {
  currentProperties: function() {
    if (this.currentComponent === 'myComponent') {
      return { foo: 'bar' }
    }
  }
}   

Donc maintenant, quand le currentComponent est myComponent il aura un foo égal à 'bar' . Et quand ce ne sera pas le cas, aucune propriété ne sera transmise.

0 votes

Pourquoi cela ne fonctionne-t-il pas pour moi ? Cela fonctionne pour le premier composant, mais après avoir changé le "currentComponent", j'obtiens un "e.currentProperties" non défini sur le composant enfant.

3 votes

@RicardoVigatti, sans voir votre code, c'est assez difficile de savoir

0 votes

Hey, si je veux ajouter quelque chose dans <component>(here)</component> . C'est possible ?

23voto

Jquestions Points 136

Vous pouvez également vous passer de la propriété calculée et mettre l'objet en ligne.

<div v-bind="{ id: someProp, 'other-attr': otherProp }"></div>

Montré dans les docs sur V-Bind - https://vuejs.org/v2/api/#v-bind

15voto

Kornél Takó Points 11

Vous pourriez le construire comme...

comp: { component: 'ComponentName', props: { square: true, outlined: true, dense: true }, model: 'form.bar' }

<component :is="comp.component" v-bind="{...comp.props}" v-model="comp.model"/>

2voto

Mark Dowton Points 11

Si vous avez importé votre code via require

var patientDetailsEdit = require('../patient-profile/patient-profile-personal-details-edit')

et initalisez l'instance de données comme ci-dessous

data: function () {
            return {
                currentView: patientDetailsEdit,
            }

vous pouvez également faire référence au composant par le biais de la propriété "name" si votre composant en est doté.

currentProperties: function() {
                if (this.currentView.name === 'Personal-Details-Edit') {
                    return { mode: 'create' }
                }
            }

2voto

J'ai le même problème, résolu par ce qui suit :

<component :is="currentComponent" v-bind="resetProps"> 
   {{ title }}
</component>

et la script est

export default { 
  …
  props:['title'],
  data() {
    return {
      currentComponent: 'component-name',
    }
  },
  computed: {
    resetProps() {
      return { ...this.$attrs };
    },
}

<div
    :color="'error'"
    :onClick="handleOnclick"
    :title="'Title'"
/>

Je viens de reactjs et j'ai trouvé cette solution à mon problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X