Vue2源码解析-双向绑定

两个文件,一个html,一个js。

<body><div id="app"><h1>{{str}}</h1><input type="text" v-model="str"></div>
</body>
<script src="./Vue.js"></script>
<script>new Vue({el: '#app',data: {str: "你好"}})
</script>
class Vue {constructor(options) {this.$options = options;this.$watchEvent = {};this.$data = options.data;this.$el = document.querySelector(options.el);// 数据劫持this.proxyData()// 数据监听this.ovserve()// 编译模板this.compile(this.$el);}proxyData() {// 1.给Vue实例赋熟悉,来自于data// 2.data中的属性和Vue实例的属性是一一对应的(劫持)for (let key in this.$data) {Object.defineProperty(this, key, {get() {return this.$data[key];},set(val) {this.$data[key] = val;}})}}// 触发data中的数据发生变化来执行watch中的updateovserve() {for (let key in this.$data) {let value = this.$data[key];let that = this;Object.defineProperty(this.$data, key, {get() {return value;},set(val) {value = val;if (that.$watchEvent[key]) {that.$watchEvent[key].forEach((item, index) => {item.update();})}}})}}compile(node) {node.childNodes.forEach((item, index) => {// 判断节点类型console.log(item);// 1===元素节点if (item.nodeType === 1) {// 判断是否绑定了v-modelif (item.hasAttribute("v-model")) {let vmKey = item.getAttribute("v-model").trim();if (this.hasOwnProperty(vmKey)) {item.value = this[vmKey];}item.addEventListener('input', (event) => {this[vmKey] = event.target.value;})}if (item.childNodes.length > 0) {this.compile(item);}}// 2===属性节点else if (item.nodeType === 2) { }// 3===文本节点else if (item.nodeType === 3) {let reg = /\{\{(.*?)\}\}/g;let text = item.textContent;item.textContent = text.replace(reg, (match, key) => {key = key.trim();// 判断是否是data中的属性if (this.hasOwnProperty(key)) {let watcher = new Watche(this, key, item, "textContent")// 检查当前对象是否已经有一个名为key的属性,用于存储观察者(watcher)列表if (this.$watchEvent[key]) {this.$watchEvent[key].push(watcher);}// 如果当前对象已经有一个名为key的属性,则将新创建的watcher添加到该属性中else {this.$watchEvent[key] = [];this.$watchEvent[key].push(watcher);}}return this.$data[key];})}})}
}class Watche {/*** @function 构造函数 * @param {*} vm 对象* @param {*} key 属性名称* @param {*} node 节点* @param {*} attr 改变文本节点内容的字符串*/constructor(vm, key, node, attr) {this.vm = vm;this.key = key;this.node = node;this.attr = attr;}update() {// 更新文本节点的内容this.node[this.attr] = this.vm.$data[this.key];}
}

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

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

相关文章

Hive-因精度丢失导致的 join 数据异常

一、问题复现 不知你是否遇到过 join 结果明显不匹配的情况&#xff0c;例如on t1.join_key t2.join_key中两个join_key明显不相等&#xff0c;但 join 的结果却将其匹配在一起。今日博主在通过用户 id 关联获取用户信息时发现一个用户 id 可以在用户维表中匹配出若干条&…

学生如何获取SOLIDWORKS产品技术支持

在当今日益复杂的学习环境中&#xff0c;技术软件如SOLIDWORKS已成为工程设计和制造类专业学生的重要工具。然而&#xff0c;面对这款功能强大的软件&#xff0c;学生们在使用过程中难免会遇到各种技术难题。那么&#xff0c;作为学生&#xff0c;我们该如何获取SOLIDWORKS产品…

thinkphp5独立验证规则

自己写独立的验证器&#xff0c;类中调用该验证器验证&#xff0c;这方面的验证器&#xff0c;可以很好的建造验证层&#xff0c;且可以在多种项目中复用 编写 创建base.php protected function isPositiveInteger($value, $rule, $data, $field){$request Request::instan…

imx6ull - 制作烧录SD卡

1、参考NXP官方的手册《i.MX_Linux_Users_Guide.pdf》的这一章节&#xff1a; 1、SD卡分区 提示&#xff1a;我们常用的SD卡一个扇区的大小是512字节。 先说一下i.MX6ULL使用SD卡启动时的分区情况&#xff0c;NXP官方给的镜像布局结构如下所示&#xff1a; 可以看到&#xff0c…

IDEA 2023的激活与安装指南

一、引言 IntelliJ IDEA&#xff08;以下简称IDEA&#xff09;是一款由JetBrains公司开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;广泛用于Java开发以及其他语言的开发。每年&#xff0c;JetBrains都会发布新的版本&#xff0c;带来更多功能和改进。本文将介绍…

机器人控制系列教程之D-H参数建模法

机器人运动学的研究依赖于机器人的模型的建立&#xff0c;目前较为多见的两种方法分别是Denavit-Hartenberg建模法&#xff08;简称&#xff1a;D-H建模法&#xff09;。该方法时由Denavit和Hartenberg于19955年提出的一种为关节链中的每一个杆件建立一个坐标系的矩阵方法&…

LeetCode-131 分割回文串

LeetCode-131 分割回文串 题目描述解题思路C 代码 题目描述 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串。返回 s 所有可能的分割方案。 示例 1&#xff1a; 输入&#xff1a;s “aab” 输出&#xff1a;[[“a”,“a”,“b”],…

HTML跳动的爱心

目录 写在前面 HTML简介 跳动的爱心 代码分析 运行结果

AI大模型简史:萌芽、沉淀、爆发!

近一年来&#xff0c;随着ChatGPT爆火&#xff0c;大模型热潮席卷全球并持续升温&#xff0c;国内越来越多的知名高校、科研院所和创新型企业加大研究力度&#xff0c;大模型技术不断迭代升级&#xff0c;模型能力不断加强&#xff0c;逐渐形成从底层算力、模型开发到行业应用的…

第9周 基于MinIO与OSS实现分布式与云存储

第9周 基于MinIO与OSS实现分布式与云存储 1. 基于mybatis-plus数据修改非空属性忽略更新2. 文件上传3. 分布式文件存储3.1 文件存储架构演变4. Minio docker安装5. 文件服务整合minio依赖minio API测试yml配置minio信息minio配置类业务:上传文件6. 云存储阿里OSS:要钱6.1 依赖6…

蓝桥杯--LCA1

树上前缀和LCA 暴力做法&#xff1a; 我们先把不删的sum维护出来&#xff0c;然后遍历跳过的点&#xff0c;假如a1,a2,a3&#xff0c;跳过2&#xff0c;那么答案就是sum-cost(a1,a2)-cost(a2,a3)cost(a1,a3). DFS暴力&#xff0c;下面是代码&#xff1a; #include<bits/s…

后端使用jar包部署完成后,前端访问不了,可以试试这个方法

这个项目我在部署完之后发现系统前端页面能出来&#xff0c;但是接口不通。报错404&#xff0c;那么这个时候你就要考虑你后端使用的端口是否开放&#xff0c;因为我这里是遇到了这个问题&#xff1a;我后端用的是5400端口&#xff0c;但是我检查后发现5400端口没有被开放&…

【Unity脚本】使用脚本操作游戏对象的组件

【知识链】Unity -> Unity脚本 -> 游戏对象 -> 组件 【知识链】Unity -> Unity界面 -> Inspector【摘要】本文介绍如何使用脚本添加、删除组件&#xff0c;以及如何访问组件 文章目录 引言第一章 游戏对象与组件1.1什么是组件&#xff1f;1.2 场景、游戏对象与组…

php使用openssl返回false报错0308010C

本地php使用openssl返回false, 但是在服务器上测试正常openssl_encrypt($jsonStr, DES-ECB, $key, OPENSSL_RAW_DATA, ); 查看错误 openssl_error_string(); error:0308010C:digital envelope routines::unsupported 原因是: 服务器上的openssl是1.1版本, 本地是3.0版本 通…

Imgs,GT,Edge,Gradient_all,Gradient_Foreground

保存一下&#xff1a; 做个记录&#xff1a; import cv2 import os import numpy as np# 对整张图片做canny检测 得到纹理图 def canny_all(input_path, output_path):# 遍历文件夹中的所有文件for filename in os.listdir(input_path):# 构造完整的文件路径image_path os.p…

GB-T 42929-2023 互联网金融智能风险防控技术要求

GB-T 42929-2023 互联网金融智能风险防控技术要求 互联网金融作为金融创新的重要领域&#xff0c;近年来发展迅猛&#xff0c;但同时也带来了诸多风险和挑战。为了规范互联网金融行业的健康发展&#xff0c;提高风险防控能力&#xff0c;中国国家标准委员会制定了《GB-T 42929…

C++回调函数

#include <iostream> #include <functional> // 为了使用 std::function // 声明一个回调函数类型 typedef std::function<void()> Callback11;// 调用函数&#xff0c;它接受一个回调函数作为参数 void process(Callback11 callback123) {// 在这里执…

直播领域新宠—第三代大模型无人直播系统:提升销售业绩的秘密武器

随着科技的飞速发展和人们对智能化生活的追求&#xff0c;直播领域也迎来了革新性的突破。第三代大模型无人直播系统&#xff0c;作为直播领域的新宠&#xff0c;正以其独特的魅力和优势&#xff0c;成为提升销售业绩的秘密武器。 首先&#xff0c;第三代大模型无人直播系统具…

2024山软创新实训:软件系统架构

软件架构 本文着重介绍本应用&#xff1a;基于开源LLM的易学大模型软件系统的架构。在经过2个月的探索、选型、实验、开发后&#xff0c;我们团队终于把整个系统的各块拼图搭建了起来&#xff0c;现在剩下的是集成、评测、优化和部署的工作。 1. Distributed System 整个项目…

5月31日,每日信息差

第一、小米汽车官方宣布&#xff0c;5 月新增 9 家门店&#xff0c;目前已在全国 30 城开业 70 家门店&#xff0c;6 月计划新增 19 家 第二、科技巨头谷歌、Meta、微软、AMD、英特尔、博通、思科和惠普成立了一个名为 「超级加速链路」 的联盟&#xff08;UALink&#xff09;…