手写Vue核心原理(一)

PCB设计必看:铜皮厚度与载流能力对照表(附Excel计算工具) 本文深入解析了PCB设计中铜皮厚度与载流能力的核心关系,提供了基于IPC-2152标准的动态计算逻辑与实用Excel工具。文章不仅分享了载流对照表,更重点剖析了影响载流能力的关键因素(如铜厚、线宽、温升、布线层),并给出了高电流设计的实战技巧与测试验证方法,帮助工程师规避常见陷阱,实现从理论到实践的闭环设计。 阅读详情

源码地址:gitee源码地址

一.使用Rollup搭建开发环境

1.什么是Rollup?

Rollup 是一个 JavaScript 模块打包器,可以将小块代码编译成大块复杂的代码, rollup.js更专注于Javascript类库打包 (开发应用时使用webpack,开发库时使用Rollup)

2.环境搭建

安装rollup环境

npm install @babel/preset-env @babel/core rollup rollup-plugin-babel rollup-plugin-serve cross-env -D

rollup.config.js文件编写

import babel from 'rollup-plugin-babel';
import serve from 'rollup-plugin-serve';
export default {
    input: './src/index.js',
    output: {
        format: 'umd', // 模块化类型
        file: 'dist/umd/vue.js', 
        name: 'Vue', // 打包后的全局变量的名字
        sourcemap: true
    },
    plugins: [
        babel({
            exclude: 'node_modules/**'
        }),
        process.env.ENV === 'development'?serve({
            open: true,
            openPage: '/public/index.html',
            port: 3000,
            contentBase: ''
        }):null
    ]
}

配置.babelrc文件

{
    "presets": [
        "@babel/preset-env"
    ]
}

执行脚本配置

"scripts": {
    "build:dev": "rollup -c",
    "serve": "cross-env ENV=development rollup -c -w"
}

二.Vue响应式原理

导出vue构造函数

import {initMixin} from './init';

function Vue(options) {
    this._init(options);
}
initMixin(Vue); // 给原型上新增_init方法
export default Vue;

init方法中初始化vue状态

import {initState} from './state';
export function initMixin(Vue){
    Vue.prototype._init = function (options) {
        const vm  = this;
        vm.$options = options
        // 初始化状态
        initState(vm)
    }
}

根据不同属性进行初始化操作

export function initState(vm){
    const opts = vm.$options;
    if(opts.props){
        initProps(vm);
    }
    if(opts.methods){
        initMethod(vm);
    }
    if(opts.data){
        // 初始化data
        initData(vm);
    }
    if(opts.computed){
        initComputed(vm);
    }
    if(opts.watch){
        initWatch(vm);
    }
}
function initProps(){}
function initMethod(){}
function initData(){}
function initComputed(){}
function initWatch(){}

1.初始化数据

import {observe} from './observer/index.js'
function initData(vm){
    let data = vm.$options.data;
    data = vm._data = typeof data === 'function' ? data.call(vm) : data;
    observe(data);
}

2.递归属性劫持

class Observer { // 观测值
    constructor(value){
        this.walk(value);
    }
    walk(data){ // 让对象上的所有属性依次进行观测
        let keys = Object.keys(data);
        for(let i = 0; i < keys.length; i++){
            let key = keys[i];
            let value = data[key];
            defineReactive(data,key,value);
        }
    }
}
function defineReactive(data,key,value){
    observe(value);
    Object.defineProperty(data,key,{
        get(){
            return value
        },
        set(newValue){
            if(newValue == value) return;
            observe(newValue);
            value = newValue
        }
    })
}
export function observe(data) {
    if(typeof data !== 'object' || data == null){
        return;
    }
    return new Observer(data);
}

3.数组方法的劫持

import {arrayMethods} from './array';
class Observer { // 观测值
    constructor(value){
        if(Array.isArray(value)){
            value.__proto__ = arrayMethods; // 重写数组原型方法
            this.observeArray(value);
        }else{
            this.walk(value);
        }
    }
    observeArray(value){
        for(let i = 0 ; i < value.length ;i ++){
            observe(value[i]);
        }
    }
}

重写数组原型方法

//! 重写数组方法,进行数组函数劫持

// 获取原来的数组方法
let oldArrayProtoMethods = Array.prototype;

export let ArrMethods = Object.create(oldArrayProtoMethods);

let methods = ['push', 'pop', 'unshift', 'shift', 'splice','reverse','sort'];

methods.forEach((item) => {
    ArrMethods[item] = function (...args) {
        let result = oldArrayProtoMethods[item].apply(this, args);
        let inserted;
        switch (item) {
            case 'push':
            case 'unshift':
                inserted = args;
                break;
            case 'splice':
                inserted = args.splice(2);
                break;
        }
        let ob = this.__ob__;
        if (inserted) {
            ob.observerArray(inserted); // 对我们的添加的对象进行劫持
        }
        ob.dep.notify();
        return result;
    };
});

