当前位置: 首页 > wzjs >正文

客流统计系统厂家西安seo盐城

客流统计系统厂家,西安seo盐城,邯郸网站建设优化,wordpress付费播放大白话Vue 源码 整体介绍 Vue 源码就像是一个超厉害的“魔法工具箱”,它能帮咱们轻松地做出各种漂亮又好用的网页。这个工具箱里有好几个关键的“魔法道具”,分别是响应式系统、虚拟 DOM、模板编译、组件系统和生命周期钩子,下面咱一个一个…

大白话Vue 源码

整体介绍

Vue 源码就像是一个超厉害的“魔法工具箱”,它能帮咱们轻松地做出各种漂亮又好用的网页。这个工具箱里有好几个关键的“魔法道具”,分别是响应式系统、虚拟 DOM、模板编译、组件系统和生命周期钩子,下面咱一个一个详细说说。

响应式系统

想象一下,你有一个神奇的盒子,盒子里装着一个宝贝(数据)。每当有人去看这个宝贝(访问数据)或者去换这个宝贝(修改数据)的时候,盒子都会自动知道。这就是 Vue 里的响应式系统干的事儿。

代码解释
// Dep 类,就像是一个小本子,专门用来记录哪些人对这个盒子里的宝贝感兴趣
class Dep {constructor() {// 这个数组就是小本子的页面,用来记录感兴趣的人(Watcher 实例)this.subs = [];}// 把对宝贝感兴趣的人记到小本子上addSub(sub) {this.subs.push(sub);}// 如果有人正在关注这个盒子,就把他记下来depend() {if (Dep.target) {Dep.target.addDep(this);}}// 当盒子里的宝贝换了,就告诉所有记在小本子上的人notify() {this.subs.forEach(sub => sub.update());}
}// 这个全局变量就像是一个小旗子,用来标记当前正在关注盒子的人
Dep.target = null;// Watcher 类,就像是那些对盒子里的宝贝感兴趣的人
class Watcher {constructor(vm, expOrFn, cb) {this.vm = vm;this.cb = cb;// 把小旗子插到自己身上,表示自己正在关注盒子Dep.target = this;// 去看一眼盒子里的宝贝,这样盒子就知道自己被关注了this.getter = expOrFn;this.value = this.get();// 看完了,把小旗子拿下来Dep.target = null;}// 去看盒子里的宝贝get() {return this.getter.call(this.vm);}// 把自己记到小本子上addDep(dep) {dep.addSub(this);}// 当盒子里的宝贝换了,就执行自己的任务update() {const oldValue = this.value;this.value = this.get();this.cb.call(this.vm, this.value, oldValue);}
}// 这个函数就是给盒子施魔法,让它能知道什么时候有人来看宝贝,什么时候宝贝被换了
function defineReactive(obj, key, val) {// 给这个盒子配一个小本子const dep = new Dep();// 用魔法让盒子能感知到有人来看宝贝或者换宝贝Object.defineProperty(obj, key, {get() {// 如果有小旗子插着,就把这个人记到小本子上if (Dep.target) {dep.depend();}return val;},set(newVal) {if (newVal !== val) {val = newVal;// 当宝贝换了,就告诉小本子上所有的人dep.notify();}}});
}// 咱们来试试这个魔法
const obj = {name: 'John'
};// 给 obj 的 name 属性施魔法
defineReactive(obj, 'name', obj.name);// 有个人对这个盒子里的 name 宝贝感兴趣,给他安排个任务
const watcher = new Watcher(obj, () => obj.name, (newVal, oldVal) => {console.log(`Name changed from ${oldVal} to ${newVal}`);
});// 把盒子里的 name 宝贝换了,看看会发生什么
obj.name = 'Jane'; 

虚拟 DOM

想象一下,你要盖一座房子(网页),但是每次修改房子的一个小地方都要重新把整个房子拆了再盖一遍,那可太麻烦了。虚拟 DOM 就像是房子的一个模型,你可以先在模型上改来改去,改好了再一次性把这些改动应用到真正的房子上。这样就不用每次改一点就去动真正的房子,能省好多时间和力气。

代码解释
// 这个函数就是用来做房子模型的
function createVNode(tag, props, children) {return {tag, // 房子的类型,比如是别墅还是公寓props, // 房子的一些属性,比如有几个窗户children // 房子里的小房间};
}// 咱们来做一个房子模型试试
const vnode = createVNode('div', { id: 'app' }, [createVNode('p', null, 'Hello, Vue!')
]);console.log(vnode);

模板编译

模板编译就像是一个翻译官,它能把咱们写的 HTML 模板(就像是一份盖房子的图纸)翻译成 JavaScript 代码(就像是一份工人能看懂的施工方案)。这样计算机就能按照这个方案来盖房子(渲染网页)了。

代码解释
// 这个简单的翻译官,只是把图纸简单地变成了一个施工方案
function compile(template) {// 这里只是简单模拟,实际的翻译过程要复杂得多return function render() {return createVNode('div', null, [createVNode('p', null, template)]);};
}// 咱们来试试这个翻译官
const template = 'Hello, Vue!';
const renderFunction = compile(template);
const vnode = renderFunction();
console.log(vnode);

组件系统

组件系统就像是一个积木盒子,里面有各种各样的积木(组件),你可以用这些积木拼出不同的造型(网页)。每个积木都有自己的功能和样子,而且可以重复使用。这样咱们就不用每次都从头开始做一个完整的东西,能提高效率。

代码解释
// 组件类,就像是积木的制作说明书
class VueComponent {constructor(options) {this.$options = options;this.$data = options.data();// 给这个积木的内部数据施魔法,让它能响应变化this.observe(this.$data);this.render = options.render;}// 给数据施魔法的函数observe(obj) {if (typeof obj !== 'object' || obj === null) {return;}Object.keys(obj).forEach(key => {defineReactive(obj, key, obj[key]);});}// 把这个积木拼到房子里mount() {const vnode = this.render();console.log('Rendering component with vnode:', vnode);}
}// 咱们来做一个积木试试
const componentOptions = {data() {return {message: 'Hello, Component!'};},render() {return createVNode('div', null, [createVNode('p', null, this.$data.message)]);}
};const component = new VueComponent(componentOptions);
component.mount();

生命周期钩子

生命周期钩子就像是一个人的成长过程中的重要时刻,比如出生、上学、工作、退休等等。在 Vue 里,每个组件也有自己的生命周期,我们可以在这些重要时刻做一些自己想做的事情。

代码解释
class Vue {constructor(options) {this.$options = options;this.$data = options.data();// 在组件刚出生的时候,做一些事情this.callHook('beforeCreate');// 给组件的内部数据施魔法this.observe(this.$data);// 组件出生后,做一些事情this.callHook('created');this.render = options.render;// 在组件要被放到网页上之前,做一些事情this.callHook('beforeMount');this.mount();// 组件放到网页上之后,做一些事情this.callHook('mounted');}// 给数据施魔法的函数observe(obj) {if (typeof obj !== 'object' || obj === null) {return;}Object.keys(obj).forEach(key => {defineReactive(obj, key, obj[key]);});}// 把组件放到网页上mount() {const vnode = this.render();console.log('Rendering with vnode:', vnode);}// 调用生命周期钩子函数的函数callHook(hook) {const hooks = this.$options[hook];if (hooks) {hooks.forEach(hook => hook.call(this));}}
}// 咱们来创建一个组件试试
const vmOptions = {data() {return {message: 'Hello, Vue!'};},render() {return createVNode('div', null, [createVNode('p', null, this.$data.message)]);},beforeCreate() {console.log('Before create');},created() {console.log('Created');},beforeMount() {console.log('Before mount');},mounted() {console.log('Mounted');}
};const vm = new Vue(vmOptions);

通过这些“魔法道具”,Vue 就能帮咱们轻松地做出各种漂亮又好用的网页啦!

Vue的模板编译

啥是 Vue 的模板编译

咱先打个比方,你要给远方的朋友描述一个超级酷炫的机器人长啥样,要是用嘴说,可能说半天都说不清楚。但你要是画个详细的图纸,朋友一看就明白了。在 Vue 里,咱们写的那些 HTML 模板就像是描述机器人样子的语言,可计算机不咋懂这些,它更擅长理解 JavaScript 代码。所以模板编译就像是一个“翻译官”,把咱们写的 HTML 模板翻译成计算机能懂的 JavaScript 代码。

模板编译的步骤

1. 把模板字符串解析成 AST(抽象语法树)

这就好比你拿到一份复杂的建筑设计说明书,第一步得把它拆分成一个个小的零件说明,并且整理出它们之间的关系。在 Vue 里,就是把 HTML 模板字符串拆分成一个树形结构的对象,这个对象就是 AST。每个节点代表模板里的一个元素、属性或者文本。

比如说,有这样一个简单的 Vue 模板:

<div id="app"><p>Hello, {{ message }}</p>
</div>

经过解析后,AST 可能就会像这样(简化示意):

{tag: 'div',attrs: [{ name: 'id', value: 'app' }],children: [{tag: 'p',children: [{type: 2, // 表示文本插值expression: 'message',text: 'Hello, {{ message }}'}]}]
}

这里面,每个对象就是一个节点,tag 表示标签名,attrs 是标签的属性,children 是子节点。

2. 对 AST 进行优化

这一步就像是你盖房子,设计图纸出来后,要检查一下有没有可以优化的地方,比如某些结构可以简化,某些材料可以节省。在 Vue 里,就是找出 AST 里那些静态的节点(也就是不会随着数据变化而变化的节点),给它们做个标记。这样在后续的渲染过程中,就不用每次都重新处理这些静态节点了,能提高效率。

比如上面的模板里,<div><p> 标签本身不会变,只有 {{ message }} 会根据数据变化,所以 <div><p> 标签对应的 AST 节点就可以标记为静态节点。

3. 把优化后的 AST 生成渲染函数

这就好比根据优化后的建筑图纸,写出一份详细的施工方案,工人(计算机)拿到这个方案就能开始盖房子(渲染页面)了。在 Vue 里,就是把 AST 转换成 JavaScript 函数,这个函数返回的就是虚拟 DOM。

还是上面的例子,生成的渲染函数可能类似这样(简化示意):

function render() {return createVNode('div', { id: 'app' }, [createVNode('p', null, [createTextVNode('Hello, ' + this.message)])]);
}

这里的 createVNodecreateTextVNode 是用来创建虚拟 DOM 节点的函数。

模板编译的好处

  • 提高性能:通过把模板编译成 JavaScript 代码,计算机执行起来更快。而且优化 AST 能减少不必要的计算,提高渲染效率。
  • 方便维护:咱们写 HTML 模板的时候更符合人的习惯,而计算机执行的是编译后的 JavaScript 代码,分工明确,代码更易于维护。

总结

Vue 的模板编译就像是一个桥梁,把咱们写的 HTML 模板和计算机能懂的 JavaScript 代码连接起来,让我们可以更方便地开发网页,同时也让网页的渲染更高效。


文章转载自:

http://qrU43umv.yjknk.cn
http://305VTY0J.yjknk.cn
http://mSOOFWxT.yjknk.cn
http://Z9nmqBdR.yjknk.cn
http://1GfLrqyh.yjknk.cn
http://2KINHnOl.yjknk.cn
http://oTlsf7us.yjknk.cn
http://zvA75UBN.yjknk.cn
http://bHcnxmD4.yjknk.cn
http://m5EP3OIT.yjknk.cn
http://jbmq4roN.yjknk.cn
http://H4HXzQON.yjknk.cn
http://9vcmhFh5.yjknk.cn
http://NHeq3BbT.yjknk.cn
http://wGghghLB.yjknk.cn
http://GDLo7ng8.yjknk.cn
http://aQBlFevp.yjknk.cn
http://4TpSDwTI.yjknk.cn
http://lGgcY4Sm.yjknk.cn
http://imNEFR7o.yjknk.cn
http://yqFx7IX9.yjknk.cn
http://eZzg0jgU.yjknk.cn
http://9zqnuQ1Z.yjknk.cn
http://ESB0iACP.yjknk.cn
http://qHiOIL9O.yjknk.cn
http://RYbktfV8.yjknk.cn
http://GxVJ1V83.yjknk.cn
http://r5xNZgfL.yjknk.cn
http://m4gsI315.yjknk.cn
http://qxQq8j7j.yjknk.cn
http://www.dtcms.com/wzjs/755824.html

相关文章:

  • 建立企业网站的技能网站挂广告
  • 做网站可不可以模仿删除WordPress底部
  • 国家建设部网站注册工程师人员查询杭州巴顿品牌设计
  • 建设网站公司怎么建站小兽wordpress
  • 网站制作想法金华城乡建设网站
  • 深圳网站开发电话咸宁做网站公司
  • 导航网站教程vs做网站如何调试
  • 广州公司建设网站合肥做网站好的公司
  • 做网站和网页有区别吗网络营销的特点包括什么
  • 网站建设在国内外有何趋势一屏式网站有什么好处
  • 免费申请试用网站网站公司做网站
  • 金乡县住房与城乡建设局网站公司建立网站的优势
  • 点图片跳到网站怎么做在线设计房屋装修
  • 网站建设了解网站开发 理念怎么写
  • 怎样开建网站小说网站开发技术实现
  • 建设银行企业版网站认可服务好的装修公司
  • 网站开发好还要空间吗湖北医院网站建设
  • 网站正在建设中 敬请期待太原做网站需要多少钱
  • 旅游网站怎样做宣传关键词名词解释
  • 签订网站建设协议 注意事项营销型网站建设-深圳信科
  • 泰安网站建设公司哪家好网站备案 自己的服务器
  • 秦皇网站建设上海有几个区最好
  • 哪些设计网站可以赚钱网站建设公司的介绍
  • 做网站一般需要多少钱成都微信网站建设报价单
  • 迅速编程做网站网站建设相关书籍
  • ps建设此网站的必要与可行性网站制作预付款会计分录
  • 哈尔滨网站建设哪儿好薇网址输入入口
  • 院系网站建设郑州微信网站建设
  • wordpress博客二次元wordpress百度seo
  • 深圳市规划和自然资源局上海建站 seo