Vue3 响应式依赖收集与更新之effect

解读vue3源码-响应式篇3 effect副作用函数 什么是副作用函数?在 Vue 3 中,副作用函数(Effect Function)通常指的是那些依赖于响应式数据并在数据变化时重新执行的函数。Vue 3 引入了 ref 和 reactive API 来创建响应式数据,以及 effect 函数来观察和处理这些数据的变化。当一个函数被标记为副作用函数时,它会被 Vue 的响应式系统跟踪。这意味着每当这个函数依赖的响应式数据发生变化时,Vue 会自动重新执行这个函数,从而触发 UI 的更新或其他相关操作。例如:// 定义一个副作用函数}); 阅读详情

关于Vue3中reactive的响应实现与Proxy的代理实现,可以参考前篇文章Vue3 响应式之reactive:深入理解 Proxy代理。今天这篇文章主要讲解响应式数据的依赖收集与数据变化时是如何保障数据的一致性与触发对应的函数依赖执行。
在 Vue 3 中,effect(副作用函数)是响应式系统的核心机制之一。它负责 依赖收集 和 响应式更新触发,是 watch、watchEffect、computed、组件渲染等功能的底层基础。简单来说,effect 是一个 带有响应式感知能力的函数,当在一个 effect 函数中访问响应式数据(如 reactive 包裹的数据),Vue 会自动记录这些依赖;当这些依赖发生变化时,该 effect 会自动重新执行。在源码层面,effect 由 ReactiveEffect 类封装,通过全局变量 activeEffect 实现依赖追踪。

1. effect函数的实现

/**
 * effect实现
 * @param {function} fn - 执行函数
 * @param {object}  options - 配置参数
 * @returns {function} effect
 */
function effect(fn, options = {}) {
    const effect = createReativeEffect(fn, options)
    return effect
}
var id = 0 // 标识当前effect
var activeEffectStack = [] // 使用Stack记录嵌套effect的调用顺序
var activeEffect = null // 当前执行的effect,用于依赖收集
function createReativeEffect(fn, options) {
    const effect = function reativeEffect() {
        activeEffectStack.push(effect) // 嵌套effect调用时进行记录
        activeEffect = effect
        try {
             return fn() // 访问fn时会进行依赖收集,例如访问reactive数据时
            } finally{
                activeEffectStack.pop()
                activeEffect = activeEffectStack[activeEffectStack.length - 1]
           }
    }
    effect.id = ++id
    effect.raw = fn
    effect.options = options
    effect.deps = [] // 记录响应式属性的依赖,在某阶段进行cleanup,后续再讲解,非本文的重点
    if (!options.lazy) { // 非懒加载则立即执行
        effect();
    }
    return effect
}

2. reactive下的依赖收集之track函数

/*
* createGetter: proxy第二个参数mutablehandle中的get方法
* @param - 无
* @returns {function} 返回get函数
*/
function createGetter() {
    return function get(target, key, receiver) {
        track(target, key)
        const res = Reflect.get(target, key, receiver)
        // console.log(`get ${key}`)
        if(isObject(res)) {
            return reactive(res)
        }
        return res // 返回对应的值,例如访问obj.property
    }
}
/*
* 依赖收集函数
* param {object} target -例如reactive声明的数据
* param {string|number} key -例如reactive声明数据下的某个属性
*/
function track(target, key) {
    if(!activeEffect) return // 未存在调用的effect
    let depsMap = targetMap.get(target) // 获取对应target对map
    if(!depsMap) {
        targetMap.set(target, (depsMap = new Map()))
    }
    let deps = depsMap.get(key) // 获取对应target对应map下的key进行依赖收集
    if(!deps) {
        depsMap.set(key, (deps = new Set()))
    }
   
    if(!deps.has(activeEffect)) {
        deps.add(activeEffect)
        activeEffect?.deps?.push(deps) // 后续 cleanup(清理旧依赖)做准备
    }
}

以上在target对应的key访问时自动进行对应effect的收集,保障后续target下某个key更新时对应的effect进行调用从而触发更新

3. reactive下的依赖触发更新之trigger函数

