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

e059ed1d356ef088089e13bfdb7cc90b.png

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

介绍

大家好,我是清池交友 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,女生免费,男生收费

1ce9745977ab985f7aad441aa6a1ffb9.png
清池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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/504422.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode笔记】142. 环形链表 II(Java、快慢指针)

文章目录题目描述思路 & 代码更新版三刷 - 再更新题目描述 相对于环形链表,这里要求找到环的起点难点在于 O(1),否则可以直接哈希表冲 思路 & 代码 找出快慢指针的路程关系,得出结论(详见代码注释) /*** …

python找出在原图中的位置_Python 通过截图匹配原图中的位置(opencv)实例

安装依赖 1)下载安装opencv-2.4.9,并将cv2.pyd拷贝到python安装目录的site-package下 2)pip install numpy 3)pip install aircv 准备一张原图和截图 原图截图代码 import cv2 import aircv as ac # print circle_center_pos def …

【LeetCode笔记】287. 寻找重复数(Java、快慢指针、原地、链表)

文章目录题目描述思路 & 代码更新题目描述 可以理解成数组版本的 环形链表 II更多详细思路可见以上超链接。 思路 & 代码 如何转化成逻辑上的链表?nums[i] 是 第 i 个结点的 next 指针构造成一个有 nums.length - 重复次数 个结点的链表如此&#xff0…

【LeetCode笔记】338. 比特位计数(Java、位运算、动态规划)

文章目录题目描述思路 & 代码无注释二刷题目描述 难点在于 O(n) 思路 & 代码 理解题意,分析出 O(n) 复杂度应该是要用到之前的值来得到当前值——动态规划核心结论:奇数比前一个数多一个1,偶数和偶数除二后的数的1数量一样边界 &…

【LeetCode笔记】560. 和为K的子数组(Java、前缀和、哈希表)

文章目录题目描述思路 & 代码暴力法 O(n2n^2n2)前缀和 哈希表 O(n)二刷题目描述 第一道前缀和题目~ 思路 & 代码 暴力法 O(n2n^2n2) 固定一个值,从后往前找满足的条件即可 class Solution {public int subarraySum(int[] nums, int k) {i…

caffe不支持relu6_国产AI框架再进化!百度Paddle Lite发布:率先支持华为NPU在线编译,全新架构更多硬件支持...

乾明 边策 发自 凹非寺 量子位 报道 | 公众号 QbitAI国产AI框架飞桨刚刚带来新进化:Paddle Lite正式发布!高扩展、高性能、轻量化,还是首个支持华为NPU在线编译的深度学习端侧推理框架,剑指加大力度攻占移动端侧场景。而且大环境如…

【LeetCode笔记】1143. 最长公共子序列(Java、动态规划、字符串)

文章目录题目描述思路 & 代码二刷三刷题目描述 算是很高频的面试题了,而且题号还挺后的 思路 & 代码 注意:dp[i]][j] 和 charAt(i) 有1的下标差(dp初始化边界)核心思想:当前值可构成新的最大子串就左上角值…

【LeetCode笔记】139. 单词拆分(Java、动态规划、字符串、哈希表)

文章目录题目描述思路 & 代码二刷更新题目描述 漏网之题。。一个月前写的居然没写博客 思路 & 代码 HashSet 存储 word,便于查询动态规划三要素在注释中思路:如果dp[j] true且[j1,i]可以组成单词,则dp[i] true class Solution…

mysqlfor循环中出错继续_Python学习笔记(循环)

循环语句1. while 循环while语句最基本的形式包括一个位于顶部的布尔表达式&#xff0c;一个或多个属于while代码块的缩进语句。while 布尔表达式:代码块while循环的代码块会一直循环执行&#xff0c;直到布尔表达式的值为布尔假。如果布尔表达式不带有<、>、、&#xff…

bootstrap table格式化字符串_你要的PHP字符串处理函数都在这了!

php中文网最新课程每日17点准时技术干货分享打印输出函数说明echo输出一个或多个字符串print输出字符串printf输出格式化字符串sprintfReturn a formatted stringfprintf将格式化后的字符串写入到流sscanf根据指定格式解析输入的字符vfprintf将格式化字符串写入流vprintf输出格…

【LeetCode笔记】35. 搜索插入位置(Java、二分法)

文章目录题目描述思路 & 代码Summary二刷题目描述 考虑了一下&#xff0c;还是把这道题作为单独一篇文了。主要是配合这篇题解一起理解二分法&#xff0c;实践太少理解还不够透彻&#xff0c;还是要温故知新 思路 & 代码 先贴代码&#xff0c;结合注释和下面的总结…

【LeetCode笔记】300. 最长递增子序列(Java、动态规划、二分法、贪心)

文章目录题目描述思路 & 代码动态规划 O(n2n^2n2)动态规划 二分法 贪心 O(nlognnlognnlogn)二刷题目描述 难点在于时间复杂度 O(n * logn&#xff09;的做法 思路 & 代码 动态规划 O(n2n^2n2) 先抛砖引玉啦&#xff5e;dp[i]&#xff1a;以 nums[i] 结尾的子序…

zabbix内网安装部署_zabbix2.4.8升级3.0.31操作部署记录

1. 安装软件准备1.1. 软件准备1.zabbix-2.4.8.tar.gz zabbix-3.0.31.tar.gz下载地址&#xff1a;https://www.zabbix.com/download2.php5.4.16.tar.gz下载地址&#xff1a;https://www.php.net/downloads.php1.2. 注意事项安装过程路径、密码尽量不要出现中文、特殊字符、空格、…

【LeetCode笔记】剑指 Offer 03. 数组中重复的数字(Java、哈希表、原地算法)

文章目录题目描述思路 & 代码二刷题目描述 倒是和leetcode 287 寻找重复数很像。。但是不能使用那道题的快慢指针法&#xff08;也可能是我太菜了&#xff09;重点在于题干的描述【长度为 n 的数组&#xff0c;数字范围【0 &#xff5e; n - 1】 思路 & 代码 可以直…

回归问题的置信区间AUC_互助问答第193期:倾向得分匹配法与面板数据问题

问题一&#xff1a;老师您好&#xff01;我的问题是倾向得分匹配法之前要对匹配变量进行选择&#xff0c;我看见连玉君老师的一篇文章中主要是对处理变量和匹配变量做logit回归&#xff0c;然后根据准R方和AUC值判断&#xff0c;两者越大越好&#xff0c;通常来说AUC应该大于0.…

【LeetCode笔记】剑指 Offer 06. 从尾到头打印链表(Java、翻转链表)

文章目录题目描述思路 & 代码二刷题目描述 思路 & 代码 一次遍历&#xff1a;翻转链表 记录长度二次遍历&#xff1a;遍历翻转后的链表&#xff0c;更新数组O(n) & O(1) /*** Definition for singly-linked list.* public class ListNode {* int val;* …

guns 最新开源框架企业版下载_国内比较火的5款Java微服务开源项目

本文介绍国内比较火的5款Java微服务开源项目&#xff0c;pig是基于Spring Cloud、OAuth2.0、Vue的前后端分离的系统。 通用RBAC权限设计及其数据权限和分库分表 支持服务限流、动态路由、灰度发布、 支持常见登录方式&#xff0c; 多系统SSO登录。作者&#xff1a;程序员杨目录…

【LeetCode笔记】剑指 Offer 10-I. 斐波那契数列 (Java、递归、动态规划)

文章目录题目描述思路 & 代码递归动态规划二刷题目描述 呃&#xff5e;说来尴尬&#xff0c;在简单题栽跟头了 &#xff08;超时&#xff09;一般来说&#xff0c;这玩意是递归教学题了。但实际上会有很多重复的冗余步骤&#xff0c;实际上用动态规划效率会更高 思路 &…

addeventlistener事件参数_Vue的钩子事件和程序化侦听

对于Vue的事件机制&#xff0c;其实有一些高级技巧&#xff0c;我们最好能够掌握。一、组件的生命周期钩子事件Vue的生命周期函数&#xff0c;其实就是Vue开发者设定的一些hook钩子&#xff0c;你只要往hook里面编写代码&#xff0c;它就可以执行。如vue实例里的beforeCreate、…

【LeetCode笔记】剑指 Offer 13-. 机器人的运动范围 (Java、dfs)

文章目录题目描述思路 & 代码二刷题目描述 注意点&#xff1a;满足数位和大于 k 的格子&#xff0c;不一定可以从 [0, 0] 走到&#xff0c;因此实际上不满足条件 思路 & 代码 考虑到可达性问题&#xff0c;决定用 dfs 来一个个走&#xff0c;不能走 or 走过了就 re…