好家伙,狠狠地补一下代码量

 

本篇我们来尝试使用原生js实现vue的响应式

使用原生js,即代表没有v-bind,v-on,也没有v-model,所有语法糖我们都用原生实现

1.给输入框绑个变量

<body>
<input id="input_1"></input>
</body>
<script>
let datavalue = "66666"
const input_1 = document.getElementById("input_1")
input_1.value = datavalue
input_1.addEventListener('input', function(e) {
datavalue = e.target.value
console.log(datavalue)
}) </script>

 

诶,似乎这样就完成了

但我们要让他更像vue

2.加上Dep,Watcher

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<input id="input_1"></input>
</body>
<script>
// 模拟 Vue 实例
let data = {
message: 'Hello'
};
const input_1 = document.getElementById("input_1")
input_1.value = data.message
input_1.addEventListener('input', function (e) {
e.target.value = data.message
console.log(datavalue)
}) function defineReactive(obj, key, value) {
let dep = new Dep(); // 依赖容器 Object.defineProperty(obj, key, {
get: function () {
if (Dep.target) {
dep.addDep(Dep.target);
}
return value;
},
set: function (newValue) {
value = newValue;
dep.notify();
}
});
} // 依赖容器
function Dep() {
this.deps = []; this.addDep = function (dep) {
this.deps.push(dep);
}; this.notify = function () {
this.deps.forEach(dep => {
dep.update();
});
};
} Dep.target = null; // Watcher
function Watcher(updateFunc) {
this.update = updateFunc;
} // 初始化响应式数据
defineReactive(data, 'message', data.message); // 模拟 Watcher
let watcher = new Watcher(function () {
console.log('Message updated:', data.message);
input_1.value = data.message
}); // 模拟视图更新
Dep.target = watcher;
data.message; // 触发依赖收集
setTimeout(() => {
data.message = '6666'; //触发更新
}, 1000)
</script> </html>

3.效果图

 

4.代码解释

  1. defineReactive 函数用来定义一个响应式属性,其中通过 Object.defineProperty 给属性添加 getter 和 setter 方法。在 getter 方法中,会判断 Dep.target 是否存在,如果存在则将当前 Watcher 对象添加到依赖容器 Dep 中;在 setter 方法中,更新属性的值,并通过依赖容器 Dep 的 notify 方法通知所有依赖的 Watcher 进行更新。

  2. Dep 函数是一个简单的依赖容器,其中包含了一个 deps 数组用来存储依赖(Watcher),addDep 方法用来添加依赖,notify 方法用来通知所有依赖进行更新。

  3. Watcher 函数用来创建 Watcher 对象,其中包含一个 update 方法,用来在属性发生变化时执行相应的更新操作。

  4. 在初始化响应式数据时,调用 defineReactive 函数定义了一个名为 message 的响应式属性。

  5. 创建了一个 Watcher 对象 watcher,并在其构造函数中定义了一个回调函数,用来在属性变化时输出消息并更新视图。

  6. 将 watcher 赋值给 Dep.target,然后访问 data.message,触发依赖收集,将 watcher 添加到依赖容器 Dep 中。

5.补充

一张响应式原理图

 

