我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Vue.js的作用域插槽的介绍以及使用场景

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Vue.js的作用域插槽的介绍以及使用场景

这篇文章主要介绍“Vue.js的作用域插槽的介绍以及使用场景”,在日常操作中,相信很多人在Vue.js的作用域插槽的介绍以及使用场景问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue.js的作用域插槽的介绍以及使用场景”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

作用域插槽是 Vue.js 中一个很有用的特性,可以显著提高组件的通用性和可复用性。问题在于,它实在不太好理解。尝试搞清楚父子作用域之间错综复杂的关系,其痛苦程度不亚于求解一个棘手的数学方程。

当你无法理解一个东西的时候,最好的办法就是在解决问题的过程中体会它的应用。本文将向你展示如何使用作用域插槽构建一个可复用的列表组件。

Vue.js的作用域插槽的介绍以及使用场景

注意: 完整代码可以去 Codepen    查看

最基础的组件

我们即将构建的组件叫做 my-list ,用来展示一系列的项目。它的特别之处就在于,你可以在每次使用组件的时候自定义列表项目的渲染方式。

我们先从最简单的单个列表开始:一个包含几何图形名字和边数的数组。

app.js

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

<div id="app">    <my-list></my-list>  </div>  <script type="text/x-template" id="my-list">    <div class="my-list">      <div class="title">{{ title }}</div>      <div class="list">        <div class="list-item" v-for="shape in shapes">          <div>{{ shape.name }} <small>({{ shape.sides }} sides)</small></div>        </div>      </div>    </div>  </script>

在加上一点样式,大概就会是下图这个样子:

Vue.js的作用域插槽的介绍以及使用场景

更通用的 my-list

现在我们想要让 my-list 更加通用,可以渲染任何类型的列表。这次我们展示的是一堆颜色的名字以及对应的颜色方块。

为此,我们需要将上例列表独有的数据进行抽象化。由于列表中的项目可能有不同的结构,我们将会给 my-list 一个插槽,让父组件来定义列表的展示方式。

app.js

Vue.component('my-list', {    template: '#my-list',    props: [ 'title' ]  });

index.html

<script type="text/x-template" id="my-list">    <div class="my-list">      <div class="title">{{ title }}</div>      <div class="list">        <slot></slot>      </div>    </div>  </script>

现在,我们在根实例中创建 my-list 组件的两个实例,分别展示两个测试用例列表:lists:

app.js

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' }      ]    }  });
<div id="app">    <my-list :title="Shapes">      <div class="list-item" v-for="item in shapes">        <div>{{ shape.name }} <small>({{ shape.sides }} sides)</small></div>      </div>    </my-list>    <my-list :title="Colors">      <div class="list-item" v-for="color in colors">        <div>          <div class="swatch" :style="{ background: color.hex }"></div>          {{ color.name }}        </div>      </div>    </my-list>  </div>

效果如下图:

Vue.js的作用域插槽的介绍以及使用场景

大材小用的组件

我们刚才创建的组件确实符合要求,但那段代码算不上很好。my-list 本来应该是一个展示列表的组件,但我们却把渲染列表需要的逻辑部分抽象到了父组件中,这样一来,子组件在这里只不过是用来包裹列表而已,未免显得大材小用了。

更糟糕的是,在两个组件的声明中存在着大量重复代码(例如,<div class="list-item" v-for="item in ...">)。如果我们能够在子组件中编写这些代码,那么子组件就不再是“打酱油的角色”了。

作用域插槽

普通插槽无法满足我们的需求,这时候,作用域插槽就派上用场了。作用域插槽允许你传递一个模板而不是已经渲染好的元素给插槽。之所以叫做”作用域“插槽,是因为模板虽然是在父级作用域中渲染的,却能拿到子组件的数据。

例如,带有作用域插槽的组件 child 大概是下面这个样子:

<div>    <slot my-prop="Hello from child"></slot>  </div>

使用这个组件的父组件将会在插槽中声明一个 template 元素。这个模板元素会有一个 scope (译者注:Vue 2.6 后改为 v-slot 属性)属性指向一个对象,任何添加到插槽(位于子组件模板)中的属性都会作为这个对象的属性。

<child>    <template scope="props">      <span>Hello from parent</span>      <span>{{ props.my-prop }}</span>    </template>  </child>

将会渲染成:

<div>    <span>Hello from parent</span>    <span>Hello from child</span>  </div>

在 my-list 中使用作用域插槽

我们将两个列表数组通过 props 传递给 my-list。之后将普通插槽替换为作用域插槽,这样,my-list 就能够负责迭代列表项目,同时父组件依然能够定义每个项目具体的展示方式。

index.html

<div id="app">    <my-list title="Shapes" :items="shapes">      <!--在这里书写 template-->    </my-list>    <my-list title="Colors" :items="colors">      <!--在这里书写 template-->    </my-list>     </div>

