浅学Vue3Day3 一些Composition api、Teleport、Suspense、全局api的转移
2022/1/24 23:04:35
本文主要是介绍浅学Vue3Day3 一些Composition api、Teleport、Suspense、全局api的转移,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
内容
- shallowReactive 和 shallowRef
- readonly 和 shallowReadonly
- toRaw 和 markRaw
- customRef
- provide 和 inject
- 新组件
- Fragment
- Teleport
- Suspense
- 全局api的转移
- 其他改变
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() { // 自定义一个myRef function myRef(value) { let timer return customRef((track,trigger) => { // customRef接收一个函数为参数,需要return出去一个getter和setter return { get() { track(); // 这个value值是需要被追踪的,这里不写的话之后更改value页面也不会同步改变 return value; }, set(newValue) { value = newValue; trigger(); // 通知vue去重新解析模版 } } }) } 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"> <!--这里的to后接指定位置--> <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 |
其他改变
- 移除
keyCode
作为v-on
的修饰符 - 移除
v-on.native
修饰符- 在父组件中绑定事件
<my-component v-on:close="handleComponentEvent" v-on:click="handleNativeClickEvent" />
- 子组件中声明自定义事件
<script> export default { emits: ['close'] // 声明了的就是自定义事件,没指定的click事件就是原生事件 } </script>
完
这篇关于浅学Vue3Day3 一些Composition api、Teleport、Suspense、全局api的转移的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-16Vue3资料:新手入门必读教程
- 2024-11-16Vue3资料:新手入门全面指南
- 2024-11-16Vue资料:新手入门完全指南
- 2024-11-16Vue项目实战:新手入门指南
- 2024-11-16React Hooks之useEffect案例详解
- 2024-11-16useRef案例详解:React中的useRef使用教程
- 2024-11-16React Hooks之useState案例详解
- 2024-11-16Vue入门指南:从零开始搭建第一个Vue项目
- 2024-11-16Vue3学习:新手入门教程与实践指南
- 2024-11-16Vue3学习:从入门到初级实战教程