第142篇:原生js实现响应式原理的更多相关文章

  1. 原生js实现响应式轮播图,支持电脑端点击切图,手机端滑动切图

    轮播图的实现原理并不难,但是步骤有些繁琐.最近练习了一个轮播图,大部分是跟着网上的教程写的,然后自己做了一点兼容ie8的修改,加了点击切换图片的特效和手机端的滑动特效,让这个轮播图可以在响应式的网站中 ...

  2. Vue.js响应式原理

      写在前面 因为对Vue.js很感兴趣,而且平时工作的技术栈也是Vue.js,这几个月花了些时间研究学习了一下Vue.js源码,并做了总结与输出. 文章的原地址:answershuto/learnV ...

  3. Glide.js:响应式 & 触摸友好的 jQuery 滑块插件

    Glide.js 是一款响应式和对触摸友好的 jQuery 滑块.基于 CSS3 转换实现,并在低版本浏览器降级处理.Glide.js 简单,重量轻,快速,适用于智能手机,平板电脑和台式机.它支持 s ...

  4. Vue.js学习 Item12 – 内部响应式原理探究

    深入响应式原理 大部分的基础内容我们已经讲到了,现在讲点底层内容.Vue.js 最显著的一个功能是响应系统 —— 模型只是普通对象,修改它则更新视图.这让状态管理非常简单且直观,不过理解它的原理也很重 ...

  5. 利用JS去做响应式布局

    利用JS去做响应式布局 js动态改变布局方式 // 取浏览器可视区高宽 var lw = $(window).width(); var lh = $(window).height();// 页面加载完 ...

  6. vue.js响应式原理解析与实现

    vue.js响应式原理解析与实现 从很久之前就已经接触过了angularjs了,当时就已经了解到,angularjs是通过脏检查来实现数据监测以及页面更新渲染.之后,再接触了vue.js,当时也一度很 ...

  7. 深入解析vue.js响应式原理与实现

    vue.js响应式原理解析与实现.angularjs是通过脏检查来实现数据监测以及页面更新渲染.之后,再接触了vue.js,当时也一度很好奇vue.js是如何监测数据更新并且重新渲染页面.vue.js ...

  8. 详解Vue响应式原理

    摘要: 搞懂Vue响应式原理! 作者:浪里行舟 原文:深入浅出Vue响应式原理 Fundebug经授权转载,版权归原作者所有. 前言 Vue 最独特的特性之一,是其非侵入性的响应式系统.数据模型仅仅是 ...

  9. Vue 源码解读(3)—— 响应式原理

    前言 上一篇文章 Vue 源码解读(2)-- Vue 初始化过程 详细讲解了 Vue 的初始化过程,明白了 new Vue(options) 都做了什么,其中关于 数据响应式 的实现用一句话简单的带过 ...

  10. vue深入响应式原理

    vue深入响应式原理 深入响应式原理 — Vue.jshttps://cn.vuejs.org/v2/guide/reactivity.html 注意:这里说的响应式不是bootsharp那种前端UI ...

随机推荐

  1. Unity的SpriteAtlas实践

    我的环境 Unity引擎版本:Unity2019.3.7f1 AssetBundles-Browser 于2021-1-14拉取,github上最后提交日期是2019-12-14,在本文简称:ABBr ...

  2. 声明式API和命令式API的区别

    声明式API 声明式和命令式的对比 Kubernetes 声明式 API 的工作原理 参考 声明式API 声明式和命令式的对比 命令式 命令式有时也称为指令式,命令式的场景下,计算机只会机械的完成指定 ...

  3. 21.7 Python 使用Request库

    Request库可以用来发送各种HTTP请求,该框架的特点是简单易用,同时支持同步和异步请求,支持HTTP协议的各种方法和重定向.它还支持Cookie.HTTPS和认证等特性. Request库的使用 ...

  4. Python 实现SynFlood洪水攻击

    Syn-Flood攻击属于TCP攻击,Flood类攻击中最常见,危害最大的是Syn-Flood攻击,也是历史最悠久的攻击之一,该攻击属于半开放攻击,攻击实现原理就是通过发送大量半连接状态的数据包,从而 ...

  5. 7000字详解Spring Boot项目集成RabbitMQ实战以及坑点分析

    本文给大家介绍一下在 Spring Boot 项目中如何集成消息队列 RabbitMQ,包含对 RibbitMQ 的架构介绍.应用场景.坑点解析以及代码实战.最后文末有免费领取龙年红包封面以及腾讯云社 ...

  6. 盘点下4个Winform UI开源控件库

    今天一起来盘点下4个Winform UI开源控件库,有.Net Framework,也有.Net Core. 1.支持.Net 7的开源UI组件框架 项目简介 这是一个基于.Net Framework ...

  7. ThinkPHP 6.0 SQL注入漏洞修复

    公司买的官网被政府网安检测出SQL注入漏洞: 隐患描述 SQL漏洞证明语句: python3 sqlmap.py -u "http://xxxx?keywords=1" -p ke ...

  8. Python-pymysql查询MySQL的表

    一.安装pymysql py -m pip install pymysql; 二.创建表并插入数据 CREATE TABLE `course` ( `course_id` varchar(10) DE ...

  9. 程序员应该掌握的一些 Linux 命令

    程序员应该掌握的一些 Linux 命令 作为一名后端开发,跟服务器的交流必不可少,刚好最近跟服务器打交道比较多,所以就汇总整理一下 Linux 下那些程序员经常需要使用的命令,掌握这些命令基本上可以在 ...

  10. NC51111 Atlantis

    题目链接 题目 题目描述 There are several ancient Greek texts that contain descriptions of the fabled island At ...