Vue3基础(十er)___customRef

简介: 这篇文章介绍了Vue3中的`ref`和`customRef`用法,通过示例展示了如何使用它们来创建响应式数据,并提供了一个优化示例来防止短时间内多次点击按钮导致的问题。

ref

ref生成的响应式数据,当想改变的时候,需要.value

<template >
  <div class="container">
    <p>strNum {
   {
   strNum}}</p>
    <button @click="changeStrNum">改变 strNum</button>
  </div>
</template>
<script>
import {
    ref, customRef } from "vue";
export default {
   
  setup() {
   
    let strNum = ref({
    age: 19 });
    const changeStrNum = () => {
   
      strNum.value.age++;
    };
    return {
    changeStrNum, strNum };
  }
};
</script>
<style  scoped>
</style>

customRef

customRef可以生成一个ref变量,传入一个回调函数,返回对象,有get、set属性,使用响应的方法来追踪数据、更新页面。

<template >
  <div class="container">
    <p>myNum {
   {
   myNum}}</p>
    <button @click="changeMyNum">改变 myNum</button>
  </div>
</template>
<script>
import {
    ref, customRef } from "vue";
function myRef(value) {
   
  return customRef((track, trigger) => {
   
    return {
   
      get() {
   
        track();
        console.log("获取值",value)
        return value;
      },
      set(newValue) {
   
        value = newValue;
        console.log("被重新赋值哦",newValue);
        trigger();
      }
    };
  });
}
export default {
   
  setup() {
   
    let myNum = myRef("0");
    const changeMyNum=()=>{
   
      myNum.value ='123456'
    }
    return {
    myNum,changeMyNum };
  }
};
</script>
<style  scoped>
</style>

在这里插入图片描述
页面渲染的时候调用myNum的get方法。
点击按钮:
在这里插入图片描述
先set然后再get。
看一下数据结构
在这里插入图片描述
所以我们可以使用sustomRef来自己定义ref的get、set做处理。
优化:

<template >
  <div class="container">
    <p>myNum {
   {
   myNum}}</p>
    <button @click="changeMyNum">改变 myNum</button>
  </div>
</template>
<script>
import {
    ref, customRef } from "vue";
function myRef(value) {
   
  let timeOut = null;
  return customRef((track, trigger) => {
   
    return {
   
      get() {
   
        track();
        console.log("获取值", value);
        return value;
      },
      set(newValue) {
   
        if (!timeOut) {
   
          timeOut = setTimeout(() => {
   
            value = newValue;
            console.log("被重新赋值哦", newValue);
            trigger();
            timeOut = null;
          }, 1000);
        }
      }
    };
  });
}
export default {
   
  setup() {
   
    let myNum = myRef("0");
    console.log(myNum, "myNum");
    const changeMyNum = () => {
   
      myNum.value = "123456";
    };
    return {
    myNum, changeMyNum };
  }
};
</script>
<style  scoped>
</style>

防止按钮短时间内多次点击。

目录
相关文章
|
4月前
|
JavaScript
vue-cli创建vue3+ts项目
vue-cli创建vue3+ts项目
60 0
|
4月前
|
JavaScript
VUE3(三十七)Vue3.2子父组件交互(vue、ts不分离)~
VUE3(三十七)Vue3.2子父组件交互(vue、ts不分离)~
101 0
|
12月前
|
前端开发 JavaScript API
vue3-ts-storybook:理解storybook、实践 / 前端组件库
vue3-ts-storybook:理解storybook、实践 / 前端组件库
389 0
|
4月前
|
JavaScript 前端开发
vue3+ts项目搭建
vue3+ts项目搭建
66 1
|
4月前
|
JavaScript 前端开发 数据库
VUE3(三十八)Vue3.2子父组件交互(vue、ts分离)
VUE3(三十八)Vue3.2子父组件交互(vue、ts分离)
179 0
|
11月前
|
JavaScript 前端开发 中间件
从0开始搭建Vue3+Ts项目(1)
从0开始搭建Vue3+Ts项目(1)
|
11月前
|
存储
【Vue3】vue3 + ts 封装城市选择组件
【Vue3】vue3 + ts 封装城市选择组件
107 0
Vue2向Vue3过度Vuex核心概念module模块1
Vue2向Vue3过度Vuex核心概念module模块1
74 0
|
JSON 数据格式
Vue2向Vue3过度Vuex核心概念module模块2
Vue2向Vue3过度Vuex核心概念module模块2
65 0