/*
* createGetter: proxy第二个参数mutablehandle中的set方法
* @param - 无
* @returns {function} 返回set函数
*/
function createSetter() {
    return function set(target, key, value, receiver) {
        const oldValue = target[key]
        const res = Reflect.set(target, key, value, receiver)
        // console.log(`set ${key}`)
        const hadkey = target instanceof Array ? Number(key) < target.length : key in target // 判断是否新增属性,优化vue2中新增属性无触发响应更新的问题
        if(!hadkey) { // key为新增
            trigger(target, key, value, 'ADD')
        }else if(!isEqual(oldValue, value)){ // 非新增直接进行值的比较
            trigger(target, key, value, 'SET') // 触发更新
        }
        return res
    }
}
/*
* 依赖触发更新函数
* param {object} target -例如reactive声明的数据
* param {string|number} key -例如reactive声明数据下的某个属性
* param {any} value - 设置的值
* type {string} type - 触发类型
*/
function trigger(target, key, value, type = 'SET') {
    const depsMap = targetMap.get(target)
    if(!depsMap) return
    const deps = depsMap.get(key)
    const effects = new Set() // 收集key对应的所有依赖
    const addEffect = (deps) => {
        if(deps) {
            deps.forEach(effect => {
                effects.add(effect)
            })
        }
    }
    if(Array.isArray(target) && key === 'length') { // 访问数组的length属性
        addEffect(depsMap.get('length')) // 收集length对应的Effect
        depsMap.forEach((deps, key) => {
            if(typeof key === "number" || key >= value) {  // 触发被删除项的依赖(索引 >= newLength)
                addEffect(deps)
            }
        })
    }else{
        if(key !== void 0) {
            addEffect(deps) //正常触发对应effect
        }
        switch(type) {
            case 'ADD':
                if(Array.isArray(target) && isIntegerKey(key)) {
                    addEffect(depsMap.get('length')) // 新增长度需要触发length对应Effect
                }
                break;
        }
    }
    effects.forEach(effect => {
        effect() // 触发所有已收集到的effect进行执行
    })
}

4.具体案例

const obj = reactive({
    name: 'zs',
    age: 18,
    address: {
        city: 'beijing',
        info: {
            name: 'ls'
        }
    }
})
effect(() => {
    console.log(obj.name, '--obj.name--');
    setTimeout(() => {
        obj.name = 'ls'
    }, 1000);
}, {
    lazy: false
})
// 打印如下:
// zs --obj.name--
//1秒后 ls --obj.name--

5.总结

以上是关于响应式对象例如reactive下数据访问和更改时对应的依赖函数收集和更新,本篇文章主要是基于vue3源码reactive基本响应式内容的实现,让大家能够了解到vue3下的响应式机制的运行流程,在vue3的源码中还会针对许多边界和其它响应式api进行适配和处理,我也会在后续更新中把更多流程完善后再把代码上传至git进行分享给大家,也欢迎大家在评论区交流!

Vue 3 中的 effect:深入理解响应式系统的核心 阅读详情

相关推荐

Vue 3响应式原理深度解析:ref、effect与Proxy协同机制

响应式系统是现代前端框架的核心能力,其本质是建立数据变化与视图更新之间的自动映射关系。Vue 3通过ref封装基础类型响应式、effect构建依赖追踪闭环、Proxy实现对象层级的细粒度拦截,三者协同构成可预测、可调试的响应式引擎。ref的value属性并非语法糖,而是RefImpl实例的显式访问入口,承载trackRefValue与triggerRefValue的依赖注册与通知逻辑;effect则借助activeEffect全局状态和effectStack调用栈,实现副作用函数的自动激活与重执行。这种设计

weixin_31742871的博客 239

vue3的effect理解

vue3 响应式 effect

zzzll30的博客 2082

【计算机组成原理】课程设计四:控制器设计(二)

本文主要是介绍了计算机组成原理课程设计四其二,即控制器设计(二),属于计算机课程设计专栏

superiony的博客 1430

vue3响应式原理-effect