增加__ob__属性

class Observer { 
    constructor(value){
        Object.defineProperty(value,'__ob__',{
            enumerable:false,
            configurable:false,
            value:this
        });
        // ...
    }
 }

给所有响应式数据增加标识,并且可以在响应式上获取Observer实例上的方法

4.数据代理


//! Vue2 对data进行初始化
function initData(vm) {
  //> 会有两种初始化方式 1. 对象  2. 函数
  let data = vm.$options.data;
  data = vm._data = typeof data === "function" ? data.call(vm) : data;

  //> 将data上的数据全部代理到vm上
  for (const key in data) {
    if (Object.hasOwnProperty.call(data, key)) {
      proxy(vm, "_data", key);
    }
  }

  //> 对数据data进行劫持
  observer(data);
}

function proxy(vm, score, key) {
  Object.defineProperty(vm, key, {
    get() {
      return vm[score][key];
    },
    set(newValue) {
      vm[score][key] = newValue;
    },
  });
}
诊断CAPL自动化(3)——封装了接收诊断数据的通用CAPL脚本函数库 DiagGetRespPrimitiveSize (获取诊断响应的单个数据) diagGetPrimitiveData (获取诊断返回的所有数据) DiagGetRespParameter(数值类型) DiagGetRespParameter(字符串类型) DiagGetRespParameter(byte数组) 阅读详情

相关推荐

什么是深度展开网络?如何将迭代算法的每一次迭代展开成深度网络对应的一层?深度展开网络进行端对端训练,其中端对端是什么意思?

在深度学习和机器学习的背景下,“端到端”(End-to-end)训练指的是将输入数据直接映射到最终输出的过程,而不需要任何中间的手动数据预处理或特征工程。- **自然语言处理**:端到端自然语言处理系统可以将自然语言输入直接转化为计算机可理解的语言输出,而不需要对语言进行分解和转化。- **推荐系统**:通过使用深度神经网络,端到端推荐系统可以直接根据用户历史行为预测其未来的兴趣爱好,并推荐相应的产品或服务。4. **直接映射**:从输入到输出的直接映射,中间没有任何拆分或分解的过程。

m0_67897882的博客 5432

Vue源码学习:手写Vue(一)—— observe

