Javascript

浅学Vue3Day3 一些Composition api、Teleport、Suspense、全局api的转移

本文主要是介绍浅学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选项来开始使用这些数据(父子组件也可以用,但是没必要)
  • 具体写法:
  1. 祖组件中:
 setup() {
   ......
   let person = reactive({name:'AIpoem',age: 19});
   provide('p',person);
 }
  1. 孙组件中:
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可能随时会发生变动。生产环境请勿使用。
  • 使用步骤:
  1. 异步引入组件
import {defineAsyncComponent} from 'vue'
const Child = defineAsyncComponent(() => import('./components/Child.vue'))
  1. 使用Suspense包裹组件,并配置好defaultfallback
<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全局API3.0实例API
Vue.config.xxxxVue.config.xxxx
Vue.config.productionTip移除
Vue.componentapp.component
Vue.directiveapp.directive
Vue.mixinapp.mixin
Vue.useapp.use
Vue.prototypeapp.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的转移的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!