当前位置: 首页 > news >正文

vue2插槽

本节目标

  • 默认插槽
  • 后备内容
  • 具名插槽
  • 作用域插槽
  • 案例-商品列表

默认插槽

让组件内部的一些结构 支持自定义

步骤

  1. 组件内需要定制的结构, 使用<slot></slot>占位

  1. 使用组件时, 传入结构替换slot的位置

后备内容

封装组件时, 可以为预留的<slot>插槽提供默认内容

步骤

  1. 在<slot>标签内, 放置内容, 作为默认显示内容

  1. 使用组件时, 如果不传东西, 显示slot后备内容

  1. 使用组件时, 传递内容, 则slot整体会被替换掉

具名插槽

一个组件内有多处结构, 需要外部传入标签, 进行定制, 需要使用具名插槽

步骤

  1. 组件内的slot标签, 使用 name属性 给插槽命名

  1. 使用组件时, 使用 template 配合 v-slot:插槽名 来分发标签

  1. v-slot:插槽名 可以简写成 #插槽名

作用域插槽

定义slot插槽的同时, 是可以传值的, 给插槽上绑定数据, 使用组件时可以接收数据

组件分类

  1. 默认插槽(组件内定义一处结构)
  2. 具名插槽(组件内定义多处结构)
  3. 作用域插槽不是一类组件, 是插槽的传参语法

封装表格组件

  1. 父传子, 动态渲染表格内容
  2. 利用默认插槽, 定制操作列
  3. 删除或查看操作, 都需要用到当前项的id, 属于组件内部的数据, 可以通过作用域插槽绑定数据, 供外部使用

步骤

  1. 给slot标签, 以添加属性的方式传值

  1. 所有添加的属性, 都会被收集到一个对象中

  1. 在template中, 通过 #插槽名="obj" 接收数据, 默认插槽, 通过 #default="obj" 接收数据

案例-商品列表

1>分析需求

my-ta组件

  1. 双击显示输入框, 输入框自动获取焦点
  2. 失去焦点, 隐藏输入框
  3. 回显标签信息
  4. 内容修改, 回车, 修改标签信息

my-table组件

  1. 动态传递表格数据渲染
  2. 表头支持自定义
  3. 主体支持自定义

2>创建tag组件

