有3步

  • 第一步:创建渲染slot的组件 重要
  • 第二步:为slot添加父组件数据(props) 重要
  • 第三步:使用

第一步:创建渲染slot的组件

首选创建一个单文件组价,由于我们是使用的slot(父组件传进来的),所以,我们只需要创建js文件即可,而不用创建.vue文件

// slot.js
export default {
name: 'Slot', // slot的名字,调试使用
functional: true, // 使组件无状态 (没有 data ) 和无实例 (没有 this 上下文)。他们用一个简单的 render 函数返回虚拟节点使他们更容易渲染。
inject: ['Root'], // 父组件的映射
props: { // 此组件接受的props
data: Object,
options: Object
},
render: (h, ctx) => { // dom渲染函数
return h('div', ctx.injections.Root.$scopedSlots['icon']({ // 得到名为icon的作用域插槽
data: ctx.props.data, // 给slot的组件传递props
options: ctx.props.options
}));
}
};

第二步:为slot添加父组件数据(props)

// 导入子组件
import IconSlot from 'slot.js'; // 切换到父组件
export default {
name: 'IconTable',
components: {IconSlot},
provide () { // 该对象包含可注入其子孙的属性 在这里把父组件自身传递给子组件
return {
Root: this
};
},
data() {
return {
list: [],
options: {}
};
}
}

在模板中使用

<template>
<div v-for="(item, index) in list" :key="index">
<icon-slot :data="item" :options="options"></icon-slot>
</div>
</template>

第三步:使用

<icon-table>
<template slot="icon" slot-scope="{ list, options }">
<div v-if="list.length > 1"><Icon type="add"></Icon></div>
<div v-else><Icon type="del"></Icon></div>
</template>
</icon-table>

大功告成 总结

如果在父组件直接取this.$slotthis.$scopedSlots的话,

其实只能用一次

如果在模板中使用 slot 标签来接收的话,其实也只能只用一次

所以核心思路是;每次使用都必须重新创建VNode节点,那只能每次都使用createElement生成node,

那只有一个办法使用render渲染了,然后第一个参数创建dom后,dom附带的数据,都可以是一个对象,只要保证节点是唯一的即可,数据其实无所谓,怎么传都可以

vue slot 复用的更多相关文章

  1. Vue可复用过渡和动态过渡

    前面的话 本文将详细介绍Vue可复用过渡和动态过渡 可复用过渡 过渡可以通过 Vue 的组件系统实现复用.要创建一个可复用过渡组件,需要做的就是将 <transition> 或者 < ...

  2. Vue slot 插槽用法:自定义列表组件

    Vue 框架的插槽(slot)功能相对于常用的 v-for, v-if 等指令使用频率少得多,但在实现可复用的自定义组件时十分有用.例如,如果经常使用前端组件库的话,就会经常看到类似的用法: < ...

  3. LocalVariableTable之 Slot 复用

    LocalVariableTable中的 Slot, 是存在复用现象的,这个我早就知道,但是,不太清楚是如何复用的. Java语言规范与JVM规范都没有对Java语言具体要如何使用JVM的局部变量sl ...

  4. jvm slot复用

    如果当前字节码PC计数器的值已经超出了某个变量的作用域,那这个变量对应的Slot就可以交给其他变量使用. 字节码PC计数器就是程序计数器,程序计数器记录当前线程所执行的字节码的偏移地址.如果这个值超出 ...

  5. vue自学入门-4(vue slot)

    vue自学入门-1(Windows下搭建vue环境) vue自学入门-2(vue创建项目) vue自学入门-3(vue第一个例子) vue自学入门-4(vue slot) vue自学入门-5(vuex ...

  6. vue slot nested bug

    vue slot nested bug slot name bug Error <slot name="global-system-guide-slot"></s ...

  7. vue 组件复用 - component

    vue 组件复用 - component vue 组件复用 就是对 component 标签的使用 先看图 下图看使用 结果: 可以看到 在箱包 这一项,我将banner 组件用了两次,我 每次 点击 ...

  8. Vue 组件复用性和slot

    1.组件可复用 2.slot元素作为组件模板之中的内容分发插槽,元素自身可以被替换 <!DOCTYPE html> <html lang="en"> < ...

  9. Vue slot插槽

    插槽用于内容分发,存在于子组件之中. 插槽作用域 父级组件作用域为父级,子级组件作用域为子级,在哪定义的作用域就在哪. 子组件之间的内容是在父级作用域的,无法直接访问子组件里面的数据. 插槽元素 &l ...

随机推荐

  1. 数据库事务的四大特性以及事务的隔离级别(mysql)

      本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指 ...

  2. 对struts2一些理解

    1.strust2框架是什么?为解决什么问题出现? Struts2是在WebWork+xwork基础发展而来的. 2. strust2的优缺点优点: 支持Ajax 支持Ognl标签 提供了强大的拦截器 ...

  3. 种类并查集(洛谷P2024食物链)

    题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种,但是我 ...

  4. LeetCode 24. Swap Nodes in Pairs 成对交换节点 C++/Java

    Given a linked list, swap every two adjacent nodes and return its head. You may not modify the value ...

  5. Spring MVC配置实例

    1.下载Jar文件,添加到项目 lib文件夹中. 使用eclipse新建 Web 项目.下载导入相关的 jar 和 Tomcat.我的java版本是JDK1.8 对应的 Tomcat 版本是 8.0. ...

  6. django后台admin csv 格式表格导出

    1.在app下新建一个.py文件  此例commen.py commen.py (内容)(具体怎么导出的也不知道这么写就对了) import csv from django.http import H ...

  7. 关于python的一些想法

    我来自信息管理与信息系统专业,大一学过c语言但不太精通.学习python是为了学会这门新语言,据了解python会慢慢成为主流编程语言. 因为对绘图方面很感兴趣,希望老师能够在课上多讲一些这方面的东西 ...

  8. xcode9.4 报错 error:The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.

    原因 http | https 协议  不能正常使用 找到的解决方案 但是在字段名上有了变化,不过复制进去 还是会自动选择对应的 解决办法 1. 在Info.plist中添加 App Transpor ...

  9. servlet的运行机制,转发和重定向

    一.当发送一个请求到服务器端的时候,容器(tomcat)会判断该路径属于哪一个servlet进行处理,servlet有一个抽象父类“httpservlet”,这个类是一个模板设计模式的类,其中serv ...

  10. 小程序官网CMS开源项目出炉,Weixin-App-CMS 1.0 版本正式发布

    Weixin-App-CMS 是捷微团队开发的微信小程序CMS开源项目,涵盖了微网站的基本功能,能够快速发布简单易用的小程序网站.采用工具“微信web开发”上传小程序,即可快速体验发布体验小程序网站. ...