接着我们让 my-list 迭代项目。在 v-for 循环中,item 是当前迭代项目的别名。我们可以创建一个插槽并通过 v-bind="item" 将那个项目绑定到插槽中。

app.js

Vue.component('my-list', {    template: '#my-list',    props: [ 'title', 'items' ]  });

index.html

<script type="text/x-template" id="my-list">    <div class="my-list">      <div class="title">{{ title }}</div>      <div class="list">        <div v-for="item in items">          <slot v-bind="item"></slot>        </div>      </div>    </div>  </script>

注意:也许你之前没见过不带参数的 v-bind 用法。这种用法将会把整个对象的所以属性都绑定到当前元素上。在涉及作用域插槽时,这种用法很常见,因为绑定的对象可能有很多属性,而一一将它们列举出来并手动绑定显然太麻烦了。

现在,回到根实例这里来,在 my-list 的插槽中声明一个模板。首先看一下几何图形列表(第一个例子中的列表),我们声明的模板必须带有一个 scope 属性,这里将其赋值为 shape。shape 这个别名可以让我们访问作用域插槽。在模板中,我们可以继续沿用最初例子中的标记来展示项目。

<my-list title="Shapes" :items="shapes">    <template scope="shape">      <div>{{ shape.name }} <small>({{ shape.sides }} sides)</small></div>    </template>  </my-list>

整个模板大概是下面这样:

<div id="app">    <my-list title="Shapes" :items="shapes">      <template scope="shape">        <div>{{ shape.name }} <small>({{ shape.sides }} sides)</small></div>      </template>    </my-list>    <my-list title="Colors" :items="colors">      <template scope="color">        <div>          <div class="swatch" :style="{ background: color.hex }"></div>          {{ color.name }}        </div>      </template>    </my-list>     </div>

结论

虽然用上作用域插槽之后,代码量并未减少,但是我们将通用的功能都交由子组件负责,这显著提高了代码的健壮性。

到此,关于“Vue.js的作用域插槽的介绍以及使用场景”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Vue.js的作用域插槽的介绍以及使用场景

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Node.js中npx命令的用法及使用场景介绍

这篇文章主要介绍“Node.js中npx命令的用法及使用场景介绍”,在日常操作中,相信很多人在Node.js中npx命令的用法及使用场景介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Node.js中npx
2023-06-20

使用vue的作用域插槽的原因是什么?

这篇文章主要介绍了使用vue的作用域插槽的原因是什么,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。Vue插槽是一种将内容从父组件注入子组件的绝佳方法。下面是一个基本的示例,如果我们不提供父级的任何slot位的内容,刚父级
2023-06-14

线程局部变量的实现ThreadLocal使用及场景介绍

这篇文章主要为大家介绍了线程局部变量的实现ThreadLocal使用及场景详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-01-16

mysql中蠕虫复制的使用场景介绍

本篇内容介绍了“mysql中蠕虫复制的使用场景介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!说明1、将一个表的数据迁移到另一个表,或者将
2023-06-20

vue3自定义插件的作用场景及使用示例详解

这篇文章主要为大家介绍了vue3自定义插件的作用场景及使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-02-23

MySQL中的数据类型及其应用场景介绍

MySQL是一种常见的关系型数据库管理系统,广泛应用于各种系统和应用程序中。在MySQL中,数据以不同的数据类型存储在表中。本文将介绍MySQL中常见的数据类型及其应用场景,并附有代码示例。一、整数类型整数类型(INT):用于存储正负整数值
2023-10-22

Vue插槽Slot的作用是什么及怎么使用

本篇内容介绍了“Vue插槽Slot的作用是什么及怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!插槽Slot插槽Slot的作用初识插槽
2023-07-04

css 多种背景的使用场景和技巧、优点介绍

本篇内容主要讲解“css 多种背景的使用场景和技巧、优点介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“css 多种背景的使用场景和技巧、优点介绍”吧!【 】CSS background是最常
2023-06-07

vue3自定义插件的作用场景及使用方法是什么

本篇内容主要讲解“vue3自定义插件的作用场景及使用方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue3自定义插件的作用场景及使用方法是什么”吧!插件的作用场景在vue2的插件那篇文
2023-07-05

Redis数据库的使用场景介绍(避免误用Redis)

Redis 是目前 NoSQL 领域的当红炸子鸡,它象一把瑞士军刀,小巧、锋利、实用,特别适合解决一些使用传统关系数据库难以解决的问题。但是 Redis 不是银弹,有很多适合它解决的问题,但是也有很多并不适合它解决的问题。另外,Redis
2022-06-04

Redis中5种数据结构的使用场景介绍

一、redis 数据结构使用场景 原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的源码。目前目标是吃透 redis 的数据结构。我们都知道,在 redis 中一共有5种数据结构,那每
2022-06-04

编程热搜

目录