Skip to content

Commit

Permalink
fix(mp): MPComponent skip deep observe
Browse files Browse the repository at this point in the history
  • Loading branch information
zhetengbiji committed Nov 8, 2022
1 parent b98183f commit 947050b
Show file tree
Hide file tree
Showing 6 changed files with 54 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -991,7 +991,8 @@ function observe (value, asRootData) {
!isServerRendering() &&
(Array.isArray(value) || isPlainObject(value)) &&
Object.isExtensible(value) &&
!value._isVue
!value._isVue &&
!value.__v_isMPComponent
) {
ob = new Observer(value);
}
Expand Down Expand Up @@ -5600,7 +5601,7 @@ function nextTick$1(vm, cb) {
function clearInstance(key, value) {
// 简易去除 Vue 和小程序组件实例
if (value) {
if (value._isVue || (value.$vm && value.$vm._isVue)) {
if (value._isVue || value.__v_isMPComponent) {
return {}
}
}
Expand Down
3 changes: 2 additions & 1 deletion src/platforms/mp-alipay/runtime/index.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { handleProps } from './wrapper/util'
import { handleProps, markMPComponent } from './wrapper/util'

const MPComponent = Component

function initHook (name, options) {
const oldHook = options[name]
options[name] = function (...args) {
markMPComponent(this)
const props = this.props
if (props && props['data-com-type'] === 'wx') {
handleProps(this)
Expand Down
9 changes: 6 additions & 3 deletions src/platforms/mp-alipay/runtime/wrapper/util.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,14 @@ import {
} from 'uni-shared'

import {
handleLink as handleBaseLink
handleLink as handleBaseLink,
toSkip
} from '../../../mp-weixin/runtime/wrapper/util'

import deepEqual from './deep-equal'

export { markMPComponent } from '../../../mp-weixin/runtime/wrapper/util'

const customizeRE = /:/g

const customize = cached((str) => {
Expand Down Expand Up @@ -145,9 +148,9 @@ export function handleRef (ref) {
const refName = ref.props['data-ref']
const refInForName = ref.props['data-ref-in-for']
if (refName) {
this.$vm.$refs[refName] = ref.$vm || ref
this.$vm.$refs[refName] = ref.$vm || toSkip(ref)
} else if (refInForName) {
(this.$vm.$refs[refInForName] || (this.$vm.$refs[refInForName] = [])).push(ref.$vm || ref)
(this.$vm.$refs[refInForName] || (this.$vm.$refs[refInForName] = [])).push(ref.$vm || toSkip(ref))
}
}

Expand Down
7 changes: 4 additions & 3 deletions src/platforms/mp-toutiao/runtime/wrapper/util.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {
findVmByVueId,
initRefs as initRefsBase
initRefs as initRefsBase,
toSkip
} from '../../../mp-weixin/runtime/wrapper/util'

export const mocks = ['__route__', '__webviewId__', '__nodeid__', '__nodeId__']
Expand All @@ -19,7 +20,7 @@ export function initRefs (vm) {
mpInstance.selectAllComponents('.vue-ref', (components) => {
components.forEach(component => {
const ref = component.dataset.ref
vm.$refs[ref] = component.$vm || component
vm.$refs[ref] = component.$vm || toSkip(component)
})
})
mpInstance.selectAllComponents('.vue-ref-in-for', (forComponents) => {
Expand All @@ -28,7 +29,7 @@ export function initRefs (vm) {
if (!vm.$refs[ref]) {
vm.$refs[ref] = []
}
vm.$refs[ref].push(component.$vm || component)
vm.$refs[ref].push(component.$vm || toSkip(component))
})
})
}
Expand Down
12 changes: 5 additions & 7 deletions src/platforms/mp-weixin/runtime/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import {
cached,
camelize
} from 'uni-shared'
import { markMPComponent } from './wrapper/util'

const MPPage = Page
const MPComponent = Component
Expand Down Expand Up @@ -41,13 +42,10 @@ function initHook (name, options, isComponent) {
isComponent && options.lifetimes && options.lifetimes[name] && (options = options.lifetimes)
}
const oldHook = options[name]
if (!oldHook) {
options[name] = function () {
initTriggerEvent(this)
}
} else {
options[name] = function (...args) {
initTriggerEvent(this)
options[name] = function (...args) {
markMPComponent(this)
initTriggerEvent(this)
if (oldHook) {
return oldHook.apply(this, args)
}
}
Expand Down
37 changes: 34 additions & 3 deletions src/platforms/mp-weixin/runtime/wrapper/util.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
import {
isObject
} from 'uni-shared'

export const mocks = ['__route__', '__wxExparserNodeId__', '__wxWebviewId__']

export function findVmByVueId (vm, vuePid) {
Expand Down Expand Up @@ -35,7 +39,7 @@ function selectAllComponents (mpInstance, selector, $refs) {
const components = mpInstance.selectAllComponents(selector) || []
components.forEach(component => {
const ref = component.dataset.ref
$refs[ref] = component.$vm || component
$refs[ref] = component.$vm || toSkip(component)
if (__PLATFORM__ === 'mp-weixin') {
if (component.dataset.vueGeneric === 'scoped') {
component.selectAllComponents('.scoped-ref').forEach(scopedComponent => {
Expand Down Expand Up @@ -78,7 +82,7 @@ export function initRefs (vm) {
if (!$refs[ref]) {
$refs[ref] = []
}
$refs[ref].push(component.$vm || component)
$refs[ref].push(component.$vm || toSkip(component))
})
return syncRefs(refs, $refs)
}
Expand All @@ -102,4 +106,31 @@ export function handleLink (event) {
}

vueOptions.parent = parentVm
}
}

export function markMPComponent (component) {
// 在 Vue 中标记为小程序组件
const IS_MP = '__v_isMPComponent'
Object.defineProperty(component, IS_MP, {
configurable: true,
enumerable: false,
value: true
})
return component
}

export function toSkip (obj) {
const OB = '__ob__'
const SKIP = '__v_skip'
if (isObject(obj) && Object.isExtensible(obj)) {
// 避免被 @vue/composition-api 观测
Object.defineProperty(obj, OB, {
configurable: true,
enumerable: false,
value: {
[SKIP]: true
}
})
}
return obj
}

0 comments on commit 947050b

Please sign in to comment.