mirror of https://github.com/vuejs/core.git
dx(runtime-core): warn if `this` is used in a `<script setup>` template (#7866)
This commit is contained in:
parent
5a41231352
commit
f01afda159
|
@ -354,4 +354,25 @@ describe('renderer: component', () => {
|
||||||
expect(serializeInner(root)).toBe(`<h1>1</h1>`)
|
expect(serializeInner(root)).toBe(`<h1>1</h1>`)
|
||||||
expect(spy).toHaveBeenCalledTimes(2)
|
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()
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
|
@ -73,9 +73,24 @@ export function renderComponentRoot(
|
||||||
// withProxy is a proxy with a different `has` trap only for
|
// withProxy is a proxy with a different `has` trap only for
|
||||||
// runtime-compiled render functions using `with` block.
|
// runtime-compiled render functions using `with` block.
|
||||||
const proxyToUse = withProxy || proxy
|
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(
|
result = normalizeVNode(
|
||||||
render!.call(
|
render!.call(
|
||||||
proxyToUse,
|
thisProxy,
|
||||||
proxyToUse!,
|
proxyToUse!,
|
||||||
renderCache,
|
renderCache,
|
||||||
props,
|
props,
|
||||||
|
|
Loading…
Reference in New Issue