<template><div class="my-tag"><!-- <input class="input"type="text"placeholder="输入标签"/> --><div class="text">茶具</div></div>
</template><script>
export default {
};
</script><style lang="less" scoped>
.my-tag {cursor: pointer;.input {appearance: none;outline: none;border: 1px solid #ccc;width: 100px;height: 40px;box-sizing: border-box;padding: 10px;color: #666;&::placeholder {color: #666;}}
}
</style>

3>控制显示隐藏

<template><div class="my-tag"><inputv-if="isEdit"v-focusclass="input"type="text"placeholder="输入标签"@blur="isEdit = false"/><div v-else class="text" @dblclick="handerEdit">茶具</div></div>
</template><script>
export default {data() {return {isEdit: false,};},methods: {handerEdit() {this.isEdit = true;},},
};
</script>
... ...// 全局注册自动获取焦点指令
Vue.directive('focus', {inserted: function (el) {el.focus()}
})
... ...

4>回显/修改数据

<template><div class="my-tag"><input... ...:value="value"@keyup.enter="inputEnter"/>... ...</div>
</template><script>
export default {// 通过v-model完成父子组件通信props: {value: String,},methods: {... ...// 监听键盘回车事件inputEnter(e) {// 非空处理if (e.target.value.trim() === "") return alert("输入不能为空");// 触发自定义事件, 更新父组件数据// 通过事件对象拿到输入的新值this.$emit("input", e.target.value);// 编辑完成后, 隐藏输入框this.isEdit = false;},},
};
</script>
<template><div class="table-case"><table class="my-table">... ...<tbody><tr><td>1</td><td>梨皮朱泥三绝清代小品壶经典款紫砂壶</td><td><img src="https://yanxuan-item.nosdn.127.net/f8c37ffa41ab1eb84bff499e1f6acfc7.jpg" /></td><td><my-tag v-model="text"></my-tag></td></tr></tbody></table></div>
</template><script>
export default {name: 'TableCase',data() {return {// 临时绑定数据,检测v-modeltext: '默认数据';}},
}
</script>

5>创建my-table组件

<template><table class="my-table"><thead><tr><th>编号</th><th>名称</th><th>图片</th><th width="100px">标签</th></tr></thead><tbody><tr v-for="item in data" :key="item.id"><td>{{ item.id }}</td><td>{{ item.name }}</td><td><img :src="item.picture" /></td><td>MyTage组件<!-- <MyTage v-model="item.tag"></MyTage> --></td></tr></tbody></table>
</template><script>
export default {props: {data: {type: Array,require: true,},},
};
</script><style lang="less" scoped>
.my-table {width: 100%;border-spacing: 0;img {width: 100px;height: 100px;object-fit: contain;vertical-align: middle;}th {background: #f5f5f5;border-bottom: 2px solid #069;}td {border-bottom: 1px dashed #ccc;}td,th {text-align: center;padding: 10px;transition: all 0.5s;&.red {color: red;}}.none {height: 100px;line-height: 100px;color: #999;}
}
</style>
<template><div class="table-case"><MyTable :data="goods"></MyTable></div>
</template><script>
export default {name: "TableCase",data() {return {goods: [{id: 101,picture:"https://yanxuan-item.nosdn.127.net/f8c37ffa41ab1eb84bff499e1f6acfc7.jpg",name: "梨皮朱泥三绝清代小品壶经典款紫砂壶",tag: "茶具",},{id: 102,picture:"https://yanxuan-item.nosdn.127.net/221317c85274a188174352474b859d7b.jpg",name: "全防水HABU旋钮牛皮户外徒步鞋山宁泰抗菌",tag: "男鞋",},{id: 103,picture:"https://yanxuan-item.nosdn.127.net/cd4b840751ef4f7505c85004f0bebcb5.png",name: "毛茸茸小熊出没,儿童羊羔绒背心73-90cm",tag: "儿童服饰",},{id: 104,picture:"https://yanxuan-item.nosdn.127.net/56eb25a38d7a630e76a608a9360eec6b.jpg",name: "基础百搭,儿童套头针织毛衣1-9岁",tag: "儿童服饰",},],};},
};
</script><style lang="less" scoped>
.table-case {width: 1000px;margin: 50px auto;img {width: 100px;height: 100px;object-fit: contain;vertical-align: middle;}
}
</style>

6>结构自定义

<template><table class="my-table"><thead><tr><slot name="header"></slot></tr></thead><tbody><tr v-for="item in data" :key="item.id"><slot name="body" :item="item"></slot></tr></tbody></table>
</template><script>
export default {props: {data: {type: Array,require: true,},},
};
</script>
<template><div class="table-case"><MyTable :data="goods"><template #header><th>编号</th><th>名称</th><th>图片</th><th width="100px">标签</th></template><template #body="{ item }"><td>{{ item.id }}</td><td>{{ item.name }}</td><td><img :src="item.picture" /></td><td><!-- MyTage组件 --><MyTage v-model="item.tag"></MyTage></td></template></MyTable></div>
</template><script>
export default {name: "TableCase",data() {return {goods: [{id: 101,picture:"https://yanxuan-item.nosdn.127.net/f8c37ffa41ab1eb84bff499e1f6acfc7.jpg",name: "梨皮朱泥三绝清代小品壶经典款紫砂壶",tag: "茶具",},{id: 102,picture:"https://yanxuan-item.nosdn.127.net/221317c85274a188174352474b859d7b.jpg",name: "全防水HABU旋钮牛皮户外徒步鞋山宁泰抗菌",tag: "男鞋",},{id: 103,picture:"https://yanxuan-item.nosdn.127.net/cd4b840751ef4f7505c85004f0bebcb5.png",name: "毛茸茸小熊出没,儿童羊羔绒背心73-90cm",tag: "儿童服饰",},{id: 104,picture:"https://yanxuan-item.nosdn.127.net/56eb25a38d7a630e76a608a9360eec6b.jpg",name: "基础百搭,儿童套头针织毛衣1-9岁",tag: "儿童服饰",},],};},
};
</script>

相关文章:

  • PayPal,stripe,square轮询系统你不知道的秘密
  • 三次样条曲线和三次多项式曲线
  • 用质量属性场景来描述可用性(2024年上半年软考系统架构师案例分析题)
  • CSS中,设置 0.5px 会生效吗
  • Flask基础2-Jinja2模板
  • git版本控制工具常用命令
  • 推荐一款WPF绘图插件OxyPlot
  • C语言 RTC时间(年月日时分秒) 和 时间戳 互相转换
  • Java的一些补充性介绍
  • java:测试hystrix的一些关键参数
  • linux常用的基础命令
  • i.MX8MP平台开发分享(RDC软件配置篇)
  • Ubuntu项目部署
  • java aio nio区别
  • 【教程】从0开始搭建大语言模型:实现Attention机制
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 【React系列】如何构建React应用程序
  • C++11: atomic 头文件
  • CSS相对定位
  • ECS应用管理最佳实践
  • iOS | NSProxy
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 无服务器化是企业 IT 架构的未来吗?
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • postgresql行列转换函数
  • ​14:00面试,14:06就出来了,问的问题有点变态。。。
  • ​queue --- 一个同步的队列类​
  • #define、const、typedef的差别
  • #微信小程序(布局、渲染层基础知识)
  • ( 10 )MySQL中的外键
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (SERIES10)DM逻辑备份还原
  • (二)延时任务篇——通过redis的key监听,实现延迟任务实战
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)ABI是什么
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .net 7 上传文件踩坑
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .Net Remoting(分离服务程序实现) - Part.3
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .NetCore项目nginx发布
  • @RestController注解的使用
  • @基于大模型的旅游路线推荐方案
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory
  • [240621] Anthropic 发布了 Claude 3.5 Sonnet AI 助手 | Socket.IO 拒绝服务漏洞