iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >vue3.0中的computed写法
  • 897
分享到

vue3.0中的computed写法

vue3.0 computed写法vue3.0 computedvue3中computed写法 2023-05-17 08:05:03 897人浏览 泡泡鱼
摘要

目录vue3.0 computed写法Vue3.0 computed的使用及其注意点为什么使用使用注意事项总结vue3.0 computed写法 用computed计算属性之前别忘了

vue3.0 computed写法

用computed计算属性之前别忘了引入

使用完毕别忘了导出

computed里面还有两个方法:get和set

  • get方法:

结果:

get方法是读取数据时候调用的,监测到数据变化以后就自动执行:

结果:

点击以后:

说明get在程序运行时自动调用,后面监测到数据变化就再次调用

我们改一下代码:

点击前结果:

点击后结果:

所以我们能得出: 点击button以后,执行到plusOne.value = 2时候,相当于调用了:

// 其中参数val就是修改的值2
set: val => {
        console.log('executing function set')
        return count.value = val - 1
      }

所以现在count的值为2-1=1,这样的值改变引起set方法的注意,被监测到了,所以继续执行:

get: () => {
        console.log('executing function get')
        return count.value + 1
      }

这样count的值变成1+1 = 2

所以最后显示2

vue3.0 computed的使用及其注意点

为什么使用

当我们不想在template的html元素上写很长的js逻辑时,我们就会想使用计算属性computed

使用

computed

传入一个 getter 函数,返回一个默认不可手动修改的 ref 对象。

取自官网:https://vue3js.cn/Reactivity/computed.html#computed

const count = ref(1)
const plusOne = computed(() => count.value + 1)

console.log(plusOne.value) // 2

plusOne.value++ // 错误!
// 或者传入一个拥有 get 和 set 函数的对象,创建一个可手动修改的计算状态。

const count = ref(1)
const plusOne = computed({
  get: () => count.value + 1,
  set: (val) => {
    count.value = val - 1
  },
})

plusOne.value = 1
console.log(count.value) // 0
// 更多文档: Https://vue3js.cn/vue-composition-api/#computed

正文

计算属性,可能会依赖其他 reactive 的值,同时会延迟和缓存计算值

export function computed<T>(
  getterOrOptions: ComputedGetter<T> | WritableComputedOptions<T>
) {
  let getter: ComputedGetter<T>
  let setter: ComputedSetter<T>

  // 如果传入是 function 说明是只读 computed
  if (isFunction(getterOrOptions)) {
    getter = getterOrOptions
    setter = __DEV__
      ? () => {
          console.warn('Write operation failed: computed value is readonly')
        }
      : NOOP
  } else {
    // 不是方法说明是自定义的 getter setter 
    getter = getterOrOptions.get
    setter = getterOrOptions.set
  }

  let dirty = true
  let value: T
  let computed: ComputedRef<T>

  // 创建 effect, 我们在看 effect 源码时知道了传入 lazy 代表不会立即执行,computed 表明 computed 上游依赖改变的时候,会优先 trigger runner effect, scheduler 表示 effect trigger 的时候会调用 scheduler 而不是直接调用 effect
  const runner = effect(getter, {
    lazy: true,
    // mark effect as computed so that it gets priority during trigger
    computed: true,
    scheduler: () => {
      // 在触发更新时把dirty置为true, 不会立即更新 
      if (!dirty) {
        dirty = true
        trigger(computed, TriggerOpTypes.SET, 'value')
      }
    }
  })

  // 构造一个 computed 返回
  computed = {
    __v_isRef: true,
    // expose effect so computed can be stopped
    effect: runner,
    get value() {
      // dirty为ture, get操作时,执行effect获取最新值
      // 
      if (dirty) {
        value = runner()
        dirty = false
      }
      // dirty为false, 表示值未更新,直接返回 
      track(computed, TrackOpTypes.GET, 'value')
      return value
    },
    set value(newValue: T) {
      setter(newValue)
    }
  } as any
  return computed
}

注意事项

如果存在计算属性依赖其他异步或者props传进的属性,再通过state.xxx获取最新属性值进行判断,那么就必须写在getter回调里,例如:

const haveFile = computed(() => state.jobInfo.fileName ? state.jobInfo.fileName.includes('http') : false);
const permitProduct = computed(() => !state.isPower || state.isDqcFinish);
const permitDownl = computed(() => !state.isPower || !haveFile.value);

我们可以看到permitProduct 和permitDownl 都依赖state.isPower这个变量值,且该变量写在watch监听中,随时可能改变,因此,我们console.log写在permitDownl 变量的下一行,可能看不到最新结果的打印:

const haveFile = computed(() => state.jobInfo.fileName ? state.jobInfo.fileName.includes('http') : false);
const permitProduct = computed(() => !state.isPower || state.isDqcFinish);
const permitDownl = computed(() => !state.isPower || !haveFile.value);
console.log('state.isPower ===>', state.isPower);

正确的做法,应该是写在getter回调里:

const haveFile = computed(() => state.jobInfo.fileName ? state.jobInfo.fileName.includes('http') : false);
const permitProduct = computed(() => !state.isPower || state.isDqcFinish);
const permitDownl = computed(() => {
    console.log('state.isPower ===>', state.isPower); // 此时可以获得最新值
    return !state.isPower || !haveFile.value;
});

并且要注意的一点是,如果当前计算属性依赖其他计算属性,例如上面所写的permitDownl 依赖于 haveFile,这时,写法就必须是haveFile.value而非haveFile

