非非非标题党,干货预警!!!

介绍

大家好,我是清池交友 app 开发日记,记录清池交友 app 开发中学习过程和踩坑日记,伪全栈[1]

技术栈:前端 js,vue,uniapp,后端 java

尤大镇贴

先奉上 2013 年尤大写的 vue 的第一行代码来自:

github 源码地址镇贴:vue 官方仓库 0.1 分支 explorations/getset.html 文件[2]

引读:

  • 本篇文章,用 30 行代码实现 0.1 版本 vue,是参照尤大 2013 年,在 git 上传的 vue 的第一行代码(vue 的 0.1)版本代码思路实现的,尤大仅用 40 行代码就实现了 0.1 版本的 vue。

  • 为了更方便学习和交流,我们基于尤大的代码省略了一些内容,提取核心功能代码,调整了代码顺序,修改了部分变量命名,增加了注释,仅剩 30 行代码,更加简洁,直观的向大家展示 vue 的核心功能实现逻辑。

  • 本人也是个小菜鸟,整理本篇文章用了一天的时间,不足之处欢迎大家指正批评,文中代码的具体实现细节存在不严谨的地方,请大家忽略,本文仅用来交流 vue 的实现思想,并未深究细节。

正文:

实现逻辑简述

本文 30 行代码实现 vue,github 仓库地址[3]

本篇文章中代码仅实现了 vue 的核心功能数据绑定,未实现其他功能。

文中 html 可直接打开在浏览器中运行,查看效果

我们先用文字来简单描述下核心代码的实现逻辑

  1. 获取 vue 根结点的 dom,替换 dom 中的{{}}模板语法,并根据模板{{msg}}中使用 data 中的属性名称(msg)为其打上标志,方便之后寻找哪些 dom 使用了模板语法
  2. 记录模板语法中使用了 data 中的哪些属性,方便在这些值变化时更新 dom
  3. 遍历这些属性,并根属性名称找到对应的 dom,移除标志(标志用来寻找 dom,此时已经获得了 dom,所以移除标志)
  4. 拦截属性的 set、get 方法,在 set 属性时,更新 dom 的 textContent 实现数据变化更新视图的功能

代码实现

接下来看代码如下:

//实例化vueconst app = new vue('app', {msg: '清池丨干净的恋爱交友app'})//id: app//initData: {msg: "hello"}function vue(id, initData) {  //vue中一般都包含el属性,代表vue实例对应的dom元素  const vueDom = this.el = document.getElementById(id) //获取 #app dom 
...

//vue的data属性,尾部为data赋值 const data = this.data = {} //定义常量,用来标示需要数据绑定的dom元素使用 const bindingMark = 'bind-dom-flag' //定义临时变量来存储模板中使用了data中的值的列表 const dataAttrs = {} //替换#app dom中的模板内容 vueDom.innerHTML = vueDom.innerHTML.replace(/{{(.*)}}/g, (match, dataAttrName) => { //用来记录模板中使用了data中的哪些值,本案例模板中只使用data中的msg dataAttrs[dataAttrName] = {} // {msg: {}} //给使用了模板的dom打上标志,bindingMark = data中的值msg,以便将这些dom放进 dataAttrs 中 return ' + bindingMark + '="' + dataAttrName + '">' }) //遍历dom中使用的data属性 for (const dataAttrName in dataAttrs) { //获取data对应的dom列表 const doms = vueDom.querySelectorAll('[' + bindingMark + '="' + dataAttrName + '"]') //移除dom上的标志,标志用来获取dom列表,获取后就可以将标志删除了 doms.forEach((e) => { e.removeAttribute(bindingMark) }) //获取定义临时变量中的 dataAttr 对象,defineProperty实现数据绑定需要借助这个对象来实现 const dataAttrObj = dataAttrs[dataAttrName] //劫持data属性的set,get方法 Object.defineProperty(data, dataAttrName, { get() { //返回临时变量dataAttr中的attr return dataAttrObj.val }, set(newVal) { //更新data中此属性对应的所有dom,更新所有模板中使用了msg的dom doms.forEach((dom) => { dataAttrObj.val = dom.textContent = newVal }) } }) } //将外部传入的初始化值赋值给vue实例的data属性 for (const dataAttrName in initData) { //赋值,触发set,更新dom this.data[dataAttrName] = initData[dataAttrName] }}

