mh-two-thousand-and-two
2024-04-12 3d2ec2fd0578d3ba0a414b0cc4e4a2ae60878596
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import {
  camelize,
  isPlainObject
} from 'uni-shared'
import {
  ComponentDescriptor as ComponentDescriptorClass,
  parseStyleText
} from 'uni-core/view/plugins/wxs/component-descriptor'
 
// upx,rpx 正则匹配
const unitRE = /\b([+-]?\d+(\.\d+)?)[r|u]px\b/g
 
const transformUnit = (val) => {
  if (typeof val === 'string') {
    return val.replace(unitRE, (a, b) => {
      /* eslint-disable no-undef */
      return uni.upx2px(b) + 'px'
    })
  }
  return val
}
 
class ComponentDescriptor extends ComponentDescriptorClass {
  setStyle (style) {
    if (!this.$el || !style) {
      return this
    }
    if (typeof style === 'string') {
      style = parseStyleText(style)
    }
    if (isPlainObject(style)) {
      for (const key in style) {
        this.$el.style[key] = transformUnit(style[key])
      }
    }
    return this
  }
 
  addClass (...clsArr) {
    if (!this.$el || !clsArr.length) {
      return this
    }
    this.$el.classList.add(...clsArr)
    return this
  }
 
  removeClass (...clsArr) {
    if (!this.$el || !clsArr.length) {
      return this
    }
    this.$el.classList.remove(...clsArr)
    return this
  }
 
  callMethod () {
 
  }
 
  triggerEvent () {
 
  }
}
 
function formatKey (key) {
  return camelize(key.substring(5))
}
 
export default class UniElement extends HTMLElement {
  setAttribute (key, value) {
    if (key.startsWith('data-')) {
      const dataset = this.__uniDataset || (this.__uniDataset = {})
      dataset[formatKey(key)] = value
    }
    super.setAttribute(key, value)
  }
 
  removeAttribute (key) {
    if (this.__uniDataset && key.startsWith('data-')) {
      delete this.__uniDataset[formatKey(key)]
    }
    super.removeAttribute(key)
  }
 
  $getComponentDescriptor () {
    if (!('__wxsComponentDescriptor' in this)) {
      this.__wxsComponentDescriptor = new ComponentDescriptor({
        $el: this
      })
    }
    return this.__wxsComponentDescriptor
  }
}