一、前言
仿 element-ui 手写 menu、message、render
安装 npm i element-ui -S
入口文件 main.js
1 | import Vue from 'vue'; |
二、Menu 组件
前言
先看下 仿的 element-ui中 menu 组件的效果
App.vue
1 | <template> |
如下图:
实操
1.1 仿原生组件的代码
App.vue
1 | <template> |
新建 /components/jf-menu.vue
1 | <template> |
新建 /components/jf-submenu.vue
1 | <template> |
新建 /components/jf-menu-item.vue
1 | <template> |
效果如下:
1.2 优化(用户调取只需关注数据结构)
如上 App.vue 中 line3-17所示,太过繁琐,希望用户只传递数据就能自动生成上述数据结构
App.vue
1 | <template> |
新建 menu.vue
1 | <template> |
- 全局引入组件 其他组件不必再局部引入
完整代码如下:
main.js
1 | import Vue from 'vue'; |
App.vue
1 | <template> |
menu.vue
1 | <template> |
新建 Resub.vue
1 | <template> |
/components/ 下的3个子组件代码不变 如上
最终效果如下:
总结:模板循环,递归组件
三、message组件
前言
先看下 仿的 element-ui中 message 组件的效果
App.vue
1 | <template> |
实操
2.1 引入自己的库
思路: 在点击的时候 创建一个组件 把这个组件放到页面body下 新建Message.vue
1 | <template> |
新建 Message.js
1 | import MessageComponent from './Message.vue'; |
新建 Message.vue
1 | <template> |
2.2 数据驱动视图
每次用户点击按钮时 都是增加数据 自动渲染到视图上
Message.js
1 | import MessageComponent from './Message.vue'; |
Message.vue
1 | <template> |
现在情况是 一点击 创建一个实例(vm),给实例添加options属性,没有累加的效果,每次点击都产生新的
需要将new Vue操作只做一次 ,不能重复new
用单例模式
2.3 单例模式
Message.js
1 | let instance; |
如图可以看到每次都只在body中添加一个div,在这个div里面产生多个message组件,而不是一直在body中新增由div包裹的组件一直append
2.4 设置定时 时间到销毁
增加序号,时间到了,需要根据序号删除
Message.vue
1 | <template> |
2.5 全局引入的方式
上面是单独引入Message的方式调取 这里参考element-ui 中
原文: 全局方法 Element 为 Vue.prototype 添加了全局方法 $message。因此在 vue instance 中可以采用本页面中的方式调用 Message。
即可以通过 this.$message 调取 如下:
Message.js
1 | let instance; |
App.vue
1 | <template> |
执行 还是跟之前的使用效果一样的 和 图 设置定时时间到销毁 一样