html 如下:

{{msg}}

{{msg}}

{{msg}}

结尾总结:

看完本篇文章,相信大家对 vue 的基本原理和实现方式都能有一个清晰的认识了吧,赶紧动手去撸一个 mini-vue 吧,这已经是面试中必不可少的试题了

文中不足之处欢迎大家指正批评,有需要交流的问题也欢迎大家踊跃留言。


清池 app 开发日记是记录清池 app 开发中学习过程和踩坑日记,清池 app 目前有 20w+注册用户,3000 日活,主要用户年龄在 16-23 之间[4]

如果您对一款社交软件从 0-0.1 的成长过程中遇到的趣事和技术问题感兴趣,欢迎关注我们的公众号,我们一同成长

我们的技术栈,伪全栈,前端 js,vue,uniapp,后端 java

清池 app 官网:https://www.qingchi1.com[5]

关于和联系我们:https://www.qingchi1.com/about[6]

公众号:qingchiapp,(关注公众号获取清池 app 项目的开源代码,星空话缘,原谅这个名字是之前的,以后会改成清池 app 开发日记)

交友群+v:qingchizh,群内男女比例 1:5-10,女生免费,男生收费

清池app开发日记
欢迎大家点击体验清池app小程序,干净的恋爱交友软件

参考资料

[1]

大家好,我是清池交友 app 开发日记,记录清池交友 app 开发中学习过程和踩坑日记,伪全栈: https://www.qingchi1.com/about

[2]

github 源码地址镇贴:vue 官方仓库 0.1 分支 explorations/getset.html 文件: https://github.com/vuejs/vue/blob/871ed9126639c9128c18bb2f19e6afd42c0c5ad9/explorations/getset.html

[3]

本文 30 行代码实现 vue,github 仓库地址: https://github.com/qingchiapp/30line-mini-vue/blob/master/vue01.html

[4]

清池 app 开发日记是记录清池 app 开发中学习过程和踩坑日记,清池 app 目前有 20w+注册用户,3000 日活,主要用户年龄在 16-23 之间: https://www.qingchi1.com/about

[5]

https://www.qingchi1.com: https://www.qingchi1.com

[6]

https://www.qingchi1.com/about: https://www.qingchi1.com/about

