特殊需求ELDatePicker不要input框怎么处理
Demo预览:
https://sunzsh.github.io/vue-demos/#/label-datepicker-demo
代码:
https://github.com/sunzsh/vue-el-demo/blob/master/src/components/label-datepicker.vue
https://github.com/sunzsh/vue-el-demo/blob/master/src/views/label-datepicker-demo.vue
大家没有碰到过这种需求啊
就是我希望这个el-date-picker
这块展示的不是一个input框
是一个span或者div
所以呢
我前两天就对它进行了一次封装
原来呢是这样用的
封装之后呢直接可以这样
我给它起名叫LabelDatePicker
然后呢
中间写我们想使用的什么元素都可以
然后呢我们看一下效果哈
打开
这样就可以了
那老规矩啊
这个代码呢就是这个文件
大家把这个文件放到项目里就能用了
我还是放在github这个demo里边
那接下来
我简单说一下
我在
实现的过程中碰到一些好玩的问题
开始呢我觉得封装这个挺简单的(按理说)
我直接把这个input框隐藏掉
然后写一个span标签
点span标签
想办法弹出那个Popper层就可以了
后来我发现不是那样的
就是如果我把这个input框(大家看)
如果把这个input框隐藏掉的时候
然后点这个span标签是能弹出来
但是呢
这个popper的弹出层位置就不准了
因为他是基于这个input框计算的
input框你给他隐藏掉呢
它的位置就跑到(浏览器)左上角了
所以呢我们来看一下怎么解决
我们来看一下el-date-picker的源码
它用到了一个mixins源码(混入)
他混入了这个new Popper
new Popper是在这定义的
然后这里边他把Popper的一些methods
都拿进来了
所以呢我们来看popper
popper是在这
然后呢我们点
进去然后呢我们来看一下
他newPopper的时候大家看
他传了三个参数
那至于这三个参数是什么意思
我们可以这样啊
用这copilot的q(问答模式)
然后呢我们问一下PopperJS的官网
大家看
然后呢我们就可以直接点进来
我们来看Popper
new Popper
大家看第一个参数他说这个reference
element是用来定位这个popper的
所以呢它第一个参数很重要
决定了弹出层的位置
那我们看第一个参数怎么来的呢
在这
他呀先去找这个referenceElm
如果没有呢他去找reference
因为这个vue-popper是一个公用组件
所以它支持很多模式
在这里呢
我们这个el-date-picker用的是这个reference
我们可以看一下啊把它复制(去搜索)
这里边它有个reference计算属性
它直接返回当前的
r e f(引用)
这个reference呢它在上面有定义
大家看:也就是说这个元素
所以呢对我们来说
我们破解的方法就是
可以继承自他这个date pick
之后重写他这个reference方法
所以呢我在这里
先是声明了一个新的datePicker
然后呢继承原来的el-date-picker
然后注意
我先声明了一个data属性叫referenceDom
未来呢我就把它作为一个新的参考物
去打开那个Popper
然后呢在computed里边重写这reference
方法去返回这个新的参考物
这样就可以了
然后注意
我没有把这个新写的Datepicker导出
而是呢在它基础上又封装了一层组件
也就是说
这个新写这个datepicker
只有在这个vue页面里能用到(使用)
然后呢
我在这个vue页面里又做了一层封装
首先呢我把我刚才新写的组件放过来
然后在它下边
紧接着写了一个span标签
写一些时间
然后呢写个插槽
注意这个插槽在下边
我就会在mounted的里边
去取到这个插槽的DOM节点
放给刚才的这个referenceDom这个变量
这样的话呢
那popperJS就会基于这个去弹出层了
剩下其他的就好说了
大家可以看一下源码就可以了
最后更新于
这有帮助吗?