【VUE3中使用自定义ref 并封装】太简单了吧!!

需求:我们需要连续不断地输入数据,并且只有当数据输入完成的一秒钟之后,下面的数据才会发生变化

实现响应式所用到的API有ref()与reactive()两种,若实现输入框的数据与显示的数据相一致,我们很本能的就可以想到v-model,但显示是实时变化的,与需求相悖.所以用到自定义Ref.

在这里插入图片描述

v-model实现输入即现实,代码如下:

<template>
  <div class="custom-ref">
    <h2>{{ msg }}</h2>
    <br>
    <input type="text" v-model="msg">
  </div>
</template>
<script setup lang="ts" name="CustomRef">
import { ref, customRef } from 'vue'
const msg = ref('Hello')
</script>
<style scoped>
.custom-ref {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  padding: 20px;
}
</style>

实现延时1s数据显示的需求,封装在hooks中并使用 ,效果图如下:

在这里插入图片描述

页面vue中使用

<template>
  <div class="custom-ref">
    <h2>{{ msg }}</h2>
    <br>
    <input type="text" v-model="msg">
  </div>
</template>
<script setup lang="ts" name="CustomRef">
//引入hooks下的useMsgRef
import useMsgRef from '@/hooks/useMsgRef'
let {msg}= useMsgRef('你好',1000)
</script>
<style scoped>
.custom-ref {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  padding: 20px;
}
</style>

src目录下新建hooks文件夹,在hooks中新建customRef.ts文件::

import {  customRef } from 'vue'
export default function(initVal:string,delay:number){
  let timer:number
  let msg = customRef((track,trigger) => {
    return {
      // 数据msg读取时调用
      get() {
        track() //告诉vue msg变化 就去更新
        return initVal
      },
      // 数据被修改时调用 
      set(val) {
        console.log(val,'set')
        clearTimeout(timer)
        timer =  setTimeout(() =>{
          initVal = val
        trigger() //通知vue 数据msg变化了
        },delay)
      }
    }
  })
  return {msg}
}

写在最后:

追光的人,终会光芒万丈.——《人民日报》

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Vue3的Composition API来封装一个打印组件。 首先,在组件引入`ref`和`toRef`,`ref`用于创建响应式变量,`toRef`用于将一个普通变量转换成响应式变量。 在模板,可以使用`v-if`来控制打印内容的显示与隐藏。 以下是一个简单的打印组件示例: ```html <template> <div> <div v-if="printVisible" ref="printContent"> <!-- 打印内容 --> <slot></slot> </div> <button @click="print">打印</button> </div> </template> <script> import { ref, toRef } from 'vue'; export default { setup() { const printVisible = ref(false); const printContent = toRef(this.$refs, 'printContent'); // 打印 const print = () => { printVisible.value = true; setTimeout(() => { window.print(); printVisible.value = false; }, 100); }; return { printVisible, printContent, print, }; }, }; </script> ``` 上述示例使用`ref`创建了一个名为`printVisible`的响应式变量,用于控制打印内容的显示与隐藏。使用`toRef`将`this.$refs.printContent`转换为响应式变量`printContent`,用于获取打印内容的DOM元素。 在`print`函数,将`printVisible`设置为`true`,显示打印内容,然后使用`setTimeout`延迟100ms,等待DOM更新完成后再执行`window.print()`打印操作。打印完成后,将`printVisible`设置为`false`,隐藏打印内容。 在模板使用`v-if`指令根据`printVisible`的值来控制打印内容的显示与隐藏。`button`元素绑定`click`事件调用`print`函数,触发打印操作。 需要注意的是,该示例只是实现了打印操作,打印内容需要根据实际需求进行自定义。可以通过组件的插槽(slot)来实现自定义打印内容。在组件模板使用`<slot></slot>`标签来定义插槽,然后在使用组件时,通过插槽来传入打印内容。例如: ```html <template> <Print> <h1>打印内容</h1> <p>打印时间:{{ printTime }}</p> </Print> </template> <script> import Print from './Print.vue'; export default { components: { Print, }, data() { return { printTime: new Date().toLocaleString(), }; }, }; </script> ``` 在上述示例使用`<Print>`标签来调用打印组件,同时在组件定义了一个插槽,用于传入打印内容。在打印内容使用了一个数据属性`printTime`来表示打印时间,该属性可以在组件外部定义并传入。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值