• 全局定制elementui的确认框confirm


    确认框是elementui最常用的组件之一,如何定制它呢?

    下面这个例子是客户提出要用左右箭头键来控制按钮的焦点,使用键盘操控达到的提高办公效率的目的。

    要实现这个目标有2种方法

    1.修改elementui的源代码

    2.对elementui的代码进行包装,添加键盘控制的功能

    第一种方法需要读懂源代码花时间,而且不支持源代码升级,所以采取第二种办法。

    如果你完整引入了 Element,它会为 Vue.prototype 添加如下全局方法:$msgbox, $alert, $confirm 和 $prompt。

    通常这样使用:this.$confirm(message, title, options)

    所以只要替换全局方法$confirm就达到包装的目的

    包装$confirm组件

    1. import Vue from 'vue'
    2. var cancelButtonClass
    3. var confirmButtonClass
    4. var beforeCloseOrigin
    5. function select(index) {
    6. var buttons = document.querySelectorAll('.el-message-box__wrapper .el-message-box__btns button')
    7. if (buttons.length !== 2) return
    8. if (cancelButtonClass == null) {
    9. cancelButtonClass = buttons[0].getAttribute('class')
    10. confirmButtonClass = buttons[1].getAttribute('class')
    11. }
    12. buttons[0].setAttribute('class', index === 0 ? confirmButtonClass : cancelButtonClass)
    13. buttons[1].setAttribute('class', index === 1 ? confirmButtonClass : cancelButtonClass)
    14. buttons[index].focus()
    15. }
    16. function keyDownHandler(e) {
    17. if (e.shiftKey && e.code === 'Tab' || e.code === 'ArrowLeft') {
    18. select(0)
    19. e.preventDefault()
    20. } else if (!e.shiftKey && e.code === 'Tab' || e.code === 'ArrowRight') {
    21. select(1)
    22. e.preventDefault()
    23. }
    24. }
    25. function beforeClose(action, instance, done) {
    26. document.removeEventListener('keydown', keyDownHandler, false)
    27. select(1)
    28. if (beforeCloseOrigin) {
    29. beforeCloseOrigin(action, instance, done)
    30. } else {
    31. done()
    32. }
    33. }
    34. function confirm(message, title, options) {
    35. cancelButtonClass = null
    36. confirmButtonClass = null
    37. var newTitle
    38. var newOptions
    39. if (typeof title !== 'string') {
    40. newTitle = ''
    41. newOptions = { ...title }
    42. } else {
    43. newTitle = title
    44. newOptions = { ...options }
    45. }
    46. beforeCloseOrigin = newOptions.beforeClose
    47. newOptions.beforeClose = beforeClose
    48. document.addEventListener('keydown', keyDownHandler, false)
    49. return Vue.prototype.$confirmOrigin.call(this, message, newTitle, newOptions)
    50. }
    51. export default function replaceConfirm() {
    52. Vue.prototype.$confirmOrigin = Vue.prototype.$confirm
    53. Vue.prototype.$confirm = confirm
    54. }

    新组件的核心思想是通过document.querySelectorAll来找到dom,然后操作dom来达到定制的目的。确认框是动态生成的,有模式的,所以用document.querySelectorAll能找到唯一的dom。监听键盘事件就可以达到键盘操控的目的,关闭的时候需要注销监听。

    main.js

    1. import Vue from 'vue'
    2. import Element from 'element-ui'
    3. ...
    4. // 引入confirm新组件
    5. import replaceConfirm from '@/components/confirm'
    6. ...
    7. // 替换confirm组件
    8. replaceConfirm()
    9. new Vue({
    10. el: '#app',
    11. router,
    12. store,
    13. render: h => h(App)
    14. })

    在main.js中导入新组件,本来可以直接import  '@/components/confirm',但是this.$confirm是异步完成的,直接调用发现this.$confirm还没有初始化,所以改成2步替换,目的就是等待this.$confirm完成初始化。

  • 相关阅读:
    1448. 统计二叉树中好节点的数目-深度优先遍历+最大值传递
    信创办公–基于WPS的Word最佳实践系列 (图文环绕方式)
    【无标题】
    JUCE框架教程(3)—— Component Class&Graphics入门
    关于 OPENSSL_Uplink(XX……XX,08): no OPENSSL_Applink 处理
    使用 Kitten 开发一款趣味成语接龙游戏
    Win系统使用DINO训练自己数据集
    Java项目:基于JSP+Servlet的网上订餐管理系统
    聊聊Seata分布式解决方案AT模式的实现原理
    学会用Linux用户管理命令
  • 原文地址:https://blog.csdn.net/robinspada/article/details/128142011