为什么Vue3中this.count++和count.value++的运行效果一致?
为什么方法2的this.count++可以正常运行?
核心原因和Vue3对setup返回值的处理、ref自动解包规则、函数this绑定三个特性有关:
- setup函数返回的所有属性,都会被自动挂载到当前组件的实例对象上,也就是选项式API中常用的
this指向的对象 - 挂载到组件实例的ref类型变量会被自动解包,访问
this.count等价于直接访问原ref对象的.value属性 - 你的
inc是普通函数声明,模板绑定的事件回调触发时,Vue会自动将函数的this绑定到当前组件实例,因此this.count可以正确访问到解包后的值,递增操作也能触发响应式更新
如果把inc改成箭头函数,函数内部的this会继承上层作用域的this(setup内部的this是undefined),方法2就会直接报错。
是否存在适合使用方法2的场景?
绝大多数场景都强烈不推荐使用这种写法,组合式API的设计核心就是和组件实例this解耦,用this的写法会引入很多不必要的问题:
- 依赖this的动态绑定,修改函数写法就容易失效,心智负担更高
- 带this的逻辑无法抽离为可复用的组合式函数,完全浪费了组合式API的优势
- TypeScript对这种写法的类型推导支持差,容易出现类型错误
唯一可能用到的场景是老项目从选项式API往组合式API迁移的过渡阶段:部分老旧逻辑已经写了大量this调用,为了降低迁移成本,可以临时保留这种写法,等后续逻辑重构完再彻底移除this的使用。
内容的提问来源于stack exchange,提问作者tlietz
相关产品推荐
相关产品推荐

