Vue3响应式基础——ref()和reactive()

一、ref()

         ref() 接收参数,并将其包裹在一个带有 .value 属性的 ref 对象中返回:

import { ref } from 'vue'

const count = ref(0)

console.log(count) // { value: 0 }
console.log(count.value) // 0

count.value++
console.log(count.value) // 1

        要在组件模板中访问 ref,请先从组件的 setup() 函数中声明并返回它们:

import { ref } from 'vue'

export default {
  // `setup` 是一个特殊的钩子,专门用于组合式 API。
  setup() {
    const count = ref(0)

    // 将 ref 暴露给模板
    return {
      count
    }
  }
}

        在模版html中使用。注意,在模板中使用 ref 时,我们不需要附加 .value

<div>{{ count }}</div>

        我们也可以绑定一个事件来在模版中直接改变这个值,如下:

<button @click="count++">
  {{ count }}
</button>

        对于更复杂的逻辑,我们可以在同一作用域内声明更改 ref 的函数,并将它们作为方法与状态一起公开: 

import { ref } from 'vue'

export default {
  setup() {
    const count = ref(0)

    function increment() {
      // 在 JavaScript 中需要 .value
      count.value++
    }

    // 不要忘记同时暴露 increment 函数
    return {
      count,
      increment
    }
  }
}

        暴露的方法可以被用作事件监听器:

<button @click="increment">
  {{ count }}
</button>

        此时,我们会发现在 setup() 函数中手动暴露大量的状态和方法非常繁琐。幸运的是,我们可以通过使用单文件组件 (SFC) 来避免这种情况。我们可以使用 <script setup> 来大幅度地简化代码: 

<script setup>
import { ref } from 'vue'

const count = ref(0)

function increment() {
  count.value++
}
</script>

<template>
  <button @click="increment">
    {{ count }}
  </button>
</template>

二、reactive()

        另一种声明响应式状态的方式,即使用 reactive() API。与将内部值包装在特殊对象中的 ref 不同,reactive() 将使对象本身具有响应性:

import { reactive } from 'vue'

const state = reactive({ count: 0 })

        在模板中使用:

<button @click="state.count++">
  {{ state.count }}
</button>

        响应式对象是 JavaScript 代理,其行为就和普通对象一样。不同的是,Vue 能够拦截对响应式对象所有属性的访问和修改,以便进行依赖追踪和触发更新。

        reactive() 将深层地转换对象:当访问嵌套对象时,它们也会被 reactive() 包装。当 ref 的值是一个对象时,ref() 也会在内部调用它。与浅层 ref 类似,这里也有一个 shallowReactive() API 可以选择退出深层响应性。

        值得注意的是,reactive() 返回的是一个原始对象的 Proxy,它和原始对象是不相等的:

const raw = {}
const proxy = reactive(raw)

// 代理对象和原始对象不是全等的
console.log(proxy === raw) // false

        只有代理对象是响应式的,更改原始对象不会触发更新。因此,使用 Vue 的响应式系统的最佳实践是仅使用你声明对象的代理版本

        为保证访问代理的一致性,对同一个原始对象调用 reactive() 会总是返回同样的代理对象,而对一个已存在的代理对象调用 reactive() 会返回其本身:

// 在同一个对象上调用 reactive() 会返回相同的代理
console.log(reactive(raw) === proxy) // true

// 在一个代理上调用 reactive() 会返回它自己
console.log(reactive(proxy) === proxy) // true

        这个规则对嵌套对象也适用。依靠深层响应性,响应式对象内的嵌套对象依然是代理:

const proxy = reactive({})

const raw = {}
proxy.nested = raw

console.log(proxy.nested === raw) // false

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你好!感谢您的提问。关于 vue2.6.12 版本的使用问题,下面是详细的回答: 1. 使用 refVue2 中,通过 ref() 函数可以获取 DOM 元素或组件实例的引用。具体使用方法如下: ``` <template> <div ref="myDiv">这是一个 div 元素</div> </template> <script> export default { mounted() { console.log(this.$refs.myDiv); // 输出获取到的 DOM 元素 } } </script> ``` 上述代码中,我们在模板中使用 ref 将一个 div 元素的引用命名为“myDiv”,然后在 mounted 生命周期钩子中通过 this.$refs.myDiv 获取到该元素的引用。 2. 使用 reactiveVue2 中,通过 reactive() 函数可以将一个普通对象转换为响应式对象,并进行数据劫持。具体使用方法如下: ``` <script> import { reactive } from 'vue'; export default { setup() { const state = reactive({ count: 0 }); function increment() { state.count++; } return { state, increment }; } } </script> ``` 上述代码中,我们在 setup 函数中使用 reactive 将一个普通对象转换为响应式对象,并返回了两个属性:state 和 increment。在组件中可以通过 state.count 访问 count 属性,通过 increment 函数进行修改。 3. 使用 onMounted 在 Vue2 中,通过 onMounted() 生命周期函数可以在组件挂载后执行一些操作。具体使用方法如下: ``` <script> import { onMounted } from 'vue'; export default { setup() { onMounted(() => { console.log('组件挂载完成!'); }); return {}; } } </script> ``` 上述代码中,我们在 setup 函数中使用 onMounted 函数定义一个组件挂载后要执行的操作——输出一句话“组件挂载完成!”。这样就可以在组件挂载后自动执行这段代码了。 希望以上回答对您有帮助!如果您还有其他问题,可以继续提出。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

前端小菜凯

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

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

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

打赏作者

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

抵扣说明:

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

余额充值