vue3相比vue2写法上的改变

vue3相比vue2的改变

除开不少文档的最多的组合式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移动到对应的节点**。
相关文章
相关标签/搜索