Meneruskan alat peraga secara dinamis ke komponen dinamis di VueJS


105

Saya memiliki pandangan dinamis:

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

dengan contoh Vue terkait:

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

Ini memungkinkan saya untuk mengubah komponen saya secara dinamis.

Dalam kasus saya, saya memiliki tiga komponen yang berbeda: myComponent, myComponent1, dan myComponent2. Dan saya beralih di antara mereka seperti ini:

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

Sekarang, saya ingin meneruskan properti ke myComponent1.

Bagaimana saya bisa melewatkan props ini ketika saya mengubah tipe komponen menjadi myComponent1?


Anda meneruskan props melalui atribut pada elemen tersebut propName="propValue". Apa itu pertanyaanmu?
terima kasih

Saya tidak bisa karena saya tidak pernah menulis. <myComponent1 propName="propValue">Saya mengubah komponen secara terprogram dengan$parent.currentComponent = componentName
Epitouille

Ya tapi Anda menulis <div :is="currentComponent"></div>. Di situlah Anda akan menambahkan atribut.
terima kasih

Ya, tetapi alat peraga tergantung dari komponennya. Misalnya, myComponent1ambil alat peraga dan myComponent2jangan ambil alat peraga
Epitouille

Jawaban:


213

Untuk meneruskan props secara dinamis, Anda dapat menambahkan v-binddirektif ke komponen dinamis Anda dan meneruskan objek yang berisi nama dan nilai prop Anda:

Jadi komponen dinamis Anda akan terlihat seperti ini:

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

Dan dalam Vue instance Anda, currentPropertiesdapat berubah berdasarkan komponen saat ini:

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

Jadi sekarang, ketika currentComponentada myComponent, itu akan memiliki fooproperti yang sama dengan 'bar'. Dan jika tidak, tidak ada properti yang akan diteruskan.


Mengapa ini tidak berhasil untuk saya? Ia bekerja untuk komponen pertama, tetapi setelah saya mengubah "currentComponent" saya mendapatkan "e.currentProperties" tidak ditentukan pada komponen anak.
Ricardo Vigatti

2
@RicardoVigatti, tanpa melihat satu pun kode Anda, cukup sulit untuk mengetahuinya
terima kasih

Hei, Jika saya ingin menambahkan sesuatu <component>(here)</component>. Apakah itu mungkin?
Felipe Morales

1
@FelipeMorales, ya, Anda hanya perlu menentukan default <slot>untuk setiap komponen yang Anda render secara dinamis. vuejs.org/v2/guide/components-slots.html
terima kasih

1
Panduan gaya mengatakan bahwa nama prop harus sedetail mungkin. Dengan cara ini melanggar aturan. Ini juga yang saya gunakan, tetapi saya mencari solusi yang lebih baik.
Koray Küpe


2

Anda bisa membangunnya seperti ...

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"/>


1

Jika Anda telah mengimpor kode Anda melalui memerlukan

var patientDetailsEdit = require('../patient-profile/patient-profile-personal-details-edit')
dan initalisasikan contoh data seperti di bawah ini

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

Anda juga dapat mereferensikan komponen melalui properti name jika Anda r komponen telah ditugaskan

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.