Vue3 ref属性

ref()

接受一个内部值,返回一个响应式的、可更改的 ref 对象,此对象只有一个指向其内部值的属性 .value。

function ref<T>(value: T): Ref<UnwrapRef<T>>

interface Ref<T> {
  value: T
}

详细信息

  1. ref 对象是可更改的,也就是说你可以为 .value 赋予新的值。它也是响应式的,即所有对 .value 的操作都将被追踪,并且写操作会触发与之相关的副作用。
  2. 如果将一个对象赋值给 ref,那么这个对象将通过 reactive() 转为具有深层次响应式的对象。这也意味着如果对象中包含了嵌套的 ref,它们将被深层地解包。
  3. 若要避免这种深层次的转换,请使用 shallowRef() 来替代。

示例

import { ref, defineComponent } from 'vue';
export default defineComponent ({
  setup () {
    const valueNumber = ref(0);
    const valueString = ref('hello world!');
    const valueBoolean = ref(true);
    const valueNull = ref(null);
    const valueUndefined = ref(undefined);

    console.log(valueNumber.value) // 0
    valueNumber.value++
    console.log(valueNumber.value) // 1

    return {
      valueNumber,
      valueString,
      valueBoolean,
      valueNull,
      valueUndefined
    };
  }
});

在template中访问ref创建的响应式数据

import { ref } from 'vue';
export default {
  setup () {
    const value = ref(1);

    return {
      value,
      msg: 'hello world!'
    };
  }
};
<template>
  <p>
    {
  { value }} {
  { msg }}
  </p>
</template>

为ref()标注类型

ref 会根据初始化时的值推导其类型:

import { ref } from 'vue'

// 推导出的类型:Ref<number>
const year = ref(2020)

// => TS Error: Type 'string' is not assignable to type 'number'.
year.value = '2020'

有时我们可能想为 ref 内的值指定一个更复杂的类型,可以通过使用 Ref 这个类型:

import { ref } from 'vue'
import type { Ref } from 'vue'

const year: Ref<string | number> = ref('2020')

year.value = 2020 // 成功!

或者,在调用 ref() 时传入一个泛型参数,来覆盖默认的推导行为:

// 得到的类型:Ref<string | number>
const year = ref<string | number>('2020')

year.value = 2020 // 成功!

如果你指定了一个泛型参数但没有给出初始值,那么最后得到的就将是一个包含 undefined 的联合类型:

// 推导得到的类型:Ref<number | undefined>
const n = ref<number>()

作为程序员,持续学习和充电非常重要,作为开发者,我们需要保持好奇心和学习热情,不断探索新的技术,只有这样,我们才能在这个快速发展的时代中立于不败之地。低代码也是一个值得我们深入探索的领域,让我们拭目以待,它将给前端世界带来怎样的变革,推荐一个低代码工具。

应用地址: https://www.jnpfsoft.com
开发语言:Java/.net

这是一个基于Flowable引擎(支持java、.NET),已支持MySQL、SqlServer、Oracle、PostgreSQL、DM(达梦)、 KingbaseES(人大金仓)6个数据库,支持私有化部署,前后端封装了上千个常用类,方便扩展,框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用。

至少包含表单建模、流程设计、报表可视化、代码生成器、系统管理、前端 UI 等组件,这种情况下我们避免了重复造轮子,已内置大量的成熟组件,选择合适的组件进行集成或二次开发复杂功能,即可自主开发一个属于自己的应用系统。

### Vue 3 中 `ref` 属性的使用方法 在 Vue 3 中,`ref` 是一种非常重要的工具,它既可以用来定义响应式的变量,也可以用于绑定 DOM 元素或子组件实例。以下是关于 `ref` 的具体用法和示例。 #### 响应式数据的创建 当需要创建一个响应式的简单值时,可以使用 `ref()` 函数。此函数会返回一个带有 `.value` 属性对象,该属性保存着实际的数据值[^1]。 ```javascript <script setup> import { ref } from &#39;vue&#39;; const count = ref(0); function increment() { count.value++; // 需要通过 .value 访问并修改内部值 } </script> <template> <div> <p>当前计数: {{ count }}</p> <button @click="increment">增加</button> </div> </template> ``` 上述代码中,`count` 是由 `ref` 定义的一个响应式变量,其初始值为 `0`。点击按钮时调用了 `increment` 方法,从而更新了 `count` 的值。 --- #### 绑定到 DOM 元素 除了作为响应式数据外,`ref` 还能直接绑定到模板中的 DOM 元素上。这样,在组件挂载完成后就可以通过 `ref` 获取对应的 DOM 实例[^2]。 ```html <template> <div> <input type="text" ref="textInput"> <button @click="focusInput">聚焦输入框</button> </div> </template> <script setup> import { ref, onMounted } from &#39;vue&#39;; const textInput = ref(null); onMounted(() => { console.log(textInput.value); // 输出:<input type="text"> }); function focusInput() { textInput.value.focus(); // 调用原生 DOM 方法使输入框获得焦点 } </script> ``` 在这个例子中,`textInput` 是指向 `<input>` 元素的引用。通过 `onMounted` 生命周期钩子或者自定义事件处理程序,我们可以轻松地操作这个 DOM 元素[^3]。 --- #### 子组件通信 如果希望父组件能够访问某个子组件的方法或状态,则可以在子组件标签上设置 `ref` 并利用 `$refs` 来实现跨组件交互[^4]。 **子组件 (ChildComponent.vue):** ```javascript <script setup> export function changeMsg() { alert(&#39;消息已更改&#39;); } </script> ``` **父组件 (ParentComponent.vue):** ```html <template> <div> <child-component ref="child"></child-component> <button @click="callChildMethod">调用子组件方法</button> </div> </template> <script> import ChildComponent from &#39;./ChildComponent.vue&#39;; export default { components: { ChildComponent }, methods: { callChildMethod() { this.$refs.child.changeMsg(); } } }; </script> ``` 这里展示了如何借助 `this.$refs.child` 来触发子组件内的逻辑功能。 --- ### 小结 综上所述,Vue 3 提供了灵活多样的方式去运用 `ref` 属性——无论是管理基础类型的响应式数据还是深入控制页面上的 HTML 结构乃至与其他组件建立联系都变得更为简便高效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值