提交 af653a11 编写于 作者: Q qiang

fix(App): element support $getComponentDescriptor

上级 8a2a140e
...@@ -61,9 +61,9 @@ export default { ...@@ -61,9 +61,9 @@ export default {
Vue.prototype.$handleWxsEvent = function ($event) { Vue.prototype.$handleWxsEvent = function ($event) {
if ($event instanceof Event) { // 未处理的 event 对象 需要对 target 校正及包装 if ($event instanceof Event) { // 未处理的 event 对象 需要对 target 校正及包装
const currentTarget = $event.currentTarget const currentTarget = $event.currentTarget
const instance = currentTarget && // vue component / web component
currentTarget.__vue__ && const component = currentTarget && (currentTarget.__vue__ || currentTarget)
currentTarget.__vue__.$getComponentDescriptor(currentTarget.__vue__, false) const instance = currentTarget && component.$getComponentDescriptor && component.$getComponentDescriptor(component, false)
const $origEvent = $event const $origEvent = $event
$event = processEvent.call(this, $origEvent.type, $origEvent, {}, findUniTarget($origEvent, this.$el) || $origEvent.target, $event = processEvent.call(this, $origEvent.type, $origEvent, {}, findUniTarget($origEvent, this.$el) || $origEvent.target,
$origEvent.currentTarget) $origEvent.currentTarget)
......
...@@ -28,7 +28,7 @@ function getWxsClsArr (clsArr, classList, isAdd) { ...@@ -28,7 +28,7 @@ function getWxsClsArr (clsArr, classList, isAdd) {
return wxsClsArr return wxsClsArr
} }
function parseStyleText (cssText) { export function parseStyleText (cssText) {
const res = {} const res = {}
const listDelimiter = /;(?![^(]*\))/g const listDelimiter = /;(?![^(]*\))/g
const propertyDelimiter = /:(.+)/ const propertyDelimiter = /:(.+)/
...@@ -41,7 +41,7 @@ function parseStyleText (cssText) { ...@@ -41,7 +41,7 @@ function parseStyleText (cssText) {
return res return res
} }
class ComponentDescriptor { export class ComponentDescriptor {
constructor (vm) { constructor (vm) {
this.$vm = vm this.$vm = vm
Object.defineProperty(this, '$el', { Object.defineProperty(this, '$el', {
...@@ -56,7 +56,9 @@ class ComponentDescriptor { ...@@ -56,7 +56,9 @@ class ComponentDescriptor {
return return
} }
const el = this.$el.querySelector(selector) const el = this.$el.querySelector(selector)
return el && el.__vue__ && createComponentDescriptor(el.__vue__, false) // vue component / web component
const component = el.__vue__ || el
return component.$getComponentDescriptor && component.$getComponentDescriptor(component, false)
} }
selectAllComponents (selector) { selectAllComponents (selector) {
...@@ -67,7 +69,9 @@ class ComponentDescriptor { ...@@ -67,7 +69,9 @@ class ComponentDescriptor {
const els = this.$el.querySelectorAll(selector) const els = this.$el.querySelectorAll(selector)
for (let i = 0; i < els.length; i++) { for (let i = 0; i < els.length; i++) {
const el = els[i] const el = els[i]
el.__vue__ && descriptors.push(createComponentDescriptor(el.__vue__, false)) // vue component / web component
const component = el.__vue__ || el
component.$getComponentDescriptor && descriptors.push(component.$getComponentDescriptor(component, false))
} }
return descriptors return descriptors
} }
......
import { import {
camelize camelize,
isPlainObject
} from 'uni-shared' } 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) { function formatKey (key) {
return camelize(key.substring(5)) return camelize(key.substring(5))
...@@ -21,4 +80,13 @@ export default class UniElement extends HTMLElement { ...@@ -21,4 +80,13 @@ export default class UniElement extends HTMLElement {
} }
super.removeAttribute(key) super.removeAttribute(key)
} }
$getComponentDescriptor () {
if (!('__wxsComponentDescriptor' in this)) {
this.__wxsComponentDescriptor = new ComponentDescriptor({
$el: this
})
}
return this.__wxsComponentDescriptor
}
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册