除开不少文档的最多的组合式API,在常规使用上的改变也不少。好比:
1.v-for列表渲染部分调整javascript
v-for和vue-if的优先级问题,vue3中,v-if的优先级高于v-for,没法使用v-for中的参数来进行判断。这样写会抛出错误或者警告,要求开发者对v-for的对象使用计算属性或者方法来进行过滤。 vue2在进行列表渲染时,会自动给每一个循环上加ref,vue3须要手动加入。
2.属性继承包含class和stylevue
vue3在子组件继承时。默认继承class到子组件的根节点。若是须要达到和vue2相同的效果,须要设置子组件的`inheritAttrs:false`
3.vue3移除了$childrenjava
不能使用$children来选择子组件,只能使用$refs.xxx的方式来选取子组件。
4.自定义指令中的生命周期发生变化react
vue2和vue3指令生命周期对照表,换句话说,指令中的生命周期和组件的生命周期一致。而vue2中,指令和组件的生命周期是不一致的。
vue2 | vue3 | 说明 |
---|---|---|
-- | created | 元素属性和事件监听被初始化后调用,vue3新增 |
bind | beforeMount | 挂载以前调用 |
insert | Mounted | 挂载以后调用 |
-- | beforeUpdate | 组件数据更新以前调用,vue3新增 |
update | -- | 数据更新时调用,vue3已移除 |
componentUpdated | updated | 组件数据更新后调用 |
-- | beforeUnmount | 组件卸载以前调用,vue3新增 |
unbind | unmounted | 组件卸载以后调用 |
5.data及mixin的合并策略ios
vue3中data只能是函数,返回一个对象的方式。合并策略为data根节点进行浅层合并。
6.过滤器被移除axios
vue3移除了过滤器,须要使用过滤器的场景使用计算属性或者methods代替。
7.事件$on,$off,$once被移除。app
组件的$emit依然保留,同时,组件上绑定原生事件修饰符.native被移除,能够在子组件上直接监听原生事件。可是有坑,设置了第二条中的`inheritAttrs:false`,会致使事件不会被触发。
8.render函数的修改dom
在vue2中,render函数默认传参createElement函数。vue3中没有默认参数,须要从vue中引入。 vue2写法:
render(h){ return h('div',{...options},'默认') }
vue3的写法: ```javascript import {h} from 'vue' // ……省略内容 render(){ return h('div',{...options},'默认') } ``` 同时,上例中的options的写法也有调整,vue2中本来的attrs,on等属性都取消了。 vue2中的options大概是这样: ```javascript { staticClass: 'button', class: {'is-outlined': isOutlined }, staticStyle: { color: '#34495E' }, style: { backgroundColor: buttonColor }, attrs: { id: 'submit' }, domProps: { innerHTML: '' }, on: { click: submitForm }, key: 'submit-button' } ``` 而vue3中的options则为这样: ```javascript { class: ['button', { 'is-outlined': isOutlined }], style: [{ color: '#34495E' }, { backgroundColor: buttonColor }], id: 'submit', innerHTML: '', onClick: submitForm, key: 'submit-button' } ```
9.template规则发生变化函数
vue2中要求template中有惟一的根元素,而vue3中能够有多个根元素
10.Vue.prototype被config.globalProperties取代。prototype
拿咱们常常用的axios来举例,vue2写法: ```javascript import Vue from 'vue' import axios from 'axios' Vue.prototype.axios = axios; ``` Vue3写法: ```javascript import {createApp} from 'vue'; import axios from 'axios'; const app = createApp(); app.config.globalProperties.axios = axios; ``` 可是这里须要注意的是,config.globalProperties这个属性是应用自己才有的,而mount会返回实例,没法实现全局挂载。因此在进行链式写法的时候,**先设置congfig.globalProperties后再进行mount**,因此例子中的app若是不当心这样写了,是不生效的。 ```javascript // 错误示范 import {createApp} from 'vue'; import axios from 'axios'; const app = createApp().mount('#app');//先设置全局属性,再进行挂载 app.config.globalProperties.axios = axios; ```
11.Vue3增长了teleport
teleport功能上能够理解成react里面的portals ```javascript <teleport to ="body"> // some elements </teleport> ``` 用途是部分元素可能有挂载或者呈现到特定结点的需求。好比常见的modal,模态对话框,一般有那种全屏显示的需求,咱们把他放到body子级。teleport就是这个用途。须要注意的是,官方强调了,这个是**将dom移动到对应的节点**。