dx(runtime-core): warn if `this` is used in a `<script setup>` template (#7866)

This commit is contained in:
skirtle 2023-11-10 07:05:39 +00:00 committed by GitHub
parent 5a41231352
commit f01afda159
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 37 additions and 1 deletions

View File

@ -354,4 +354,25 @@ describe('renderer: component', () => {
expect(serializeInner(root)).toBe(`<h1>1</h1>`)
expect(spy).toHaveBeenCalledTimes(2)
})
it('should warn accessing `this` in a <script setup> template', () => {
const App = {
setup() {
return {
__isScriptSetup: true
}
},
render(this: any) {
return this.$attrs.id
}
}
const root = nodeOps.createElement('div')
render(h(App), root)
expect(
`Property '$attrs' was accessed via 'this'. Avoid using 'this' in templates.`
).toHaveBeenWarned()
})
})

View File

@ -73,9 +73,24 @@ export function renderComponentRoot(
// withProxy is a proxy with a different `has` trap only for
// runtime-compiled render functions using `with` block.
const proxyToUse = withProxy || proxy
// 'this' isn't available in production builds with `<script setup>`,
// so warn if it's used in dev.
const thisProxy =
__DEV__ && setupState.__isScriptSetup
? new Proxy(proxyToUse!, {
get(target, key, receiver) {
warn(
`Property '${String(
key
)}' was accessed via 'this'. Avoid using 'this' in templates.`
)
return Reflect.get(target, key, receiver)
}
})
: proxyToUse
result = normalizeVNode(
render!.call(
proxyToUse,
thisProxy,
proxyToUse!,
renderCache,
props,