开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 26 天,点击查看活动详情
前段时间进行了部分 Vue2 代码到 Vue3 的迁移,其中会遇到一些语法或是报错问题,有时大部分是因为一些语法在 Vue3.x 被废弃。
.native
.native 做的作用是:在组件的根元素上监听一个原生事件
如果遇到了 '.native' modifier on 'v-on' directive is deprecated' 的提示,是因为 Vue3 不再使用“v-on”指令上的“.native”修饰符。官方解释
Vue2 中自定义组件如果想要直接使用 @click 是不生效的,需要配合 .native 修饰符来触发点击事件。 在 Vue3 中错误的写法:
<myComp v-on:focus.native="onFocus"/>
正确的写法:
<MyComponent v-on:focus="onFocus"/>
.sync
.sync 修饰符可以简化父子组件传值,实现子组件与父组件的双向绑定(由于 v-model 只有一个,当需要多个双向绑定的时候,可以使用 sync 来修饰)
Vue2 的写法:
<myComp v-bind:visible.sync="visible"/>
Vue3 的写法:
<myComp v-model:visible="visible"/>
Eslint 相关
1、Unexpected mutation of "datas" prop vue/no-mutating-props
出现这问题的原因是 Vue 是单向数据流,在父组件传参给子组件的参数被直接修改时,就会报错。
解决方法:
- 将数据进行深拷贝
- 利用计算属性 computed,将参数进行转换
- 关闭 Eslint 相关的配置
"vue/script-setup-uses-vars": "off"
在根目录下的 vue.config.js 中的 rules 中可作如下配置(或是 .eslintrc.js):
样式相关
1、 样式穿透
/deep/
和::v-deep
的写法都被 vue3 弃用,需要改为:deep()
2、v-bind 为样式绑定变量 变量或者对象都可以使用,对象需要加引号
const H = ref('500px')
const Style = ref({
color: 'red'
})
:deep(.input) {
width: v-bind(H);
background: v-bind('Style.color');
}
- 全局样式 :global() global 不受作用域的限制,可以在修改引入的组件库默认样式时使用