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

Vue学习记录04

时间:2024-11-14 20:17:22浏览次数:3  
标签:Vue 04 记录 author books 计算 模板 属性

计算属性

模板中的表达式虽然方便,但也只能用来做简单的操作。如果在模板中写太多逻辑,会让模板变得臃肿,难以维护。比如说,我们有这样一个包含嵌套数组的对象:

const author = reactive({
  name: 'John Doe',
  books: [
    'Vue 2 - Advanced Guide',
    'Vue 3 - Basic Guide',
    'Vue 4 - The Mystery'
  ]
})

我们想根据author是否已有一些书籍来展示不同的信息:

<p>Has published books:</p>
<span>{{ author.books.length > 0 ? 'Yes' : 'No' }}</span>

这样的模板看起来有些负责,不能直接明白它的计算依赖于author.books,如果要重复使用,这样的模板还要重复好多遍,使得可读性变得更低。

因此推荐使用计算属性来描述依赖响应式状态的复杂逻辑。

<script setup>
import { reactive, computed } from 'vue'

const author = reactive({
  name: 'John Doe',
  books: [
    'Vue 2 - Advanced Guide',
    'Vue 3 - Basic Guide',
    'Vue 4 - The Mystery'
  ]
})

// 一个计算属性 ref
const publishedBooksMessage = computed(() => {
  return author.books.length > 0 ? 'Yes' : 'No'
})
</script>

<template>
  <p>Has published books:</p>
  <span>{{ publishedBooksMessage }}</span>
</template>

这里定义了一个计算属性publishedBooksMessage。computed()方法期望接收一个 getter 函数,返回值为一个计算属性ref。和其他一般的ref类似,可以通过publishedBooksMessage.value访问计算结果。计算属性ref也会在模板中自动解包,因此在模板中引用时无需添加.value。

Vue的计算属性会自动跟踪响应式依赖。它会检测到publishedBooksMessage依赖于author.books,所以当author.books改变时,任何依赖于publishedBooksMessage的绑定都会同时更新。

计算属性缓存和方法的区别

如果我们在表达式中像这样调用一个函数也会获得和计算属性相同的结果:

<p>{{ calculateBooksMessage() }}</p>
// 组件中
function calculateBooksMessage() {
  return author.books.length > 0 ? 'Yes' : 'No'
}

若将同样的函数定义为一个方法而不是计算属性,两种方式在结果上确实是完全相同的。不同的地方在于计算属性值会基于其响应式依赖被缓存。一个计算属性仅会在其响应式依赖更新时才重新计算。这意味着只要author.books不改变,无论多少次访问publishedBooksMessage都会立即返回先前的计算结果,而不用重复执行 getter 函数。

这也解释了为什么下面的计算属性永远不会更新,因为Date.now()并不是一个响应式依赖

const now = computed(() => Date.now())

最开始时间戳是相同的 

 

但是当我变动模板时,函数发生了变化,但computed没有变。

相比之下,方法调用总是会在重渲染发生时再次执行函数。

可写计算属性

计算属性默认是只读的。当你尝试修改一个计算属性时,你会收到一个运行时警告。只在某些特殊场景中你可能才需要用到“可写”的属性,你可以通过同时提供 getter 和 setter 来创建:

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

const firstName = ref('John')
const lastName = ref('Doe')

const fullName = computed({
  // getter
  get() {
    return firstName.value + ' ' + lastName.value
  },
  // setter
  set(newValue) {
    // 注意:我们这里使用的是解构赋值语法
    [firstName.value, lastName.value] = newValue.split(' ')
  }
})
</script>

现在当你再运行 fullName.value = 'join inf' 时,setter 会被调用而 firstName 和 lastName 会随之更新。

最佳实践 

Getter 不应有副作用