自己想写实现一个有Vue核心功能的迷你库,记录一下实现过程。 0.我希望的我实例是这么创建 new HVue(options) new HVue({ data: { message: 'hvue' } }) 1.在项目根目录创建一个vue.js class HVue { constructor(options) { this.$options = options this.$data = options.data this.observe(this.$data

xliang111的博客 559

neruolib全脑建模计算框架

neurolib 是一个用python编写的全脑建模计算框架,也是可扩展的、允许轻松实现自定义神经质量模型,能够在介观尺度上表示脑区平均活动。

Rootfyx的博客 1147

深入vue2.0源码系列:手写代码模拟Vue2.0实现虚拟DOM的实现原理

Vue的核心之一是虚拟DOM,这使得Vue在数据变化时可以快速更新DOM而不需要重新渲染整个页面。在本文中,我们将手写代码模拟Vue2.0实现虚拟DOM的实现原理,让您了解其基本原理。

前端程序员、项目经理、人工智能博主 657

UVM环境复位--stop_sequences()

在UVM验证环境中, stop_sequences是一个用于强制终止所有正在运行的 Sequence 的方法,通常用于动态控制激励生成流程。1.通过uvm_config_db传递事件和严格的同步机制,此方案符适用于复杂复位场景和动态测试控制。组件耦合:Driver 和 Sequence 不再直接依赖env,通过标准接口通信。竞争条件:确保 Driver 完成清理后再终止 Sequence。代码健壮性:使用非阻塞操作和事件监听,避免死锁。

qq_42779035的博客 3014

Matlab激活失败?手把手教你解决License checkout failed问题(附详细截图)

本文针对Matlab激活后出现“License checkout failed”错误的常见问题,提供了详细的解决方案。核心在于精准定位并正确填写Windows系统用户名,而非计算机名或账户全名。文章通过分步截图和命令指引,手把手教你使用`whoami`命令获取正确信息,并重新运行激活程序,从根本上解决因用户名填写错误导致的许可检查失败问题。

weixin_29062823的博客 570

前端校招笔试必刷:小红书2020笔试题卷一全解析,覆盖原型链、事件循环、手写代码与算法

JavaScript作为前端开发的核心语言,其原型链、闭包、事件循环等机制是校招笔试的高频考点。理解原型链能帮助开发者掌握对象属性查找的底层逻辑,闭包则关系到作用域与变量生命周期管理,而事件循环中的微任务与宏任务机制更是异步编程的基石。这些基础概念不仅是笔试的选择题来源,也直接决定了手写深拷贝、防抖节流、Promise.all等代码实现的质量。在浏览器环境下,掌握渲染流程、重排重绘与跨域方案,同样是从理论走向工程实践的关键。当这些知识点与数组转树、最长无重复子串等算法题结合时,就构成了一套完整的前端校招笔试

weixin_28077113的博客 240

从BAM到bigWig:用UCSC工具链完成测序数据可视化的完整流程

本文详细介绍了从BAM文件到bigWig格式的基因组数据可视化完整流程,涵盖UCSC工具链配置、文件格式转换、参数优化及常见问题解决方案。通过实战指南帮助研究人员高效完成测序数据可视化,特别适合ChIP-seq和RNA-seq数据分析。

weixin_29309213的博客 707

深入讲解一下 Vue 3 的核心源码库 vuejs/core

track 负责“依赖收集”,trigger 负责“派发更新”。

u011091936的博客 1388

建模simulink - 手把手教你搭建xpc平台

概述xpc半实物仿真目标是个基于RTW对低端实时仿真和开发平台,可将计算机或者工控机转变为一个实时系统,不需要第三方操作系统对支持,在计算机上配置输入输入出设备就能和外部交换信息,进行硬件...

不只会拍照的程序猿 7087

【推荐100个unity插件】帮助你快速开发一款FPS游戏—— FPS Framework

FPS Framework 快速入门指南 FPS Framework 是一个 Unity 开发框架,可加速 FPS 游戏开发。主要功能包括: 第一人称控制器:基于 Character Controller 实现,提供移动、跳跃、下蹲等功能,支持自定义参数调整 渲染管线转换:内置 RP 转换器,支持 URP/HDRP 等渲染管线一键切换 库存系统: 采用双列表管理:物品列表(Items)和可收集物列表(Collectables) 支持自定义库存物品和可收集物类型 提供拾取/丢弃功能实现 快速开始: 通过预制件

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2568

玩转Vuejs--核心原理

一、摘要: Vuejs是一款前端MVVM框架,利用Vuejs、webpack以及周边一系列生态工具我们可以快速的构建起一个前端应用,网上对于Vue的分析大都是基于各个模块,理解起来不够顺畅,本文将从整个执行过程出发,讲一下Vuejs的核心原理。 二、版本说明: Vuejs有两种版本,一种是runtime、一种是runtime-with-compiler,对应的渲染有两种写法: 1、r...

weixin_34049032的博客 180

使用Python爬虫抓取旅游景点评价数据并进行热度可视化

景点热度通常由景点的评分、评论数以及游客的热情度来决定。高热度的景点通常意味着更高的游客评分和更多的游客评论。热度不仅反映了景点的受欢迎程度,还可以揭示某些景点的潜力和存在的问题。评分:游客对景点的综合评分,通常是0到5分。评论数:景点的评论数量,反映了游客对景点的关注程度。热度变化:在一定时间内,景点的评价和评论数量变化,能够反映景点的热度波动。通过使用Python爬虫技术抓取旅游景点的评价和评论数据,我们能够深入分析景点的热度,并通过数据可视化工具将这些信息展示给用户。

2201_76125261的博客 1282

探索VueJS核心:tiny-vue,你的源码学习伙伴

探索VueJS核心:tiny-vue,你的源码学习伙伴 项目简介 tiny-vue 是一个精心简化版的VueJS实现,专为初学者设计,帮助理解VueJS v1.0.28的核心概念。这个项目的创建者为了帮助那些在复杂源码中迷失方向的新手,将VueJS的核心功能拆解成更易于理解的部分,让你能够逐步深入到响应式数据处理和指令系统的奥秘之中。 项目技术分析 tiny-vue 主要分为两个关键部分:响应式S...

gitblog_00012的博客 637

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

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

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Vue基础——VueJS是什么、Vue的优缺点、vue2和vue3的模板区别、MVVM数据双向绑定、Vue的安装和使用、Vue模板语法-文本渲染、常用的vue的指令

Vue基础——VueJS是什么、Vue的优缺点、vue2和vue3的模板区别、MVVM数据双向绑定、Vue的安装和使用、Vue模板语法-文本渲染、常用的vue的指令

ranran0306的博客 9689

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

2小时搞定Vue 3:手写mini版Vue + 核心原理解析

作为国内使用广泛的框架之一,Vue几乎是面试必问内容。尤其是近期去大厂面试的程序员,相信你们深有体会:去年面试官问我怎么用Vue,今年却开始问我Vue的实现原理?Vue 3为什么要用 Pr...

前端开发博客 4720

手写Vuex核心原理,再也不怕面试官问我Vuex原理

手写Vuex核心原理 文章目录手写Vuex核心原理一、核心原理二、基本准备工作三、剖析Vuex本质四、分析Vue.use五、完善install方法六、实现Vuex的state七、实现getter八、实现mutation九、实现actions 一、核心原理 Vuex本质是一个对象 Vuex对象有两个属性,一个是install方法,一个是Store这个类 install方法的作用是将store这个实例挂载到所有的组件上,注意是同一个store实例。 Store这个类拥有commit,dispatch这些方法,

weixin_43964148的博客 5259

深入了解Vue 2响应式原理,并手写一个简单的Vue

1. Vue 2的响应式原理 Vue.js 一个核心思想是数据驱动。所谓数据驱动是指视图是由数据驱动生成的,对视图的修改,不会直接操作 DOM,而是通过修改数据。vue.js里面只需要改变数据,Vue.js通过Directives指令去对DOM做封装,当数据发生变化,会通知指令去修改对应的DOM,数据驱动DOM的变化,DOM是数据的一种自然的映射。vue.js还会对View操作做一些监听(DOM Listener),当我们修改视图的时候,vue.js监听到这些变化,从而改变数据。这样就形成了数据的双向绑定。

Niall_Tonshall的博客 2898

Vue2的核心原理剖析

用了这么久的Vue2了你真的 知其然,知其所以然么? 今天博主就为大家带来一篇对Vue核心功能的部分剖析,带你了解Vue2的核心原理,快来享受这篇文章吧!

商务合作欢迎私信我 4万+

Apache DataFusion 27.0.0 版本发布解析:窗口函数扩展、外部表写入与核心模块重构

> 本文基于仓库内 [dev/changelog/27.0.0.md](https://link.gitcode.com/i/e1a0788292a5fde7f0c0879d4875cd98) 发布说明,结合当前仓库源码与示例,系统梳理 Apache DataFusion 27.0.0(2023-06-26 发布)的核心变更:破坏性改动、新功能、性能优化与 Bug 修复。读完本文,你将掌握 27.

gitblog_00528的博客 962

Vue Router 原理解析加手写

Vue Router 原理与实现 前端路由实现SPA无刷新页面跳转,核心是URL与UI的映射。两种原生实现方式: hash模式:通过hashchange监听URL变化,不会引起页面刷新 history模式:利用pushState/replaceState和popstate事件 Vue3实现路由类需包含: 路由映射表 响应式当前路径 历史管理API 事件监听 关键组件: RouterLink:处理路由跳转 RouterView:动态渲染对应组件 实现要点: 通过Map存储路由配置 使用Vue响应式系统跟踪路径

2403_88913721的博客 1000

「offer来了」从基础到进阶原理,从vue2到vue3,48个知识点保姆级带你巩固vuejs知识体系

巩固你的vuejs知识体系序言一、vue2.x基础知识预备二、vue2.x基础知识常见面试题1. 请说出vue.cli项目中src目录每个文件夹和文件的用法?2. vue.cli中怎样使用自定义的组件?有遇到过哪些问题?3. v-show和v-if的区别4. 为何v-for中要用key5. 描述Vue组件生命周期(1)单组件生命周期(2)父子组件生命周期关系6. Vue组件如何通讯(常见)7. 描述组件渲染和更新的过程8. vue如何处理刷新数据不丢失9. 双向数据绑定 v-mo

moandaylab 4922

Vue Router 的核心实现原理是什么?

Vue Router 的核心实现原理是什么?

嗨,欢迎来到我的 优快云 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 3889

Vue原理分析

开始vuejs原理分析 vue会遇到的一些问题 点击修改不生效的例子 <template> <div> <ul> <li v-for="(item, index) in arr" :key="index"> {{item.a}} <button @click="change(index...

Alexbyy的博客 330

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

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

前端学习博客 1940

手写 Vue 系列 之 Vue1.x

手写 Vue1,实现数据响应式原理、编译器、指令(v-bind、v-model、v-on).....

m0_66439275的博客 1104

vue-router的实现原理_手写Vuerouter核心原理,深入理解

手写vue-router核心原理一、核心原理1.什么是前端路由?2.如何实现前端路由?二、原生js实现前端路由1.基于 hash 实现2.基于 history 实现三、基于Vue实现VueRouter四、剖析VueRouter本质五、分析Vue.use六、完善install方法七、完善VueRouter类八、完善$route九、完善router-view组件十、完善router-link...

weixin_39860849的博客 210
上一篇: Vue2源码解析实现—Vue响应式实现(对data中数组进行劫持)
下一篇: 手写Vue2核心原理(二)
龟中的程序员
博客等级 码龄7年 328粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龟中的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值