首页 > 其他分享 >Vue学习记录03

Vue学习记录03

时间:2024-11-14 18:43:55浏览次数:3  
标签:count 03 Vue const 记录 对象 value reactive ref

响应式基础

声明响应式状态

ref()

在组合式API中,推荐使用ref()函数来声明响应式状态:

import { ref } from 'vue'

const count = ref(0)

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

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
    }
  }
}

(注意,在模板中使用 ref 时,我们需要附加.value为了方便起见,当在模板中使用时,ref 会自动解包。)

你也可以直接在事件监听器中改变一个 ref:

<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>

以上例子没有使用任何构建工具。

<script setup>

在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>

<script setup>中的顶层的导入、声明的变量和函数可在同一组件的模板中直接使用。你可以理解为模板是在同一作用域内声明的一个 JavaScript 函数——它自然可以访问与它一起声明的所有内容。

深层响应式

Ref 可以持有任何类型的值,包括深层嵌套的对象、数组或者 JavaScript 内置的数据结构,比如Map。

Ref 会使它的值具有深层响应性。这意味着即使改变嵌套对象或数组时,变化也会被检测到:

import { ref } from 'vue'

const obj = ref({
  nested: { count: 0 },
  arr: ['foo', 'bar']
})

function mutateDeeply() {
  // 以下都会按照期望工作
  obj.value.nested.count++
  obj.value.arr.push('baz')
}

Dom更新时机

当你修改了响应式状态时,DOM 会被自动更新。但是需要注意的是,DOM 更新不是同步的。Vue 会在“next tick”更新周期中缓冲所有状态的修改,以确保不管你进行了多少次状态修改,每个组件都只会被更新一次。

要等待 DOM 更新完成后再执行额外的代码,可以使用nextTick() 全局 API:

import { nextTick } from 'vue'

async function increment() {
  count.value++
  await nextTick()
  // 现在 DOM 已经更新了
}

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()也会在内部调用它。

值得注意的是,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

reactive()的局限性

reactive()API有一些局限性:

1.有限的值类型:它只能用于对象类型(对象、数组和如Map、Set这样的集合类型)。他不能持有如string、number、或boolean这样的原始类型。

2.不能替换整个对象:由于 Vue 的响应式跟踪是通过属性访问实现的,因此我们必须始终保持对响应式对象的相同引用。这意味着我们不能轻易地“替换”响应式对象,因为这样的话与第一个引用的响应性连接将丢失。

3.对结构操作不友好:当我们将响应式对象的原始类型属性解构为本地变量时,或者将该属性传递给函数时,我们将丢失响应性连接。

由于这些限制,建议使用ref()作为声明响应式状态的主要 API。

在模板中解包的注意事项

在模板渲染上下文中,只有顶级的 ref 属性才会被解包。

在下面的例子中,const和object是顶级属性,但object.id不是:

const count = ref(0)
const object = { id: ref(1) }

因此,会出现object.id + 1不按照预期工作。

渲染的结果是[object Object]1,因为在计算表达式时object.id没有被解包,仍然是一个ref对象。为了解决这个问题,可以将id解构为一个顶级属性:

const { id } = object
{{ id + 1 }}

另一个需要注意的点是,如果 ref 是文本插值的最终计算值(即{{ }}标签),那么它将被解包,因此一下内容将被渲染为1:

{{ object.id }}

该特性仅仅是文本插值的一个便利特性,等价于{{ object.id.value }}。

标签:count,03,Vue,const,记录,对象,value,reactive,ref
From: https://blog.csdn.net/cwtlw/article/details/143757313

相关文章

  • 基于nodejs+vue资产管理[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景在资产管理领域,国内外已有的研究多集中在宏观的资产配置策略以及大型企业的资产管理模式等方面1。例如,国外在金融资产的量化管理方面取得了诸多成果,通过......
  • 基于nodejs+vue卓越导师双选系统[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于导师与学员双选系统的研究,现有研究主要以传统的人工双选模式为主,专门针对卓越导师双选系统的研究较少。在国内外的教育与人才培养领域,传统双选方式......
  • vue-pdf插件实现文件预览,pdf要实现翻页显示
    <img:src="fileUrl"v-if="type==='jpg'"/><Pdfv-for="iinnumPage":page="i":key="i":src="fileUrl"v-if="type==='pdf'"/>importPdffrom'vu......
  • vue3 中,字段必须在 onShow 前定义?
    在Vue3中,如果你在组件的setup()函数中使用了生命周期钩子,比如onShow,你可能遇到了一个错误,提示你在onShow前定义了某个字段。这个错误通常意味着你尝试在组件的setup()函数中访问了一个在onShow钩子函数被调用之前尚未定义的响应式字段。为了解决这个问题,你需要确保你在......
  • vue3 h函数应用,el-table-v2定义column
    一、引入import{h}from'vue'二、column属性cellRenderer使用h函数h函数中嵌套Element组件Popconfirm{title:'注释',width:165,flexGrow:1,key:"str",dataKey:"str",cellRenderer:({rowData}:any)=>{......
  • cxGrid【过滤、排序】后获取选中记录的值和cxGrid空表判断
    方法一:使用函数GetRowValue此方法在表格过滤、排序后也正常,请注意:此代码顺序需要CXGRID的列顺序和ADOQUERY中SELECT的字段顺序一致,否则会取错。procedureTfrmBillExtraction.pmGetBill_D_DatasClick(Sender:TObject);varI,J:Integer;beginwithcxGDBTV_Bill_M.Data......
  • jenkins打包报错Build step 'Execute shell' marked build as failure Finished: FA
    1、jenkins打包报错  处理方式1、在步骤“Executeshell”命令最上面添加(还是报错)#!/bin/bash2、设置全局配置,添加键和值(还是报错)键:LANG值:zh.CH.UTF-83、设置全局配置,添加键和值(还是报错)键:JAVA_TOOL_OPTIONS值:-Dfile.encoding=UTF-84、cat /usr/lib/systemd/sys......
  • vue实现智能问答助手sse流式请求案例
    使用fetchEventSource内置api,而不是Ajax请求,响应类似于打字机一样,只能在浏览器上使用,小程序不支持;一、下载@microsoft/fetch-event-sourcenpminstall@microsoft/fetch-event-source二、项目引用import{fetchEventSource}from"@microsoft/fetch-event-source";三......
  • stringRedisTemplate 异步操作的问题记录
    一、问题背景StringRedisTemplate使用stringRedisTemplate.opsForValue().set时,会出现set之后立马get获取值,发现获取不到set进去的值。二、问题原因1、在使用redisson的情况下,stringRedisTemplate.opsForValue().set操作会是异步操作,造成。你在set之后,立马get获取值的时候会......
  • (多端小程序网页)茗茶叶销售平台JAVA和vue【毕设源码论文】
      博主介绍:......