无论如何要在传递给插槽的文本中使用数据属性?

Posted

技术标签:

【中文标题】无论如何要在传递给插槽的文本中使用数据属性?【英文标题】:Anyway to use data properties in text passed to slot? 【发布时间】:2018-01-11 20:46:31 【问题描述】:

我是 Vue 的新手,但我遇到了问题。我已经搜索过了,但我想我的大脑一定是疯了,因为我不知道如何正确表达这个词。

我有这样的设置:

Vue.component('custom-component', 
  template: '<div><slot></slot></div>',
  data: function() 
    return 
      parent_data: [1, 2, 3, 4, 5]
    
  
);

Vue.component('sub-component', 
  props: 
    dataProp: 
      default: []
    
  ,
  data: function() 
    return 
      data: []
    
  ,
  template: '<div class="subs">data.length<slot></slot></div>',
  mounted: function() 
    this.data = this.dataProp;
  
);

new Vue(
  el: '#root'
);
<script src="https://unpkg.com/vue@2.4.2"></script>
<div id="root">
  <custom-component>
    hello
    <sub-component>
      sub component hello
    </sub-component>
  </custom-component>
</div>

注意parent_data 属性实际上是在 ajax 调用中通过 Vue Resource 定义的,尽管这似乎与此无关。

您会看到我们在浏览器中得到“hello 0 sub component hello”输出。好的,酷。所以我想我会摆弄它并尝试将一些文本放入组件的文本槽中,如下所示:

Vue.component('custom-component', 
  template: '<div><slot></slot></div>',
  data: function() 
    return 
      parent_data: [1, 2, 3, 4, 5]
    
  
);

Vue.component('sub-component', 
  props: 
    dataProp: 
      default: []
    
  ,
  data: function() 
    return 
      data: []
    
  ,
  template: '<div class="subs"><slot></slot></div>',
  mounted: function() 
    this.data = this.dataProp;
  
);

new Vue(
  el: '#root'
);
<script src="https://unpkg.com/vue@2.4.2"></script>
<div id="root">
  <custom-component>
    hello
    <sub-component>
      data.lengthsub component hello
    </sub-component>
  </custom-component>
</div>

但这不再像我预期的那样有效。为了使这个示例正常工作,我必须做什么?

这个问题更接近现实的部分看起来像这样:

Vue.component('custom-component', 
  template: '<div><slot></slot></div>',
  data: function() 
    return 
      parent_data: [1, 2, 3, 4, 5]
    
  ,
  mounted: function() 
    //this.$http.get('/page/here').then(results=> this.parent_data = results, console.error );
  
);

Vue.component('sub-component', 
  props: 
    dataProp: 
      default: []
    
  ,
  data: function() 
    return 
      data: []
    
  ,
  template: '<div class="subs"><slot></slot></div>',
  mounted: function() 
    this.data = this.dataProp;
  
);

new Vue(
  el: '#root'
);
<script src="https://unpkg.com/vue@2.4.2"></script>
<div id="root">
  <custom-component>
    hello
    <sub-component :data-prop="parent_data">
      data.length sub component hello
    </sub-component>
  </custom-component>
</div>

提前致谢!

【问题讨论】:

【参考方案1】:

如果要从槽内的child引用数据,需要使用scoped slots。

这是您最后一个更新为使用作用域插槽的示例。

console.clear()

Vue.component('custom-component', 
  template: '<div><slot :parent_data="parent_data"></slot></div>',
  data: function() 
    return 
      parent_data: [1, 2, 3, 4, 5]
    
  ,
  mounted: function() 
    //this.$http.get('/page/here').then(results=> this.parent_data = results, console.error );
  
);

Vue.component('sub-component', 
  props: 
    dataProp: 
      default: []
    
  ,
  data: function() 
    return 
      subData: this.dataProp
    
  ,
  template: '<div class="subs"><slot :sub-data="subData"></slot></div>',
  mounted: function() 
    console.log(this.dataProp)
  
);

new Vue(
  el: '#root'
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.2/vue.js"></script>
<div id="root">
  <custom-component>
    <template scope="parent_data">
      hello
      <sub-component :data-prop="parent_data">
        <template scope="props">
          props.subData.length sub component hello
        </template>
      </sub-component>
    </template>
  </custom-component>
</div>

本质上,您将希望能够在子插槽中使用的数据作为插槽上的属性公开,

<slot :parent_data="parent_data"></slot>

然后你必须用 template 包含关键字 scope 的插槽中要使用的内容。

<template scope="props">
  props.subData.length sub component hello
</template>

模板的scope 属性中的表达式定义了您将如何访问子节点的数据。在上面的示例中,我使用了scope="props",这意味着在插槽上传递的所有属性都可以作为props 的属性使用。您还可以在范围表达式中使用对象解构来获取您想要使用的属性,如scope="parent_data"

【讨论】:

以上是关于无论如何要在传递给插槽的文本中使用数据属性?的主要内容,如果未能解决你的问题,请参考以下文章

vue2.1.x 新增作用域插槽

Vue 作用域插槽slot

Vue 作用域插槽slot-scope

如何访问创建的钩子中的插槽道具?

Vue 组件文本仅部分传递到插槽,其余部分出现在外部 div

将动态插槽从父级传递到子级到孙子级