You need to enable JavaScript to run this app. 为什么Vue模板中使用this有时正常运行有时会抛出错误?
优惠活动
大模型
产品
解决方案
定价
更多

为什么Vue模板中使用this有时正常运行有时会抛出错误?

问题成因解答

两个写法的表现差异和三元运算符无关,本质是HTML属性引号嵌套冲突 + Vue模板编译的上下文绑定规则共同导致的。


1. Vue模板表达式的基础规则

Vue在编译模板时,所有v-bind(简写:)绑定的表达式、双花括号插值内容,都会自动被包裹在with(this) { /* 你的表达式 */ }块内执行,this默认指向当前组件实例。也就是说你在模板里写$locale()和写this.$locale()运行时效果完全等价,官方不推荐在模板里显式写this,属于冗余写法。

2. 两种写法的差异根源

  • 报错的写法存在HTML属性引号嵌套冲突
    你给出的错误代码:
<a :href="`${this.$locale() ? "Yes" : "No"}`">

整个:href属性的值是用双引号"包裹的,而三元表达式里的Yes/No也用了双引号,HTML解析器会把Yes前面的第一个双引号,识别为整个href属性值的结束标记,后续的内容Yes : "No"}">会被判定为非法的HTML语法,直接抛出解析错误,和this`、三元运算符本身都没有直接关联。

如果你把内部的字符串改成单引号包裹,就能正常运行:

<a :href="`${this.$locale() ? 'Yes' : 'No'}`">
  • 正常的写法没有引号嵌套冲突
    你给出的正常运行代码:
<title :lang="this.$locale()">

属性值内部没有嵌套的双引号,HTML解析、Vue编译都能正常处理,哪怕你写了冗余的this,也能正确绑定到组件实例的$locale方法,所以不会报错。

3. 额外注意事项

哪怕修改引号后带this的写法能运行,也建议把模板里所有显式的this删除,一方面符合Vue的设计惯例,另一方面也能避免在部分边缘场景(比如嵌套的表达式、作用域插槽内部)出现this指向异常的问题。


内容的提问来源于stack exchange,提问作者Arminas Šaltenis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 23:30:02