Chuyển đạo cụ động đến thành phần động trong VueJS


105

Tôi có một chế độ xem động:

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

với một phiên bản Vue được liên kết:

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

Điều này cho phép tôi thay đổi thành phần của mình một cách linh hoạt.

Trong trường hợp của tôi, tôi có ba thành phần khác nhau: myComponent, myComponent1, và myComponent2. Và tôi chuyển đổi giữa chúng như thế này:

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

Bây giờ, tôi muốn chuyển các đạo cụ cho myComponent1.

Làm cách nào để chuyển các đạo cụ này khi tôi thay đổi loại thành phần myComponent1?


Bạn chuyển đạo cụ qua các thuộc tính trên phần tử propName="propValue". Đó có phải là câu hỏi của bạn?
thanksd

Tôi có thể không phải vì tôi không bao giờ viết <myComponent1 propName="propValue">tôi thay đổi thành phần lập trình với$parent.currentComponent = componentName
Epitouille

Vâng, nhưng bạn viết <div :is="currentComponent"></div>. Đó là nơi bạn sẽ thêm thuộc tính.
thanksd

Có nhưng đạo cụ phụ thuộc vào thành phần. Ví dụ: myComponent1lấy đạo cụ và myComponent2không lấy đạo cụ
Epitouille

Câu trả lời:


213

Để chuyển động các đạo cụ, bạn có thể thêm v-bindchỉ thị vào thành phần động của mình và chuyển một đối tượng chứa tên và giá trị hỗ trợ của bạn:

Vì vậy, thành phần động của bạn sẽ giống như sau:

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

Và trong phiên bản Vue của bạn, currentPropertiescó thể thay đổi dựa trên thành phần hiện tại:

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

Vì vậy, bây giờ, khi currentComponentmyComponent, nó sẽ có một footài sản bằng 'bar'. Và khi không có, sẽ không có thuộc tính nào được chuyển.


Tại sao điều này không hiệu quả với tôi? Nó hoạt động cho thành phần đầu tiên, nhưng sau khi tôi thay đổi “currentComponent”, tôi nhận được “e.currentProperties” không được xác định trên thành phần con.
Ricardo Vigatti

2
@RicardoVigatti, không thấy bất kỳ mã nào của bạn, thật khó để biết
cảm ơn

Này, nếu tôi muốn thêm một cái gì đó vào <component>(here)</component>. Nó có thể?
Felipe Morales

1
@FelipeMorales, vâng, bạn chỉ cần xác định giá trị mặc định <slot>cho mỗi thành phần mà bạn đang hiển thị động. vuejs.org/v2/guide/components-slots.html
thanksd

1
Hướng dẫn phong cách nói rằng tên prop phải càng chi tiết càng tốt. Cách này phá vỡ quy tắc. Đây cũng là những gì tôi sử dụng, nhưng tôi đang tìm kiếm một giải pháp tốt hơn.
Koray Küpe


2

Bạn có thể xây dựng nó như ...

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

Nếu bạn đã nhập mã của bạn thông qua yêu cầu

var patientDetailsEdit = require('../patient-profile/patient-profile-personal-details-edit')
và khởi tạo phiên bản dữ liệu như bên dưới

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

bạn cũng có thể tham chiếu thành phần thông qua thuộc tính name nếu thành phần r của bạn đã gán nó

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.