Vue3学习其他常用CompositionAPI

目录

1、shallowReactive和shallowRef

2、readonly和shallowReadonly

3、toRaw与markRaw

4、customRef

5、provide与inject

6、响应式数据的判断


1、shallowReactive和shallowRef

  • shallowReactive:只处理对象外层数据响应式(浅响应式)
  • shallowRef:只处理基本数据类型的响应式,不进行对象的响应式处理。
  • 什么时候使用?
    • 如果有一个对象数据,结构比较深,但变化时只是外层属性变化===>shallowReactive
    • 如果有一个对象数据,后续功能不会修改该对象中的属性,而是生新的对象来替换===>shallowRef

2、readonly和shallowReadonly

  • readonly:让一个响应式数据变为只读的(深只读)。
  • shallowReadonly:让一个响应式数据变为只读的(浅只读)。
  • 应用场景:不希望数据被修改时。

3、toRaw与markRaw

  • toRaw:
    • 作用:将一个由Reactive生成的响应式对象转为普通对象
    • 使用场景:用于读取响应式对象对应的普通对象,对这个普通对象的所有操作,不会引起页面更新。
  • markRaw:
    • 作用:标记一个对象,使其永远不会再成为响应式对象。
    • 应用场景:
    1. 有些值不应被设置为响应式的,例如复杂的第三方类库等。
    2. 当渲染具有不可变数据源的大列表时,跳过响应式转换可以提高性能。

4、customRef

  • 作用:创建一个自定义的ref,并对其依赖项跟踪和更新触发进行显式控制。
  • 实现防抖效果
<template>
  <div>
    <input type="text"
           v-model="keyWord">
    <h3>{{keyWord}}</h3>
  </div>
</template>

<script>
import { ref, customRef } from 'vue';
export default {
  name: 'Demo',
  setup () {
    // 自定义一个ref——名为:myRef
    function myRef (value, delay) {
      let timer
      // track追踪
      //trigger 触发
      return customRef((track, trigger) => {
        return {
          get () {
            track()//通知Vue追踪value的变化(提前和get商量一下,让他认为这个value是有用的)
            return value
          },
          set (newVal) {
            clearTimeout(timer)
            timer = setTimeout(() => {
              value = newVal
              trigger() //通知Vue去重新解析模板
            }, delay)
          }
        }
      })
    }

    // let keyWord = ref('hello')  //使用Vue提供的ref
    let keyWord = myRef('hello', 500)  //使用自定义的ref

    return {
      keyWord
    }
  }
}
</script>

<style>
</style>

5、provide与inject

  • 作用:实现祖与后代组件间通信
  • 套路:父组件有一个provide选项来提供数据,后代组件有一个inject选项来开始使用这些数据
  • 具体写法:
  1. 祖组件中:
setup(){
    //....
    let car = reactive({name:'奔驰',price:'40万'})
    provide('car',car)
    //...
}

     2.后代组件中:

setup(props,context){
    //......
    const car = inject('car')
    return {car}
    //......
}
  • 注意事项:

如果我们尝试在此处 provide 一些组件的实例 property,这将是不起作用:

app.component('todo-list', {
  data() {
    return {
      todos: ['Feed a cat', 'Buy tickets']
    }
  },
  provide: {
    todoLength: this.todos.length // 将会导致错误 `Cannot read property 'length' of undefined`
  },
  template: `
    ...
  `
})

要访问组件实例 property,我们需要将 provide 转换为返回对象的函数:

app.component('todo-list', {
  data() {
    return {
      todos: ['Feed a cat', 'Buy tickets']
    }
  },
  provide() {
    return {
      todoLength: this.todos.length
    }
  },
  template: `
    ...
  `
})

6、响应式数据的判断

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

7、Composition API存在的优势

1.Option API 存在的问题(Vue2.x

使用传统OptionsAPI中,新增或者修改一个需求,就需要分别在data,methods,computed里修改

2.Composition API 的优势 (Vue3.x)

我们可以更加优雅的组织我们的代码,函数。让相关功能的代码更加有序的组织在一起。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值