为了实现响应式,我们使用了new Proxy effect默认数据变化要能更新,我们先将正在执行的effect作为全局变量,渲染(取值),然后在get方法中进行依赖收集 依赖收集的数据格式weakMap(对象:map(属性:set(effect)) 用户数据发生变化,会通过对象属性来查找对应的effect集合,全部执行; 调度器的实现,创建effect时,把scheduler存在实例上,调用runner时,判断如果有调度器就调用调度器,否则执行runner 边界情况: 如果在执行effect时,又修改.

白开水的博客 2627

国产谷歌地球,地形分析秒杀同款地图软件

咱们做地质、林业、水文、水利、电力、GIS、地图、水保、环境的,需要经常用到各种数据,比如影像、地形、矢量、模型等,但目前80%的规划大数据展示都离不开ArcGIS,令人头大的是很多朋友连ArcGIS软件安装起来都费劲。。。 那不会ArcGIS又装不了Google Earth怎么开展工作? 今天推荐大家一款国产免费专业地图浏览下载测量分析神器—图新地球 图新地球,国产三维gis软件。可以查看高清卫星影像地形以及其他很多常用电子地图,对地图需求的掌握远胜过Google Maps,而且上手比国外软件要简单

GISWorld3D的博客 3685

oracle ebs form 10g安装教程

这个窗口需要想想,你要安装的类型,不要盲目点击“下一步”,因为一旦Oracle安装后,重新安装之前,需要卸载Oracle干净才能重新安装,有时还会出现错误。到了该窗口后,需要耐心等待安装,安装到一大半后,自动弹出一个窗口,让我们选择Oracle安装第2部分磁盘的路径,继续安装,然后坐等安装结束。自定义安装Oracle根目录,点击“下一步”按钮后,耐心等待几秒钟,工具自动加载产品列表,加载完后,自动跳转到“选择安装类型”窗口。注:等待几秒钟后,关闭dos窗口,不必惊慌,自动调转到安装界面。

XIELIUHAI001的博客 473

Vue3中数据更新函数effect的实现

VUe3中effect函数的实现

wenyeqv的博客 2064

Vue中实现word文档渲染、在线编辑、保存

Vue3对word文档进行渲染、编辑、保存。word转成html,html转成word

h18749849699的博客 1328

分析 Vue3 Effect 函数看响应式依赖收集和触发更新过程2

会在 effect._trackId 为 1 的 effect 的 deps 数组上保存 flag 和 name 这两个 dep,同时也分别在 flag 的 dep 和 name 的 dep 上保存 effect._trackId 为 1 的 effect。此时的 activeEffect 已经变样了(即使是从之前的 flag 的 dep 中取出的 effect)就是执行 effect 的回调函数。时触发 trigger,执行 flag 的 dep 中的 effect.run()执行 run 方法中的。

兰亭古墨 933

PostgreSQL数据库全攻略:从入门到精通

本文是一份PostgreSQL数据库综合指南,涵盖安装配置、基础操作和高级管理。主要内容包括:1) PostgreSQL简介与各平台安装方法;2) 数据库基本操作,如创建数据库/表、CRUD操作、用户权限管理;3) 高级功能包括索引优化、事务控制、视图、存储过程、触发器和扩展模块;4) 数据库管理维护,涉及配置调优、备份恢复、性能监控和日常维护;5) 安全设置与高可用方案。指南提供了从入门到进阶的实用知识,强调结合官方文档进行深入学习,帮助用户高效使用这一功能强大的开源关系型数据库系统。

索大神的博客 1970

智能生活中枢:基于 ESP32-S3 的桌面智能助手与日程提醒终端设计与实现

本文完成了基于 ESP32-S3 的桌面智能助手与日程提醒终端的完整设计,实现了时间同步、日程管理、声光提醒、环境监测、本地存储等核心功能。硬件接线简洁、软件逻辑清晰,可直接制作成品使用。硬件方案:以 ESP32-S3 为核心,搭配 OLED、DS3231、DHT11、按键、声光模块,接线标准化、易复刻;软件方案:基于 Arduino 开发,提供标准 Mermaid 软件流程图,代码模块化、可直接编译运行;核心功能:网络授时、本地日程管理、掉电存储、声光提醒、温湿度监测,满足桌面智能助手全场景需求。

weixin_42300449的博客 209

分析 Vue3 Effect 函数看响应式依赖收集和触发更新过程

先给一个简单的实例,分析依赖收集和更新的过程reactive 函数只会创建一个响应式对象,没有产生其他的什么副作用,仅在state对象在访问或者修改时才会触发proxy的getter和setter。

兰亭古墨 775

❤️爆肝十二万字《python从零到精通教程》,从零教你变大佬❤️(建议收藏)

文章目录强烈推荐系列教程,建议学起来!!一.pycharm下载安装二.python下载安装三.pycharm上配置python四.配置镜像源让你下载嗖嗖的快4.1pycharm内部配置4.2手动添加镜像源4.3永久配置镜像源五.插件安装(比如汉化?)5.1自动补码神器第一款5.2汉化pycharm5.3其它插件六.美女背景七.自定义脚本开头八、这个前言一定要看九、python入门十、python缩进十一、Python注释1.单行注释2.多行注释十二、Python 变量1.变量定义理解2. 变量名命名3. 分

全栈川川 26万+

【vue3】手写简单vue3响应式原理

vue3响应式的核心是使用proxy👉核心是使用核心是使用上面都出现了函数:effect()函数默认上来会执行一次,然后当属性值发生变化时,effect函数又会执行。

前端学习博客 1940

实战封神!YOLOv7 轻量化部署全攻略:ONNX格式转换+TensorRT极致加速(速度直接提升3-5倍,精度无损)

部署核心链路,这是YOLO系列部署的最优解,速度提升3~5倍,精度无损;ONNX是桥梁:解决模型兼容性问题,简化后能去掉冗余节点,是TensorRT加速的前提;TensorRT是核心:NVIDIA显卡的极致加速引擎,FP16量化是速度与精度的最优平衡,无需手动配置,一键开启;轻量化终极组合YOLOv7-tiny + 416尺寸 + TensorRT FP16,速度提升5~8倍,满足所有实时检测场景;避坑核心:转换参数必加,推理尺寸必须一致,engine文件显卡专属。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 308

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

