Composition API(其它)

2021-01-10  本文已影响0人  小米和豆豆

仅仅为了方便学习记录信息,未有其他用途。(采摘)

shallowReactive 与 shallowRef

  • shallowReactive : 只处理了对象内最外层属性的响应式(也就是浅响应式)
  • shallowRef: 只处理了value的响应式, 不进行对象的reactive处理

readonly 与 shallowReadonly

  • readonly :只读代理是深层的:访问的任何嵌套 property 也是只读的。
  • shallowReadonly:创建一个代理,使其自身的 property 为只读,但不执行嵌套对象的深度只读转换

toRaw 与 markRaw

  • toRaw: 返回由 reactive 或 readonly 方法转换成响应式代理的普通对象。这是一个还原方法,可用于临时读取,访问不会被代理/跟踪,写入时也不会触发界面更新。
  • markRaw: 标记一个对象,使其永远不会转换为代理。返回对象本身.

toRef()

  • toRef 为源响应式对象上的某个属性创建一个 ref对象, 二者内部操作的是同一个数据值, 更新时二者是同步的
  • 区别ref: 拷贝了对象属性的一份新的数据值单独操作, 更新时相互不影响

customRef

创建一个自定义的 ref,并对其依赖项跟踪和更新触发进行显式控制.

<template>
  <input v-model="keyword" placeholder="搜索关键字"/>{{keyword}}
</template>
<script lang="ts">
import {  ref, customRef } from 'vue'
export default {
  setup () {
    const keyword = useDebouncedRef('', 500)
    return { keyword  }
  },
}
/* 
实现函数防抖的自定义ref
*/
function useDebouncedRef<T>(value: T, delay = 200) {
  let timeout: number
  return customRef((track, trigger) => {
    return {
      get() {
        track()  // 告诉Vue追踪数据
        return value
      },
      set(newValue: T) {
        clearTimeout(timeout)
        timeout = setTimeout(() => {
          value = newValue;
          trigger();// 告诉Vue去触发界面更新
        }, delay)
      }
    }
  })
}
</script>

provide 与 inject

provide 与 inject实现跨层级组件(祖孙)间通信

<template>
  <h1>父组件</h1>
  <p>当前颜色: {{color}}</p>
  <button @click="color='red'">红</button>
  <Son />
</template>
<script lang="ts">
import { provide, ref } from 'vue'
import Son from './Son.vue'
export default {
  name: 'ProvideInject',
  components: {
    Son
  },
  setup() {
    const color = ref('red')
    provide('color', color)
    return {
      color
    }
  }
}
</script>
<template>
    <h2>子组件</h2>
    <GrandSon />
</template>
<script lang="ts">
import GrandSon from './GrandSon.vue'
export default {
  components: {
    GrandSon
  },
}
</script>
<template>
  <h3 :style="{color}">孙子组件: {{color}}</h3>
</template>
<script lang="ts">
import { inject } from 'vue'
export default {
  setup() {
    const color = inject('color')
    return {
      color
    }
  }
}
</script>

响应式数据的判断

  • isRef: 检查一个值是否为一个 ref 对象
  • isReactive: 检查一个对象是否是由 reactive 创建的响应式代理
  • isReadonly: 检查一个对象是否是由 readonly 创建的只读代理
  • isProxy: 检查一个对象是否是由 reactive 或者 readonly 方法创建的代理

Composition API(常用)<===========================>Composition API(手写)

上一篇下一篇

猜你喜欢

热点阅读