Vue3基础(十er)___customRef

75 篇文章 17 订阅

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>

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

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

六卿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值