计算属性获取值在非template区域,而是在js区域内,则必须使用propname.value去获取值! 

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: vue3.0中的computed写法

本文链接: https://www.lsjlt.com/news/210904.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue3.0中的computed写法
    目录vue3.0 computed写法vue3.0 computed的使用及其注意点为什么使用使用注意事项总结vue3.0 computed写法 用computed计算属性之前别忘了...
    99+
    2023-05-17
    vue3.0 computed写法 vue3.0 computed vue3中computed写法
  • vue3.0之怎么写tsx语法
    这篇文章主要讲解了“vue3.0之怎么写tsx语法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue3.0之怎么写tsx语法”吧!import { defineConf...
    99+
    2023-07-02
  • Vue3中的 computed,watch,watchEffect的使用方法
    目录一、computed二、watchvu2 的写法Vue3 中这样写三、watchEffect一、computed <template> 姓:<input ...
    99+
    2024-04-02
  • vue3.0中setup的两种用法实例
    目录前言一、setup函数的特性以及作用二、setup函数的注意点:用法1:结合ref使用用法2:代码分割总结前言 这篇文章主要介绍了vue3.0中setup使用,本文通过两种用法给...
    99+
    2024-04-02
  • vue3 中computed 新用法的示例分析
    这篇文章给大家介绍vue3 中computed 新用法的示例分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。vue3 中 的 computed 的使用,由于 vue3 兼容 vue2 的选项式AP...
    99+
    2023-06-21
  • Vue中的computed和watch用法及区别
    目录vue computed 是如何实现的computed demovue的watch是如何实现的watch demovue computed 是如何实现的 Vue 的 comput...
    99+
    2023-05-17
    Vue computed和watch Vue computed Vue watch
  • 详解Vue中Computed与watch的用法与区别
    目录computedcomputed只接收一个getter函数computed同时接收getter函数对象和setter函数对象调试 ComputedwatchEffect立即执行 ...
    99+
    2024-04-02
  • Vue3.0中如何监听props方法
    目录Vue3.0如何监听props第一种第二种vue3.0监听props做数据回显Vue3.0如何监听props 学习vue3.0记录下props监听: 第一种 直接监听这个prop...
    99+
    2024-04-02
  • vue3 中 computed 新用法示例小结
    vue3 中 的 computed 的使用,由于 vue3 兼容 vue2 的选项式API,所以可以直接使用 vue2的写法,这篇文章主要介绍 vue3 中 computed 的新用...
    99+
    2024-04-02
  • Vue中的computed属性详解
    目录插值表达式methodscomputed总结今天来说说vue中的计算属性computed,为了更好的理解计算属性的好处,我们先通过一个案例来慢慢 了解计算属性,有如下案例:定义两...
    99+
    2024-04-02
  • vue中computed指的是什么
    这篇文章主要介绍“vue中computed指的是什么”,在日常操作中,相信很多人在vue中computed指的是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue中co...
    99+
    2024-04-02
  • Vue3.0写自定义指令的简单步骤记录
    前言 vue中提供了丰富的内置指令,如v-if,v-bind,v-on......,除此之外我们还可以通过Vue.directive({})或者directives:{}来定义指令 ...
    99+
    2024-04-02
  • laravel8+vue3.0+element-plus的搭建方法
    小编给大家分享一下laravel8+vue3.0+element-plus的搭建方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!开始创建 laravel8 项目...
    99+
    2023-06-14
  • 聊聊Vue中的计算属性computed
    一、计算属性computed1.1.什么是计算属性computed⭐⭐ computed 是基于它的依赖缓存,只有在它的相关依赖发生改变时才会进行更新。官方文档是这样说的:对于任何包含响应式数据的复杂逻辑,你都应该使用计算属性。 (学习视频...
    99+
    2022-11-22
    vue3 vue.js Vue
  • Vue3中的setup语法糖、computed函数、watch函数详解
    目录 写在前面 setup 语法糖 computed函数 watch 函数 写在最后 写在前面 专栏介绍:凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章,应粉丝要求开始更新...
    99+
    2023-03-01
    Vue3 setup语法糖 Vue3  computed函数 Vue3  watch函数
  • Vue中的Computed与watch怎么用
    这篇“Vue中的Computed与watch怎么用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue中的Computed与...
    99+
    2023-06-30
  • vue3.0手动封装分页组件的方法
    本文实例为大家分享了vue3.0手动封装分页组件的具体代码,供大家参考,具体内容如下 1.父组件引入 src/views/goods/components/goods-comment...
    99+
    2024-04-02
  • 详解Vue3中的setup语法糖、computed函数、watch函数
    computed函数在上篇文章中我们学了两个组合式API分别是 ref 和 reactive,现在呢我们学习cmputed函数,相信大家一定知道他即使我们的计算数据定义函数,之前呢是 computed 选项,现在是computed函数;我们...
    99+
    2023-05-14
    setup computed watch vue3
  • Vue中computed和watch的区别小结
    目录一、Vue中computed和watch的区别二、computed计算属性三、区别总结区别:计算属性computed支持缓存,只有依赖数据发生改变,才会重新进行计算;不支持异步,...
    99+
    2022-12-10
    Vue中computed和watch的区别 Vue中computed和watch异同
  • Vue中的computed函数怎么使用
    这篇“Vue中的computed函数怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue中的computed函数怎么...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作