手写 Vue 源码 === Effect 机制解析

通过 effect 函数创建响应式效果使用类管理回调函数和执行逻辑通过 activeEffect 全局变量跟踪当前正在执行的 effect在属性访问时进行依赖收集在属性设置时触发相关 effect 重新执行Vue3 响应式系统通过全局变量巧妙地解决了"谁在使用这个属性"的问题,实现了自动依赖收集。当访问响应式对象的属性时,系统知道是哪个 effect 正在运行,从而建立属性与 effect 之间的映射关系,为后续的响应式更新奠定基础。

每天都要努力学习哦~~ 863

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

4k+ 字分析 Vue 3.0 响应式原理(依赖收集和派发更新)

引言 前几天写了一篇关于Vue 3.0 reactive API 源码实现的文章,发现大家还是蛮有兴趣对于源码这一块的。阅读的人数虽然不多,但是 200 多次阅读,还是阔以的!并且,在当时阿里的一位前辈也指出了文章存在的不足,就是没有分析 Proxy 是如何配合 Effect 实现响应式的原理,即依赖收集和派发更新的过程。 所以,这次我们就来彻底了解一下,Vue 3.0 依赖收集和派发更新的整个过...

五柳 895

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

简单版手写Vue3响应式

响应式数据包装的数据 和被监控的函数之间的关联。响应式数据:refreactivecomputedprops被监控的函数:watch组件渲染函数(template模版会被编译为渲染函数)effect (内部函数)当响应式数据被读取时,会进行依赖收集;当被依赖收集过的数据发生变化时,会进行派发更新接下来分为三个部分来阐述和实现数据拦截,即读取和写入的拦截effect函数,通过effect函数运行后的函数,会变为被监控的函数依赖收集和派发更新。

weixin_44708992的博客 1551

vue3源码effect

Effect 前言:effect类似于vue2源码中的watch,观察者/订阅者。 以下过程中,effect为观察者,target的属性值为被观察者,effect观察target的属性值,target的属性值被修改通知effect,确保以这个思想看待下面源码。 Effect与Target映射 target ===> effect // 存放effect集合,使用Set去重 type Dep = Set<ReactiveEffect> // any为监控对象的属性,属性对应的Dep // 存

py_boy的博客 1319

vue3 effect 实现思路

首先了解这张图 const state = reactive({ name: 'cld', age: 26, arr: [1, 2, 3], obj: { attr1: 'attr1', attr2: 'attr2' } }); effect(()=>{ console.log('effect内执行:',state.obj.attr1) }) state.obj.attr1='cld2' 大概思路清楚了 开始分析代码 创建effect函数 传入一个函数与options对象 export

Embrace924的博客 1940

Vue3响应式原理解析

Vue3 的响应式系统通过 Proxy 拦截对象操作,结合 依赖收集(track) 与 触发更新(trigger) 实现了高效的数据绑定。相比 Vue2,它解决了动态属性、数组操作等痛点,且性能更优。理解其核心原理有助于更好地使用 Vue3 开发复杂应用。

qq_39842184的博客 1478

TS手写简陋版reactive响应式原理(依赖收集,依赖更新)

我们首先new了一个weakMap,weakMap只接受object的类型,target正好是一个对象,然后我们通过target获取到对应的内部Map,我们在通过key获取到Set的集合,此时内部存储的就是一个个所收集到的依赖。我们简单的可以就把他理解成一个依赖,用户使用了effect函数过后,里面的响应式数据发生变化后会重新执行传递进去的回调函数,vue2中收集的依赖对应watcher,vue3收集的依赖实际是effect,他们两者实现功能实际上是一样的。,然后去递归进行依赖收集,并不是直接像。

weixin_42125732的博客 6105

Vue 3 最详细的Reactivity 数据响应式原理解析

Vue3 如火如荼,与其干等,不如花一个下午茶的时间来看下最新的响应式数据是如何实现的吧。在本文中,会写到 vue3 的依赖收集和 proxy 数据代理,以及副作用 (effect) 是如...

前端劝退师 1806

vue3源码分析(三)—— 响应式系统(reactivity)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 文章目录系列文章目录前言一、reactivity模块有哪些API二、reactive模块1. 核心方法 - reactive(target: object)2.创建响应式对象 - createReactiveObject3.baseHandlers(Object Array)3.1 get 做了什么?3.1.1 思考:为什么用 Reflect.get,而不是直接 t

娃哈哈_的博客 1082
上一篇: Vue3 响应式之reactive:深入理解 Proxy代理
下一篇: Vue3响应式原理之ref篇
Zhencode
博客等级 码龄7年 106粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值