计算属性的 getter 应只做计算而没有任何其他的副作用,这一点非常重要,请务必牢记。举例来说,不要改变其他状态、在 getter 中做异步请求或者更改 DOM!一个计算属性的声明中描述的是如何根据其他值派生一个值。因此 getter 的职责应该仅为计算和返回该值。

避免直接修改计算属性值

从计算属性返回的值是派生状态。可以把它看作是一个“临时快照”,每当源状态发生变化时,就会创建一个新的快照。更改快照是没有意义的,因此计算属性的返回值应该被视为只读的,并且永远不应该被更改——应该更新它所依赖的源状态以触发新的计算。

标签:Vue,04,记录,author,books,计算,模板,属性
From: https://blog.csdn.net/cwtlw/article/details/143762936

相关文章

  • 基于nodejs+vue助力成长-中学生身体素质管理平台[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于中学生身体素质管理的研究,现有研究主要以整体学生群体的体质健康状况评估等宏观层面为主,专门针对中学生身体素质管理平台的构建研究较少。在国内外,......
  • 基于nodejs+vue住院管理系统[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于住院管理系统的研究,现有研究主要集中在大型综合性医院的整体管理流程优化方面,以提高医院运营效率为主。专门针对住院管理系统中各个具体功能模块(如......
  • Vue: Day_3
    Vue基础Chapter3Transition是一个Vue自带的动画过渡组件,属性有name、duration、mode、key、appearname是可以给该类定义name,不指定会是v<template> <Transitionname="hello"><div></div></Transition></template><stylescoped>.hello-......
  • python+vue基于django/flask新农村综合风貌展示平台java+nodejs+php-计算机毕业设计
    目录技术栈和环境说明具体实现截图预期达到的目标系统设计详细视频演示技术路线解决的思路性能/安全/负载方面可行性分析论证python-flask核心代码部分展示python-django核心代码部分展示研究方法感恩大学老师和同学源码获取技术栈和环境说明本系统以Python开发语言......
  • 代码随想录算法训练营第一天| 704. 二分查找、35.搜索插入位置、27. 移除元素、977.有
    文档讲解:代码随想录视频讲解:代码随想录状态:完成4道题一、数组理论基础数组:连续内存空间,存储类型相同的元素集合,适合读不适合写注意:Python里可以存储不同类型的元素,但刷题时都是按照相同元素去做的相同元素占用存储的空间大小是一样的,下一个元素的位置就确定了数组时间......
  • java学习记录06
    正则表达式匹配规则对于正则表达式来说,它只能精确匹配字符串。例如:正则表达式“abc",只能匹配”abc",不能匹配“ab","Abc","abcd"等其他字符串。如果想匹配非ASCII字符,例如中文,那么就用\u####的十六进制表示,例如:a\u548cc匹配的是字符串"a和c",中文字符和的Unicode编码是548c......
  • java学习记录05
    Object类通用方法Object类是所有类的超类。如果在类声明中没有使用extends关键字明确指定超类,那么默认的超类就是Object类。这就意味着所有的对象(包括数组)都实现了该类的方法。Object的所有方法native表示这个方法的实现是由其他语言(例如C或C++)编写的,它并不在Java源代码中......
  • Vue学习记录03
    响应式基础声明响应式状态ref()在组合式API中,推荐使用ref()函数来声明响应式状态:import{ref}from'vue'constcount=ref(0)ref()接收参数,并将其包裹在一个带有.value属性的ref对象中返回:constcount=ref(0)console.log(count)//{value:0}console.log(......
  • 基于nodejs+vue资产管理[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景在资产管理领域,国内外已有的研究多集中在宏观的资产配置策略以及大型企业的资产管理模式等方面1。例如,国外在金融资产的量化管理方面取得了诸多成果,通过......
  • 基于nodejs+vue卓越导师双选系统[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于导师与学员双选系统的研究,现有研究主要以传统的人工双选模式为主,专门针对卓越导师双选系统的研究较少。在国内外的教育与人才培养领域,传统双选方式......