vue3 Suspense以及vue3的其他变化

717 阅读2分钟

这是我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战

Suspense

等待异步组件时渲染一些额外内容,让应用有更好的用户体验 使用步骤: 异步引入组件

import {defineAsyncComponent} from 'vue'
const Child = defineAsyncComponent(()=>import('./components/Child.vue'))

使用Suspense包裹组件,并配置好default 与fallback

<template>
    <div class="app">
        <h3>我是app组件</h3>
        <Suspense>
            <template v-slot:defalut>
                <Child/>
            </template>
            <template v-slot:fallback>
                <h3>加载中。。。</h3>
            </template>
        </Suspense>
    </div>
</template>

该组件可以异步加载suspense组件包裹的内容,在没有完成内容加载的时候默认显示v-slot:fallback模板中的内容,有点像loading,可以提高用户体验

这个时候,我们可以这样写:

import {ref} from 'vue'
async setup(){
    let sum = ref(0)
    let p = new Promise((resolve,reject)=>{
      setTimeout(() => {
        resolve({sum})
      }, 2000);
    })
    return await p
  }

这样写的话,我们可以实现子组件等待2秒之后出现的效果...

之前有说过setup中不能用async,但其实是因为那个时候我们还没有学习到这个异步组件,今天学到了,那么,我们可以再加上一句话:setup也可以返回一个Promise实例,但需要Suspense和异步组件的配合。

vue3其他变化

1:全局API的转移

vue2.x有许多全局的API和配置

例如:注册全局组件,注册全局指令等

//注册全局组件
Vue.component('MyButton',{
    data:()=>({
        count:0
    }),
    template:'<button @click="count++" >Clicked{{count}} times.</button>'
})
//注册全局指令
Vue.directive('focus',{
    inserted:el=>el.focus()
})

Vue3中对这些API做了调整 将全局的API,即Vue.xxx调整到应用实例(app)上

2.x全局API3.x实例API
Vue.config.xxxxapp.config.xxxx
Vue.config.productionTip(关闭Vue的生产提示:false)移除
Vue.componentapp.component
Vue.directiveapp.directive
Vue.mixinapp.mixin
Vue.useapp.use
Vue.prototypeapp.config.globalProperties

我们上面看到的app即:

import App from './App.vue
const app = createApp(App)

2.其他改变

data选项应始终被声明为一个函数

过渡类名的更改:

vue2

.v-enter,
v-leave-to{
    opacity:0
}
.v-leave,
v-enter-to{
    opacity:1
}

vue3

.v-enter-from,
.v-leave-to{
    opacity:0
}
.v-leave-from,
.v-enter-to{
    opacity:1
}

移除了KeyCode作为v-on的修饰符,同时也不再支持config,keyCodes

移除了v-on.native修饰符

移除过滤器(filter)

。。。