vue3-plugin.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // vue3-plugin.js
  2. import { inject } from 'vue'
  3. import { domProcessor } from './text-processor'
  4. import { antdProcessor } from './antd-processor'
  5. export const GlobalTextProcessor = {
  6. install(app) {
  7. // 启动 Ant Design 处理器
  8. antdProcessor.initObserver()
  9. // 添加全局方法
  10. app.config.globalProperties.$processTextNodes = function (element = this.$el) {
  11. domProcessor.processElement(element)
  12. antdProcessor.processAntdComponents()
  13. }
  14. app.config.globalProperties.$autoSelect = function (className) {
  15. domProcessor.processSelector(`.${className}`)
  16. }
  17. app.config.globalProperties.$autoHtmlSelect = function (tagName) {
  18. domProcessor.processTagName(tagName)
  19. }
  20. // 添加 Ant Design 特定方法
  21. app.config.globalProperties.$processAntdComponents = function () {
  22. antdProcessor.processAntdComponents()
  23. }
  24. // 使用指令方式
  25. app.directive('translate', {
  26. mounted(el) {
  27. domProcessor.processElement(el)
  28. antdProcessor.processAntdComponent(el)
  29. },
  30. updated(el) {
  31. domProcessor.processElement(el)
  32. antdProcessor.processAntdComponent(el)
  33. }
  34. })
  35. // 使用 mixin
  36. app.mixin({
  37. updated() {
  38. this.$nextTick(() => {
  39. this.$processTextNodes(this.$el)
  40. this.$autoHtmlSelect('title')
  41. })
  42. },
  43. mounted() {
  44. this.$nextTick(() => {
  45. this.$processAntdComponents()
  46. })
  47. }
  48. })
  49. // 提供 Composition API
  50. app.provide('textProcessor', {
  51. processTextNodes: (element) => {
  52. domProcessor.processElement(element)
  53. antdProcessor.processAntdComponents()
  54. },
  55. processAntdComponents: () => antdProcessor.processAntdComponents(),
  56. autoSelect: (className) => domProcessor.processSelector(`.${className}`),
  57. autoHtmlSelect: (tagName) => domProcessor.processTagName(tagName)
  58. })
  59. }
  60. }
  61. // Composition API
  62. export function useTextProcessor() {
  63. const injector = inject('textProcessor', null)
  64. const processTextNodes = (element) => {
  65. injector?.processTextNodes(element)
  66. }
  67. const processAntdComponents = () => {
  68. injector?.processAntdComponents()
  69. }
  70. const autoSelect = (className) => {
  71. injector?.autoSelect(className)
  72. }
  73. const autoHtmlSelect = (tagName) => {
  74. injector?.autoHtmlSelect(tagName)
  75. }
  76. return {
  77. processTextNodes,
  78. processAntdComponents,
  79. autoSelect,
  80. autoHtmlSelect
  81. }
  82. }