VueJS의 동적 구성 요소에 동적으로 소품 전달


105

동적보기가 있습니다.

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

연결된 Vue 인스턴스와 함께 :

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

이를 통해 구성 요소를 동적으로 변경할 수 있습니다.

내 경우, 나는 세 가지 구성 요소가 있습니다 : myComponent, myComponent1,와 myComponent2. 그리고 나는 다음과 같이 그들 사이를 전환합니다.

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

이제 props를 myComponent1.

컴포넌트 유형을로 변경할 때 이러한 소품을 어떻게 전달할 수 myComponent1있습니까?


요소의 속성을 통해 소품을 전달합니다 propName="propValue". 그게 당신의 질문입니까?
감사합니다

글을 쓰지 않기 때문에 할 수 없습니다 <myComponent1 propName="propValue"> 내가 함께 프로그램 구성 요소를 변경$parent.currentComponent = componentName
Epitouille

그래,하지만 당신은 씁니다 <div :is="currentComponent"></div>. 여기에 속성을 추가합니다.
감사합니다

예,하지만 소품은 구성 요소에 따라 다릅니다. 예를 들어, myComponent1소품을 myComponent2가져
가고

답변:


213

동적으로 소품을 전달하려면 v-bind동적 구성 요소에 지시문을 추가하고 소품 이름과 값이 포함 된 객체를 전달할 수 있습니다.

따라서 동적 구성 요소는 다음과 같습니다.

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

그리고 Vue 인스턴스 currentProperties에서 현재 구성 요소에 따라 변경할 수 있습니다.

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

(가) 그래서 지금 currentComponent이다 myComponent, 그것은 것 foo같 속성을 'bar'. 그렇지 않으면 속성이 전달되지 않습니다.


왜 이것이 저에게 효과가 없습니까? 첫 번째 구성 요소에서 작동하지만 "currentComponent"를 변경 한 후 "e.currentProperties"가 자식 구성 요소에 정의되어 있지 않습니다.
Ricardo Vigatti

2
@RicardoVigatti는 코드 중 하나를 보지 않고, 그것을 알고 매우 어렵다
thanksd

이봐, 내가 뭔가를 추가하고 싶다면 <component>(here)</component>. 가능합니까?
Felipe Morales

1
@FelipeMorales, 네, <slot>동적으로 렌더링하는 각 구성 요소에 대해 기본값을 정의 하면됩니다. vuejs.org/v2/guide/components-slots.html
감사합니다.

1
스타일 가이드에 따르면 소품 이름은 최대한 자세해야합니다. 이렇게하면 규칙이 깨집니다. 이것은 또한 내가 사용하는 것이지만 더 나은 솔루션을 찾고 있습니다.
Koray Küpe 2018


2

당신은 그것을 만들 수 있습니다 ...

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

필요를 통해 코드를 가져온 경우

var patientDetailsEdit = require('../patient-profile/patient-profile-personal-details-edit')
아래와 같이 데이터 인스턴스를 초기화합니다.

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

구성 요소에 할당 된 경우 name 속성을 통해 구성 요소를 참조 할 수도 있습니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.