如何使用插槽从父级到子级-vuejs传递道具

Kun*_*nle 13 vue.js vue-component vuejs2

我有一个父组件和一个子组件.

父组件的模板使用一个槽,以便父组件中可以包含一个或多个子组件.

子组件包含一个称为"信号"的道具.

我希望能够在父组件中更改名为"parentVal"的数据,以便使用父级的值更新子级的信号prop.

这似乎应该是简单的东西,但我无法弄清楚如何使用插槽来执行此操作:以下是一个运行示例:

const MyParent = Vue.component('my-parent', {
  template: `<div>
               <h3>Parent's Children:</h3>
               <slot :signal="parentVal"></slot>
             </div>`,

  data: function() {
    return {
      parentVal: 'value of parent'
    }
  }
});

const MyChild = Vue.component('my-child', {
  template: '<h3>Showing child {{signal}}</h3>',
  props: ['signal']
});

new Vue({
  el: '#app',
  components: {
    MyParent,
    MyChild
  }
})
Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/vue/dist/vue.js"></script>

<div id="app">
  <my-parent>
    <my-child></my-child>
    <my-child></my-child>
  </my-parent>
</div>
Run Code Online (Sandbox Code Playgroud)

Ber*_*ert 20

您需要使用范围内的插槽.你几乎就在那里,我刚刚添加了创建范围的模板.

  <my-parent>
    <template slot-scope="{signal}">
      <my-child :signal="signal"></my-child>
      <my-child :signal="signal"></my-child>
    </template>
  </my-parent>
Run Code Online (Sandbox Code Playgroud)

这是您的代码更新.

const MyParent = Vue.component('my-parent', {
  template: `<div>
               <h3>Parent's Children:</h3>
               <slot :signal="parentVal"></slot>
             </div>`,

  data: function() {
    return {
      parentVal: 'value of parent'
    }
  }
});


const MyChild = Vue.component('my-child', {
  template: '<h3>Showing child {{signal}}</h3>',
  props: ['signal']
});

new Vue({
  el: '#app',
  components: {
    MyParent,
    MyChild
  }
})
Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/vue/dist/vue.js"></script>

<div id="app">
  <my-parent>
    <template slot-scope="{signal}">
      <my-child :signal="signal"></my-child>
      <my-child :signal="signal"></my-child>
    </template>
  </my-parent>
</div>
Run Code Online (Sandbox Code Playgroud)


Vue 2.6发布引入了一个统一的v-slot指令,可用于普通或作用域的插槽.在这种情况下,由于您使用的是默认的未命名槽,因此signal可以通过v-slot="{ signal }"以下方式访问该属性:

  <my-parent>
    <template v-slot="{ signal }">
      <my-child :signal="signal"></my-child>
      <my-child :signal="signal"></my-child>
    </template>
  </my-parent>
Run Code Online (Sandbox Code Playgroud)

  • 有什么办法可以做到而不必在“ app”文件中编写“ v-slot”和“:signal”,而是直接将其集成到我的“ my-parent”和“ my-child”模板中只需在我的应用程序的父级上添加`signal`道具,我的孩子就可以自动访问它。 (2认同)