thymealf如何实现传单个变量给html_梦回2013,看尤大vue的第一行代码,如何用30行代码实现vue(超简洁,适合初学者)...相关推荐

  1. thymealf如何实现传单个变量给html_纯前端使用JavaScript发送电子邮件,5个步骤图文教程...

    你不需要使用任何后端语言,如 PHP 或 Python.此外,你甚至不需要Node.js! 有很多方法可以读取这些数据.你可以将你的表单与数据库(如MySQL)连接,然后从数据库中读取传入的信息.好吧 ...

  2. thymealf如何实现传单个变量给html_如何远程读取西门子PLC数据?

    随着工业的发展,PLC联网进行远程监控.远程运维的需求越来越多,通常是通过PLC的通信口外接一个联网模块来实现.很多企业自动化产品与非标自动化产品安装现场地处偏僻,没有网络怎么办?随着本地通信控制的局 ...

  3. thymealf如何实现传单个变量给html_50个关于IPython的奇技淫巧

    什么是IPython?可能很多人已经在用,却不知道它到底是什么. 根据维基百科的解释: IPython是一种基于Python的交互式解释器,提供了强大的编辑和交互功能. IPython拥有: 满足你各 ...

  4. R语言dataframe创建新的特征(变量)、行加和特征、行均值特征(基于加减乘除、指数、模数等操作符)、创建新的特征(变量)、生成编码特征(基于比较操作符、逻辑操作符)

    R语言dataframe创建新的特征(变量).行加和特征.行均值特征(基于加减乘除.指数.模数等操作符).为dataframe创建新的特征(变量).生成编码特征(基于比较操作符.逻辑操作符) 目录

  5. [JAVA基础] 成员变量和局部变量(一看就懂的总结归纳篇)

    引言 成员变量和局部变量在每种编程语言中都有涉及,如果之前了解过其他语言的成员变量或者局部变量,那么在学习java中的成员变量和局部变量时可以看看有那些联系和不同,这一块的东西也不能说难,如果第一次接 ...

  6. 5 修改request对象变量_【总结】前端5大常见设计模式,代码一看你就懂!

    前言 今天主要介绍一下我们平常会经常用到的设计模式,设计模式总的来说有23种,而设计模式在前端中又该怎么运用呢,接下来主要对比较前端中常见的设计模式做一个介绍. 设计模式的定义 设计模式是在面向对象软 ...

  7. pip环境变量配置 python3.6_零基础学python之爬虫第一节环境配置第一章:Python3+Pip环境配置...

    大家好,本节课讲解有关Python环境安装的一个过程,学习Python爬虫的话,第一步就要安装Python的一个环境安装以及配置!那安装的Python是Python3,安装的过程呢还会对一个Pytho ...

  8. IDEA代码复制到Notion,代码类型与变量之间的空格消失了。

    如果我们是如下图一样的赋值代码,再到我们的Notion软件粘贴,将会变成第二张图一样, Notion内的代码中,变量类型与变量名之间的空格全部消失了.我们可以在idea复制代码的时候就,选择复制为纯文 ...

  9. 环境变量是什么?一看就懂

    环境变量到底是个啥 一.环境变量介绍 二.富翁的房子 二.富翁的爱好 三.神奇管家 四.配置环境变量 一.环境变量介绍 相信你和我一样,第一次都被这个词搞晕了,不用担心,看完你就学会了.现在暂时先忘记 ...

最新文章

  1. 马哥运维架构 第一周作业
  2. InsightFace tensorRT
  3. 少儿python编程培训-全国少儿人工智能Python编程兴趣班
  4. 2018年4月java自考真题,全国2018年4月自考互联网数据库考试真题
  5. buu [GXYCTF2019]CheckIn
  6. sql增删改查_快速搞定数据库增删改查|附思维导图
  7. 用PyTorch创建一个图像分类器?So easy!(Part 1)
  8. layui外部引入_javascript 怎么去引用layui里面的方法
  9. Netcore 读取body数据
  10. Linux 常用软件分类
  11. ol+天地图+geoserver_天地图离线瓦片的打包与发布(GeoServer)
  12. 带串口功能的51最小系统板,可直接烧录STC芯片,简约好用,Micro接口,只需要一根Micro接口的USB线接到电脑就可以下载程序了。
  13. SMB协议的共享文件读写
  14. 华为隐藏功能扩大内存代码大全_华为手机隐藏功能代码大 | 手游网游页游攻略大全...
  15. content=IE=Edge
  16. 百度有啊前端框架分析(自定义事件)
  17. python学习之心路历程
  18. Java响应式编程基础-响应式流
  19. Client network socket disconnected before secure TLS connection was established
  20. 基于tiny4412的u-boot移植(二)_ git clone

热门文章

  1. php 正则匹配静态资源,Struts2 配置静态资源文件不经过Strut处理(正则匹配)
  2. 怎么把python模型部署到线上_如何将机器学习模型成功部署到.Net环境中
  3. 安卓系统挂载NTFS格式硬盘_苹果电脑挥之不去的烦恼!怎样兼容NTFS格式的U盘移动硬盘?...
  4. 数字图像处理学习笔记(三):ORB算法(尺度不变特征变换)Oriented FAST and Rotated BRIEF
  5. VMware14.1 Ubuntu16.04安装教程
  6. windows7 安装MySQL 解决报错 服务没有响应控制功能
  7. Linux 源码安装 Python3 和 pip3
  8. Spring Data JPA 从入门到精通~JpaSpecificationExecutor实现原理
  9. C++学习之路 | PTA乙级——1090 危险品装箱 (25 分)(精简)
  10. 1079 Total Sales of Supply Chain(甲级)