案例-商品列表#
效果:
需求说明#
my-tag
标签组件封装- 双击显示输入框,输入框获取焦点
- 失去焦点,隐藏输入框
- 回显标签信息
- 内容修改,回车修改标签信息
my-table
表格组件封装- 动态传递表格数据渲染
- 表头支持用户自定义
- 主体支持用户自定义
实现#
my-tag
组件封装#
- 双击显示输入框,输入框获取焦点
标题及输入框用v-if
和v-else
通过编辑状态的修改,来控制二者的显示隐藏
标题盒子绑定双击事件@dblclick
,修改编辑状态为true
输入框获得焦点:$nextTick
+$refs
获取到 dom,进行focus
获取焦点- 通过全局注册自定义指令
v-focus
的方式实现
1 | import Vue from 'vue'; |
- 失去焦点,隐藏输入框
输入框失焦绑定blur
事件修改编辑状态为false
即可 - 回显标签信息
回显的标签信息是父组件传递过来的v-model
实现功能(简化代码)v-model
=>:value
+@input
组件内部通过props
接收,:value
设置给输入框 - 内容修改,回车修改标签信息
@keyup.enter
触发事件$emit('input',e.target.value)
my-table
组件封装#
- 动态传递表格数据渲染
表格数据不能写死,数据来自外部
外部使用表格组件时,用v-bind
绑定要传递的数据,组件内以props
接收使用 - 表头支持用户自定义
- 主体支持用户自定义
为了支持表头及主体的自定义,使用具名插槽,将表格结构移至组件外部
主体要用到的数据使用作用域插槽,以添加属性的方式传值
完整代码:
App.vue:
1 | <template> |
main.js:
1 | import Vue from 'vue'; |
标签组件 MyTag.vue:
1 | <template lang=""> |
表格组件 MyTable.vue:
1 | <template lang=""> |