Vue3详解ref()用法

在Vue3中对Object等复杂数据类型变为响应式数据使用 reactive(),对于Number、String、Boolean、undefined、null等基本数据类型使用 ref() 变为响应式数据。

ref( ) 接受一个内部值,返回一个ref 对象,这个对象是响应式的、可更改的,且只有一个指向其内部值的属性 .value。ref() 将传入参数的值包装为一个带 .value 属性的 ref 对象。ref 对象是可更改的,即可以为 .value 赋予新的值.

const num = ref(1);
// 为 num.value 赋予新的值
num.value = 2;
console.log("num.value--->", num.value);
ref 对象是响应式的,即所有对 .value 的操作都将被追踪,并且写操作会触发与之相关的副作用。ref()方法允许创建可以使用任何值类型的响应式 ref。ref 的 .value 属性也是响应式的。当ref的值为对象类型时,会用 reactive() 自动转换它的 .value。

举例:一个包含对象类型值的 ref 可以响应式地替换整个对象

const obj = ref({ name: 'vue3' });
// 响应式替换
obj.value = { name: 'vite' };
console.log("obj--->", obj);
console.log("obj.value--->", obj.value);

ref 被传递给函数或是从一般对象上被解构时,不会丢失响应性:

const obj = {
  foo: ref(0),
  bar: ref(1)
}
// 仍然是响应式的
const { foo, bar } = obj;

当 ref 在模板中作为顶层属性被访问时,它们会被自动“解包”,所以不需要使用 .value。

<script setup>
import { ref } from 'vue';
const num= ref(1);
</script>
<template>
  <!-- 无需 .value -->
  <div>num:{{ num }}</div>
</template>

 通过 ref 可以访问到在组件中定义的 DOM 元素,例如:input、div、img 等。可以使用 $refs 属性访问到这些元素。

<template>
  <div>
    <input ref="myInput" type="text">
    <button @click="focusInput">Focus Input</button>
  </div>
</template>
 
<script>
import { ref } from 'vue'
export default {
  setup() {
    const myInput = ref(null)
    function focusInput() {
      myInput.value.focus()
    }
 
    return {
      myInput,
      focusInput
    }
  }
}
</script>

reative() 底层使用的是Proxy代理的方式。那 ref() 呢?

我们都知道Proxy的代理目标必须是非原始值(Object),所以我们没有任何手段拦截对原始值的操作.vue3 中对Ref的实现基本没有太大改变,也是利用settergetter对数据实现数据劫持,

源码ref:

源码路径:packages/reactivity/src/ref.ts

class RefImpl<T> {
  private _value: T
  private _rawValue: T

  public dep?: Dep = undefined
  public readonly __v_isRef = true

  constructor(value: T, public readonly __v_isShallow: boolean) {
    this._rawValue = __v_isShallow ? value : toRaw(value)
    this._value = __v_isShallow ? value : toReactive(value)
  }

  get value() {
    trackRefValue(this)
    return this._value
  }

  set value(newVal) {
    newVal = this.__v_isShallow ? newVal : toRaw(newVal)
    if (hasChanged(newVal, this._rawValue)) {
      this._rawValue = newVal
      this._value = this.__v_isShallow ? newVal : toReactive(newVal)
      triggerRefValue(this, newVal)
    }
  }
}
ref 作用及用法
  • 参数可以为任意类型,推荐使用基本类型
  • 使用时 需要通过 xxx.value 的形式获取
  • 本质是拷贝粘贴一份数据,脱离了与源数据的交互
  • 将对象中属性变成响应式数据,修改该数据是不会影响到源数据,但是会更新视图
  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3 提供了多种组件通信的方法,包括 Props、事件、Provide/Inject、$attrs/$listeners、Ref、Custom Events 等。下面我会逐一详细介绍这些方法。 1. Props:通过向子组件传递属性值来实现父子组件之间的通信。父组件可以通过 props 属性将数据传递给子组件,并在子组件中使用。子组件通过 props 接收父组件传递的数据,并进行相应的处理。 2. 事件:父组件可以通过自定义事件的方式向子组件传递数据。子组件通过 $emit 方法触发事件,并将数据作为参数传递给父组件。父组件通过在子组件上监听自定义事件,并在事件处理函数中接收子组件传递的数据。 3. Provide/Inject:父组件可以通过 provide 方法提供数据,然后在子组件中通过 inject 方法注入数据。这种方式可以实现跨层级的组件通信,但是不推荐在大型项目中过度使用。 4. $attrs/$listeners:$attrs 用于获取父组件传递给子组件的非 prop 属性,$listeners 用于获取父组件传递给子组件的事件。这两个属性可以使得子组件可以接收父组件的所有属性和事件,从而简化了父子组件之间的通信。 5. RefRef 是一个特殊的对象,可以被用于在组件之间共享可变的状态。通过 ref 函数创建一个 ref 对象,并将其传递给子组件。子组件可以通过 .value 来访问和修改 ref 对象的值。 6. Custom Events:在 Vue 3 中,自定义事件可以通过创建一个新的事件实例,并使用 $on 和 $emit 方法进行监听和触发。这种方法可以实现更灵活的组件通信方式。 以上就是一些 Vue 3 中常用的组件通信方法。根据具体的场景和需求,选择合适的方法来实现组件之间的通信。希望能对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值