Vue的computed大致细节

computed

computed

具体实现流程

  1. computer内部首先是标准化参数
  2. 然后调用runner函数进行依赖收集
  3. 设置dirty为true
  4. 创建副作用函数,具体如下
js 复制代码
const runner = effect(getter,{
    //延迟执行
    lazy:true,
    //标记为computed effect 用于咋trigger阶段的优先级排序
    computed:true,
    //调度执行实现
    scheduler:() => {
        //如果dirty为true,则执行副作用函数
        if(dirty){
            //设置dirty为false
            dirty = false
            trigger(computed,"set",'value')
        }
    }
})
  1. 创建computed对象,具体如下
js 复制代码
computed = {
    _v_isRef:true,
    effect:runner,
    get value(){
        if(dirty){
            value = runner()
            dirty = false
        }
        track(computed,"get",'value')
        return value
    }
    set value(newValue){
        setter(newValue)
    }
}

//最后
return computed

相关介绍

  • dirty默认是false,当依赖发送变化是会设置dirty为true,然后下一次执行get时会重新计算并设置dirty为false,得到新的value
  • dirty为false为,直接返回value
  • dirty为true时,会重新计算value并设置dirty为false,然后返回value

当computed被访问时会触发get

computer的执行顺序

runner大于普通effect函数

例题

javascript 复制代码
import {effect } from '@vue/reactivity'
import {ref,computed} from 'vue'

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

effect(() => {
    console.log(cont.value+plusOne.value)
})

function increment() {
    count.value++
}

increment() 

输出结果 : 1 3 3

主要原因时执行优先级不同,输出1就不解释了。先执行pluseOne的runner,将plusOne的runner的dirty设置为true,然后通知他的依赖effect,这时由于plusOne的dirty为true,所以会再次执行pluseOne的get拿到新值2,再加上1就得到了3,同时也会设置dirty为false,然后再次执行count普通effect依赖, 由于dirty为false再次输出3

相关推荐
码蜂窝编程官方18 分钟前
【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的虎鲸旅游攻略网的设计与实现
java·vue.js·spring boot·后端·spring·旅游
gqkmiss18 分钟前
Chrome 浏览器 131 版本开发者工具(DevTools)更新内容
前端·chrome·浏览器·chrome devtools
Summer不秃23 分钟前
Flutter之使用mqtt进行连接和信息传输的使用案例
前端·flutter
旭日猎鹰28 分钟前
Flutter踩坑记录(二)-- GestureDetector+Expanded点击无效果
前端·javascript·flutter
Viktor_Ye34 分钟前
高效集成易快报与金蝶应付单的方案
java·前端·数据库
hummhumm36 分钟前
第 25 章 - Golang 项目结构
java·开发语言·前端·后端·python·elasticsearch·golang
乐闻x1 小时前
Vue.js 性能优化指南:掌握 keep-alive 的使用技巧
前端·vue.js·性能优化
一条晒干的咸魚1 小时前
【Web前端】创建我的第一个 Web 表单
服务器·前端·javascript·json·对象·表单
花海少爷1 小时前
第十章 JavaScript的应用课后习题
开发语言·javascript·ecmascript
Amd7941 小时前
Nuxt.js 应用中的 webpack:compiled 事件钩子
前端·webpack·开发·编译·nuxt.js·事件·钩子