shallowReactive 和 shallowRef
shallowReactive : 只处理对象最外层属性的响应式(浅响应式)shallowRef : 只处理基本数据类型的响应式,不进行对象的响应式处理- 什么时候使用?
- 如果有一个对象数据,结构比较深,但变化时只是外层属性变化 => shallowReactive
- 如果有一个对象数据,后续功能不会修改该对象中的属性,而是生新的对象来替换 => shallowRef
readonly 和 shallowReadonly
readonly :让一个响应式数据变为只读的(深只读)shallowReadonly : 让一个响应式数据变为只读的(浅只读)- 应用场景:不希望数据被修改时
toRaw 和 markRaw
toRaw
- 作用:将一个由
reactive 生成的响应式对象 转为普通对象 - 使用场景:用于读取响应式对象对应的普通对象,对这个普通对象的所有操作,不会引起页面更新
markRaw
- 作用:标记一个对象,使其
永远不会再成为响应式对象 - 应用场景:
- 有些值不应该被设置为响应式的,比如复杂的第三方类库等
- 当渲染具有不可变数据源的大列表时,跳过响应式转换可以提高性能
customRef
- 作用:创建一个
自定义的ref ,并对其依赖项跟踪和更新触发进行显式控制 - 实现一个输入框输入内容在页面同步显示小样例:
<template>
<input type="text" v-model="keyword">
<h3>{{keyword}}</h3>
</template>
<script>
import { ref, customRef} from 'vue'
export default {
setup() {
function myRef(value) {
let timer
return customRef((track,trigger) => {
return {
get() {
track();
return value;
},
set(newValue) {
value = newValue;
trigger();
}
}
})
}
let keyword = myRef('hello');
return {
keyword
}
}
}
</script>
provide 和 inject
- 作用:实现祖孙组件间通信
- 祖组件有一个
provide 选项来提供数据,孙组件有一个inject 选项来开始使用这些数据(父子组件也可以用,但是没必要) - 具体写法:
- 祖组件中:
setup() {
......
let person = reactive({name:'AIpoem',age: 19});
provide('p',person);
}
- 孙组件中:
setup() {
......
let person = inject('p');
return {person};
}
新组件
Fragment
- 在vue2中:组件必须有一个根标签
- 在vue3中:组件可以没有根标签,内部会将多个标签包含在一个Fragment虚拟元素中
- 好处:减少标签层级,减少内存占用
Teleport
- 作用:能将我们的组件的html结构移动到指定位置
- 例:下面是一段实现弹窗的代码,如果这段代码放在某个层次较深的组件中,但是弹窗希望相对body定位,就可以像下面这样写
<teleport to="body">
<div v-if="isShow" class="mask">
<div class="dialog">
<h3>我是一个弹窗/h3>
<button @click="isShow = false">关闭弹窗</button>
</div>
</div>
</teleport>
Suspense
- 作用:等待异步组件时渲染一些额外的内容,有更好的用户体验
Suspense 是一个试验性的新特性,其api可能随时会发生变动。生产环境请勿使用。- 使用步骤:
- 异步引入组件
import {defineAsyncComponent} from 'vue'
const Child = defineAsyncComponent(() => import('./components/Child.vue'))
- 使用
Suspense 包裹组件,并配置好default 和fallback
<template>
<div class="app">
<h3>我是App组件</h3>
<Suspense>
<template #default>
<child></child>
</template>
<template #fallback>
<h3>加载中...</h3>
</template>
</Suspense>
</div>
</template>
全局api的转移
vue3.0将全局的api,即Vue.xxx 调整到应用实例(app)上
2.x全局API | 3.0实例API |
---|
Vue.config.xxxx | Vue.config.xxxx | Vue.config.productionTip | 移除 | Vue.component | app.component | Vue.directive | app.directive | Vue.mixin | app.mixin | Vue.use | app.use | Vue.prototype | app.config.globalProperties |
其他改变
完
|