vue ref介绍

本文详细解析Vue.js中ref的三种用法,包括如何通过ref获取DOM元素和组件实例,以及如何利用v-for和ref获取一组数组或DOM节点。同时,深入探讨$attrs在父子组件间未定义prop值的传递作用。

基本用法

ref 有三种用法:

1、ref 加在普通的元素上,用this.ref.name 获取到的是dom元素

2、ref 加在子组件上,用this.ref.name 获取到的是组件实例,可以使用组件的所有方法。

3、如何利用 v-for 和 ref 获取一组数组或者dom 节点
  在这里插入图片描述
  
  第1,2种情况
  this.$refs 获取了所有设置ref属性的元素(如有重名那么会被覆盖)
  如果是普通的元素那返回的是一个普通的dom,如果ref放在vue组件里,那么返回的是一个vue对象,这个对象包含了这个组件的各种信息
  
  第3种情况
  在这里插入图片描述
  在这里插入图片描述

如图所示这样使用
this.$refs.g1 获取得是vue组件对象的集合,就不覆盖了

$attrs

父子之间值传递,我们一般用的是在属性里设置,采用:prop="prop"的格式
在子级的props定义接受,然后可以直接使用,
若props里没有定义,那么可以使用this.$attrs里获取没有定义的值,

如下图
在这里插入图片描述
图中定义了3个属性(v-model也是个特殊的属性,在props中可以用 value来接收)
在这里插入图片描述
那$attrs的值是什么呢?
在这里插入图片描述
是除了props里已经定义接收了的传值, 就剩下了grand-id这个属性

如果还有孙子级的组件, 我们还可以用

v-bind="$attrs"

这种方式再次传递到孙子级的页面,孙子级仍然可以使用props来获取。如果不使用props,那么还可以依旧使用this.$attrs来获取,
这个相当于搭了个桥,
在这里插入图片描述

如上图所示,this.attrs里面为grandId:1,我们使用v−bind="this.attrs里面为{grandId:1}, 我们使用v-bind="this.attrsgrandId:1,使vbind="this.attrs" 同等于 v-bind:grandId=“1”.这是只有一个属性值,所以差别不大,如果有多个属性值,那就不需要我们写了。直接借你一用,把各个需要传递给子孙级的数据,直接传到了目的地

语法糖的问题

在看同事代码的时候,发现在改变子级元素的值的时候,直接去改变了父级的值。没有用vuex,没有用emit。

其实还是用了emit,只是一些语法糖

v-model
在这里插入图片描述
在这里插入图片描述
如上面所展示代码
用v-model绑定了元素,在子级里面props接收到了value的值。
用该值初始化了inputValue,并监听emit了一个input事件。
在第一幅图里 v-model里绑定的值,也跟着改变了。

相当于
在这里插入图片描述
还是相当于在父级上绑上了一个事件,只是为了简单写法,省略一些东西

.sync
普通属性呢?其实也有一种简单的写法。

<template>
  <div class="dashboard-container">
    {{ object }}
    <text1 v-model="object.v" :changep.sync="object.p" />
  </div>
</template>

<script>

import text1 from './text'

export default {
  components: {
    text1
  },
  data() {
    return {
      object: {
        v: 1,
        p: 2
      }

    }
  }
}
</script>


<!--
 * @Author: hanker
 * @LastEditors: hanker
 * @Description:
-->
<template>
  <div class="">
    <el-input v-model="inputValue" />
    <el-button @click="clickHandle">点击改变p</el-button>
  </div>
</template>

<script>
// import x from ''
export default {
  components: {

  },
  props: {

  },
  data() {
    return {
      inputValue: this.value
    }
  },
  computed: {

  },
  watch: {
    inputValue(newValue) {
      this.$emit('input', newValue)
    }
  },
  mounted() {

  },
  methods: {
    clickHandle() {
      const p = '改变了对应的p'
      this.$emit('update:changep', p)
    }
  }
}
</script>

<style lang='scss' scoped>
//@import url()

</style>

在看一些vue开源的后台管理系统的时候,常常看到这些快捷写法,大家不要慌。百度一下,完事大吉

Vue 3 中,`ref` 是一个用于创建响应式数据的函数,它可以用于基本类型(如 `number`、`string`、`boolean`)和复杂类型(如 `object`、`array`)[^2]。当使用 `ref` 时,可以通过显式指定类型来增强类型安全性,特别是在使用 TypeScript 的项目中。 ### 指定类型的基本用法 ```typescript import { ref } from 'vue'; // 显式指定类型 const count: Ref<number> = ref<number>(0); const name: Ref<string> = ref<string>('John'); // 修改 ref 的值 count.value++; name.value = 'Jane'; // 输出当前值 console.log(count.value); // 1 console.log(name.value); // Jane ``` 在上面的代码中,`Ref<number>` 和 `Ref<string>` 是 Vue 提供的泛型类型,用于指定 `ref` 的值类型[^3]。 ### 类型推导 如果你不显式指定类型,Vue 3 会根据传入的初始值自动推导类型: ```typescript const age = ref(25); // 类型自动推导为 Ref<number> const title = ref('Vue 3'); // 类型自动推导为 Ref<string> ``` 这种类型推导方式在大多数情况下足够使用,但在某些场景下(如需要更严格的类型控制),显式指定类型会更加安全可靠[^3]。 ### 使用 ref 获取组件实例并指定类型 在 Vue 3 中,`ref` 还可以用来获取组件实例。为了在 TypeScript 中获得组件实例的类型信息,可以使用泛型来指定组件类型: ```typescript import { ref } from 'vue'; import MyComponent from './MyComponent.vue'; // 使用 ref 获取组件实例并指定类型 const componentRef = ref<InstanceType<typeof MyComponent>>(); // 在模板中绑定 ref // <MyComponent ref="componentRef" /> ``` 通过 `InstanceType<typeof MyComponent>`,可以确保 `componentRef` 具有正确的类型定义,从而支持更精确的类型检查和自动补全功能[^4]。 ### 封装带类型支持的 ref 工具函数 为了在多个组件中复用类型安全的 `ref` 创建逻辑,可以封装一个工具函数: ```typescript import { ref, Ref, InstanceType } from 'vue'; /** * 创建一个具有类型标注的 ref * @returns Ref<T> */ export const useTypedRef = <T>() => { return ref<T>(); }; /** * 创建一个用于组件实例的 ref * @param component 组件构造函数 * @returns Ref<InstanceType<T>> */ export const useComponentRef = <T extends abstract new (...args: any) => any>(component: T) => { return ref<InstanceType<T>>(); }; ``` 通过这种方式,可以在多个组件中复用带有类型支持的 `ref`,并保持代码的整洁性和可维护性。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值