当前位置:首页 » 《随便一记》 » 正文

Vue3浅谈:(二)Vue3计算属性

28 人参与  2023年05月06日 13:21  分类 : 《随便一记》  评论

点击全文阅读


目录

一、Vue3计算属性

1.Vue3计算属性基础使用

2.计算属性缓存和常规方法

3.可写计算属性


一、Vue3计算属性

1.Vue3计算属性基础使用

当我们需要针对一些数据进行一些逻辑运算时可以使用模板中的表达式如下:

<script setup lang="ts">import { reactive } from "vue";const onePeople = reactive({  name: "Sam Xiaoguai",  chineseName: [    "萨姆",    "小乖"  ]});</script><template>  <div>    {{ onePeople.chineseName.length > 0 ? "有中文名" : "没有" }}  </div></template><style scoped></style>

但是如果在模板中写太多逻辑,会让模板变得臃肿,难以维护。因此我们可以使用计算属性computed() 方法来描述依赖响应式状态的复杂逻辑,返回值为一个计算属性 ref。

<script setup lang="ts">import { reactive,computed } from "vue";const onePeople = reactive({  name: "Sam Xiaoguai",  chineseName: [    "萨姆",    "小乖"  ]});// 一个计算属性 refconst haveChineseName = computed<string>(() => {  return onePeople.chineseName.length > 0 ? "有中文名" : "没有"})</script><template>  <div>    {{ haveChineseName }}  </div></template><style scoped></style>

2.计算属性缓存和常规方法

<script setup lang="ts">import { reactive,computed } from "vue";const onePeople = reactive({  name: "Sam Xiaoguai",  chineseName: [    "萨姆",    "小乖"  ]});// 一个计算属性 refconst haveChineseName = computed<string>(() => {  return onePeople.chineseName.length > 0 ? "有中文名" : "没有"})function haveChineseNameFun ():string {    return onePeople.chineseName.length > 0 ? "有中文名" : "没有"}</script><template>  <div>    {{ haveChineseName }}  </div>  <div>    {{ haveChineseNameFun() }}  </div></template><style scoped></style>

我们可以看到两种方式在结果上确实是完全相同的,然而,不同之处在于计算属性值会基于其响应式依赖被缓存。一个计算属性仅会在其响应式依赖更新时才重新计算。这意味着只要 onePeople不改变,无论多少次访问 haveChineseName都会立即返回先前的计算结果,而不用重复执行 getter 函数

如下:计算属性永远不会更新,因为 Date.now() 并不是一个响应式依赖

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

<script setup lang="ts">import {  computed } from "vue";const now = computed<number>(() => Date.now());function nowTime(): number {  return Date.now();}</script><template>  <div>    {{ now }}  </div>  <div>    {{ now }}  </div>  <div>    {{ now }}  </div>  <div>    {{ nowTime() }}  </div>  <div>    {{ nowTime() }}  </div>  <div>    {{ nowTime() }}  </div></template><style scoped></style>

当我们每增加一个包含nowTime的div时,会发现页面上的nowTime的值会相应的发生变化,而now并不会。

所以当我们有一个非常耗性能的计算属性 list,需要循环一个巨大的数组并做许多计算逻辑,并且可能也有其他计算属性依赖于 list。没有缓存的话,我们会重复执行非常多次 list 的 getter,然而这实际上没有必要!如果你确定不需要缓存,那么也可以使用方法调用。

3.可写计算属性

计算属性默认是只读的。当你尝试修改一个计算属性时,你会收到一个运行时警告。

如下:

<script setup lang="ts">import { ref, computed } from 'vue'const firstName = ref('Sam')const lastName = ref('xiaoguai')const fullName = computed<string>(() => {  return firstName.value + ' ' + lastName.value;});fullName.value = "samxiaoguai"</script><template>  <div>    {{ fullName }}  </div></template><style scoped></style>

我们会看到一个警告⚠️:

Write operation failed: computed value is readonly

因此如果你需要用到“可写”的属性,你可以通过同时提供 getter 和 setter 来创建

如下:

<script setup lang="ts">import { ref, computed } from 'vue'const firstName = ref('Sam')const lastName = ref('xiaoguai')const fullName = computed({  // getter  get() {    return firstName.value + ' ' + lastName.value  },  // setter  set(newValue) {    // 注意:我们这里使用的是解构赋值语法    [firstName.value, lastName.value] = newValue.split(' ')  }})fullName.value = "sam xiaoguai"</script><template>  <div>    {{ fullName }}  </div></template><style scoped></style>

有问题可以在下面评论,我会为大家解答,如果此文对大家有帮助,欢迎大家点点关注啊,博主在此感谢。


点击全文阅读


本文链接:http://zhangshiyu.com/post/61121.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 亲女儿被养女炼成蛊后,我杀疯了全章节免费阅读_诺诺宋清清苗疆关键剧情节选解锁
  • 「用了男友两块钱亲密付被说图他的钱」完结版免费阅读_贺然翠翠孟凡全角色番外合集包
  • (番外)+(全书)如果月亮说爱你全书+后续+结局(沈聿付梨)列表_如果月亮说爱你全书+后续+结局(沈聿付梨)如果月亮说爱你全书+后续+结局
  • 「当爱被海水淹没」节选名场面直通车‌_[贺维钧贺若琳沫沫]最新章节免费阅读
  • 繁花盛意难平全书+后续+结局(陆依霜轩辕翊)全书列表_繁花盛意难平(陆依霜轩辕翊)繁花盛意难平全书+后续+结局在线
  • 全球灾变:我有一座恐怖屋全文免费在线阅读_[钟无咎林澜]全文免费无弹窗阅读_笔趣阁
  • 「乖巧面具撕碎那天,全网求我别黑化」章节多结局预体验‌_宋且微萧淮无弹窗阅读
  • (番外)+(全书)日暮青山绿渐隐全书+后续+结局(日暮青山绿渐隐全书+后续+结局)_许星森纪冰雪列表_笔趣阁(日暮青山绿渐隐全书+后续+结局)
  • [我预见了所有悲剧,除了爱]最新章节在线阅读_「白月光」小说无删减版在线免费阅读
  • (番外)+(全书)爱若有天意,兜转终可回全书+后续+结局(宋清澜萧沉)_爱若有天意,兜转终可回全书+后续+结局列表_笔趣阁(爱若有天意,兜转终可回全书+后续+结局)
  • [繁花盛意难平]小说节选推荐_陆依霜轩辕翊陆青仪节选推荐
  • [纵她追悔,爱已成荒芜]小说精彩节选推荐_「苏萌林澈白月光」小说精彩节选试读

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1