vue3.0hook函数,toRefs以及ref的用法

vue3.0中的hook函数函数目的是将公共的函数抽象到一个文件中,可以在多个组件中复合引用。

hooks用法:
(1)在src目录下新建hooks文件夹,新建一个ts文件

import { computed, defineComponent,onMounted,reactive,ref, watch,watchEffect } from 'vue'

export default function () {
    const x = ref(-2)
    const y = ref(-2)

    const clickhandler = (event:any) => {
        x.value = event.pageX
        y.value = event.pageY
    }

    onMounted(()=>{
        window.addEventListener('click',clickhandler)
    })
    return {
        x,y
    }
}

(2)引用:在要使用的组件中引用即可

import useMousePosition from './hooks/useMouse'

toRefs的作用:可以把一个响应式对象转换成普通对象,该普通对象的每一个属性都是一个ref

如下图所示:想要实现这样的效果
在这里插入图片描述
学过reactive我们可以会这样去实现:

<template>
  <div>
    <h2>torefs的使用</h2>
    <h3>姓名:{{state.name}}</h3>
    <h3>年龄:{{state.age}}</h3>
  </div>
</template>


<script lang="ts">
import { computed, defineComponent,onMounted,reactive,ref, 
toRefs, watch,watchEffect } from 'vue'
export default defineComponent({
    setup(){
      const state = reactive(
        {
          name:'自来也',
          age:14
        }
      )
      return {
        state,
      }
    }
})
</script>

可以看到,标签是这样写的:

<h3>姓名:{{state.name}}</h3>
 <h3>年龄:{{state.age}}</h3>

假如我不想这样是写,我想写成这样

<h3>姓名:{{name}}</h3>
 <h3>年龄:{{age}}</h3>

这个时候就可以用到toRefs了

<template>
  <div>
    <h2>torefs的使用</h2>    
    <h3>姓名:{{name}}</h3>
    <h3>年龄:{{age}}</h3>
  </div>
</template>


<script lang="ts">
import { computed, defineComponent,onMounted,reactive,ref, 
toRefs, watch,watchEffect } from 'vue'

// 引入子集组件
export default defineComponent({
    setup(){
      const state = reactive(
        {
          name:'自来也',
          age:14
        }
      )
      return {
        ...toRefs(state)
      }
    }
})
</script>

ref获取页面中的元素
需求:当页面加载完毕后,可以自动获取文本框的焦点
(1)给页面中的标签绑定ref

<template>
  <div>
    <input type="text" ref="inputref">
  </div>
</template>

(2)在setup中声明ref绑定值


<script lang="ts">
import { computed, defineComponent,onMounted,reactive,ref, 
toRefs, watch,watchEffect } from 'vue'
export default defineComponent({
    setup(){
      // ref是一个HTMLElement,由于setup执行较早,所以给定初始值为null,ref的类型可能是一个HTMLElement 元素,也可能是一个null
      const inputref = ref<HTMLElement | null>(null)
      onMounted(()=> {
        inputref.value&&inputref.value.focus()
      })
      return {
        inputref
      }
    }
})
</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Realistic-er

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

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

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

打赏作者

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

抵扣说明:

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

余额充值