详解Vue.js中的作用域插槽

详解Vue.js中的作用域插槽

作用域槽是Vue.js的一个有用特性,它可以使组件更加通用和可重用。唯一的问题是它们很难理解!试着让你的头在父母和孩子的范围内交织,就像解决一个棘手的数学方程。

当你不能很容易地理解某件事时,一个好的方法是试着用它来解决问题。在本文中,我将演示如何使用作用域槽来构建可重用列表组件。

详解Vue.js中的作用域插槽

基本组成部分

我们要构建的组件叫做my-list,它显示了很多东西。该特性的特殊之处在于,您可以自定义列表项在每次使用组件时的呈现方式。

立即学习“前端免费学习笔记(深入)”;

让我们首先处理最简单的用例,并获取my-list来呈现一个列表:一个几何形状名称数组和它们的边数。

app.js

  1. Vue.component('my-list', {  template: '#my-list',  data() {    return {      title: 'Shapes',      shapes: [         { name: 'Square', sides: 4 },         { name: 'Hexagon', sides: 6 },         { name: 'Triangle', sides: 3 }      ]    };  }});new Vue({  el: '#app'});

登录后复制

index.html

  1.   
    {{ title }}
    {{ shape.name }} ({{ shape.sides }} sides)
  2. 登录后复制

  3. 添加了一点CSS后,将会如下图所示:

  4. 详解Vue.js中的作用域插槽

  5. 泛化my-list

  6. 现在,我们想要使my-list功能足够多,以呈现任何类型的列表。第二个测试用例将是一个颜色列表,包括一个小样本来显示颜色。

  7. 为此,我们必须抽象特定于形状列表的任何数据。由于列表中的项的结构可能不同,我们将为my-list提供一个插槽,以便父列表可以定义任何特定列表的显示方式。

  8. app.js

  9. Vue.component('my-list', {  template: '#my-list',  props: [ 'title' ]});
  10. 登录后复制

  11. index.html

  12.   
    {{ title }}
  13. 登录后复制

  14. 现在让我们在根实例中创建my-list组件的两个实例来显示我们的两个测试用例列表:

  15. app.js

  16. new Vue({  el: '#app',  data: {    shapes: [       { name: 'Square', sides: 4 },       { name: 'Hexagon', sides: 6 },       { name: 'Triangle', sides: 3 }    ],    colors: [      { name: 'Yellow', hex: '#F4D03F', },      { name: 'Green', hex: '#229954' },      { name: 'Purple', hex: '#9B59B6' }    ]  }});
  17. 登录后复制

  18.       
          
    {{ shape.name }} ({{ shape.sides }} sides)
        
            
          
            
            {{ color.name }}      
        
      
  19. 登录后复制

  20. 就像这样:

  21. 详解Vue.js中的作用域插槽

  22. 表面成分

  23. 我们刚刚创建的代码工作得很好,但是代码并不好。my-list是按名称显示列表的组件。但是我们已经抽象了所有将列表呈现到父列表中的逻辑。组件只是用一些表示标记将列表包装起来。

  24. 考虑到组件的两个声明中仍然有重复的代码(例如

  25. 作用域的插槽

  26. 为了实现这一点,我们将使用作用域槽而不是常规槽。作用域插槽允许您将模板传递给插槽,而不是传递呈现的元素。它被称为“作用域”槽,因为尽管模板是在父作用域中呈现的,但它可以访问特定的子数据。

  27. 例如,具有作用域插槽的组件子组件可能如下所示。

  28.   
  29. 登录后复制

  30. 使用此组件的父组件将在槽中声明模板元素。此模板元素将具有一个属性范围,该范围指定别名对象。添加到slot(在子模板中)的任何道具都可以作为别名对象的属性使用。

  31.       Hello from parent    {{ props.my-prop }}  
  32. 登录后复制

  33. 显示为:

  34.   Hello from parent  Hello from child
  35. 登录后复制

  36. my-list中使用作用域插槽

  37. 让我们将列表数组作为道具传递给my-list。然后我们可以用作用域插槽替换插槽。这样my-list就可以负责迭代列表项,但是父级仍然可以定义每个列表项应该如何显示。

  38. index.html

  39.                    
  40. 登录后复制

  41. 现在我们得到my-list来迭代这些项。在v-for循环中,item是当前列表项的别名。我们可以创建一个槽,并使用v-bind=”item”将该列表项绑定到槽。

  42. app.js

  43. Vue.component('my-list', {  template: '#my-list',  props: [ 'title', 'items' ]});
  44. 登录后复制

  45. index.html

  46.   
    {{ title }}
  47. 登录后复制                              

  48. 注意:如果您以前没有见过v-bind在没有参数的情况下使用,这将把整个对象的属性绑定到元素。这对于作用域插槽非常有用,因为您绑定的对象通常具有任意属性,现在不需要通过名称指定这些属性。

  49. 现在我们将返回到根实例,并在my-listslot中声明一个模板。首先查看形状列表,模板必须包含我们为其分配别名形状的scope属性。这个别名允许我们访问限定范围的道具。在模板内部,我们可以使用与以前完全相同的标记来显示形状列表项。

  50.       
    {{ shape.name }} ({{ shape.sides }} sides)
      
  51. 登录后复制

  52. 下面是完整的模板:

  53.             
    {{ shape.name }} ({{ shape.sides }} sides)
                      
            
            {{ color.name }}      
             
  54. 登录后复制

  55. 结论

  56. 尽管这种方法和以前一样有很多标记,但它将公共功能委托给了组件,从而实现了更健壮的设计。

  57. 以下是完整代码的代码页:

  58. https://codepen.io/anthonygore/pen/zExPZX

  59. 相关推荐:

  60. 2020年前端vue面试题大汇总(附答案)

  61. vue教程推荐:2020最新的5vue.js视频教程精选

  62. 更多编程相关知识,请访问:编程入门!!

  63. 以上就是详解Vue.js中的作用域插槽的详细内容,更多请关注【创想鸟】其它相关文章!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

点点赞赏,手留余香

给TA打赏
共0人
还没有人赞赏,快来当第一个赞赏的人吧!
    编程技术

    Vue.js中使用无状态组件的方法介绍

    2025-3-13 6:05:13

    编程技术

    分享Vue项目中会用到的一些实战技巧点

    2025-3-13 6:05:24

    0 条回复 A文章作者 M管理员
    欢迎您,新朋友,感谢参与互动!
      暂无讨论,说说你的看法吧
    个人中心
    购物车
    优惠劵
    今日签到
    私信列表
    搜索