vue3中的customRef的基本使用场景(Vue3好玩的API)

ref是自动为其下数据添加响应式,而customRef就是手动为其下数据添加响应式,简单理解就是我们可以手动在vue3数据更新渲染的中间去做一些事情

利用customRef做

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

<template>
    <input type="text" v-model="keyword">
        <h3>{{keyword}}</h3>
    </template>
    <script lang="ts" setup>
    import { customRef, ref } from 'vue'

    function myref(value) {
        let timer
        return customerRef((track, trigger) => {
            return {
                get() {
                    console.log(`从myref容器中读取数据,把初始化数据${value}给他`)
                    // template中,h3里面的keyword是从get中读取的,当set已经将keyword的值修改了,但是h3里面的keyword一直不更新,是因为此处return的value是调用myref时传的初始化实参hello,所以页面不会更新
                    // 所以要先在get里面调用customRef的track方法去追踪。再在set里面设置修改 value = newValue,然后还要调用customRef里面的trigger方法去通知页面更新
                    track()
                    return value
                },
                set(newValue) {
                    console.log(`将myref容器中的数据修改,修改成:${value}`) 
                    // 定时器是异步的,如果不清除定时器,会有bug,每次执行修改数据时,会卡顿,所以要清除定时器
                    clearTimeout(timer)
                    timer = setTimeout(() => {
                        value = newvalue
                        trigger()   // 通知vue去重新解析模板
                    })
                   
                }
            }
        })
    }
    let keyword = myref('hello')    // 使用自定义的ref
</script>

应用场景

防抖函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

<template>
  <input
    v-model="text"
  >
</template>

<script setup lang="ts">
import { customRef } from 'vue'
function useDebouncedRef<T> (value: T, delay: number) {
  let timer: any = null
  return customRef<T>((track, trigger) => ({
    get () {
      track()
      return value
    },
    set (newValue) {
      clearTimeout(timer)
      timer = setTimeout(() => {
        value = newValue
        // ...do something
        trigger()
      }, delay)
    }
  }))
}

const text = useDebouncedRef<string>('', 2000)
</script>

加强版的计算属性computed

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

<template>
  <el-slider
    v-model="value"
    @change="handleSlider"
  />
</template>

<script setup lang="ts">
import { customRef } from 'vue'

function useDebouncedRef<T> (value: T) {
  return customRef<T>((track, trigger) => ({
    get () {
      track()
      return value
    },
    set (newValue) {
      value = newValue
      trigger()
    }
  }))
}

const value = useDebouncedRef<number>(0)

function handleSlider (e: number) {
  value.value = e
}
</script>

<style lang="scss" scoped>
</style>

更多

网上还有人通过这个做输入框v-model的双向数据绑定优化,在数据绑定过程中使用customRef进行数据做敏感词处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3APIVue2有些不同,以下是一些常用的Vue3 API使用方法: 1. `createApp`: 用于创建Vue实例,接收一个根组件作为参数。 ``` import { createApp } from 'vue' import App from './App.vue' const app = createApp(App) app.mount('#app') ``` 2. `ref`: 用于创建响应式数据,可以在模板和JSX使用。 ``` import { ref } from 'vue' const count = ref(0) console.log(count.value) // 0 count.value++ console.log(count.value) // 1 ``` 3. `computed`: 用于创建计算属性,可以在模板和JSX使用。 ``` import { computed } from 'vue' const count = ref(0) const doubleCount = computed(() => count.value * 2) console.log(doubleCount.value) // 0 count.value++ console.log(doubleCount.value) // 2 ``` 4. `watch`: 用于监听数据的变化。 ``` import { watch } from 'vue' const count = ref(0) watch(count, (newVal, oldVal) => { console.log(`count changed from ${oldVal} to ${newVal}`) }) count.value++ // count changed from 0 to 1 ``` 5. `onMounted`: 用于在组件挂载后执行一些操作。 ``` import { onMounted } from 'vue' onMounted(() => { console.log('mounted') }) ``` 6. `onUnmounted`: 用于在组件卸载前执行一些操作。 ``` import { onUnmounted } from 'vue' onUnmounted(() => { console.log('unmounted') }) ``` 7. `watchEffect`: 用于监听响应式数据的变化并执行一些操作。 ``` import { watchEffect } from 'vue' const count = ref(0) watchEffect(() => { console.log(`count is ${count.value}`) }) count.value++ // count is 1 ``` 以上是一些常用的Vue3 API使用方法,更多API可以查看官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值