前言
本篇博客源于对Vue和React框架中响应式系统的好奇与探索。若文中存在任何错误或有更优的解决方案,欢迎各位读者不吝指正,让我们一起学习,共同进步。
1. 什么是响应式系统
响应式系统是一种编程范式,它允许数据的变化自动地反映在用户界面上。Vue和React等现代前端框架都使用了响应式系统来简化数据驱动的开发。
2. 实现一个简单的响应式系统
在这篇博客中,我们将实现一个简单的响应式系统。这个系统包括以下几个部分:
(1) 数据代理:通过Proxy
对象来拦截对数据的访问和修改。
(2) 副作用函数:当数据变化时,自动执行相关的副作用函数。
(3) 调度执行:在数据变化时,调度执行副作用函数。
3. 代码实现
3.1 初始化项目
mkdir demo
cd demo
npm init -y
npm install http-server -D
3.2 根目录下创建index.html和index.js文件
<!-- path demo/index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>微型响应系统</title>
</head>
<body>
<script src="./index.js"></script>
</body>
</html>
// path demo/index.js
/**
* 用一个全局变量存储被注册的副作用函数
*/
let activeEffect;
/**
* @description 原始数据
*/
const data = { text: "Hello, World!" };
/**
* @description 存储副作用函数的桶
*/
const bucket = new Set();
/**
* @description 代理对象
*/
const obj = new Proxy(data, {
get(target, key) {
if (activeEffect) {
bucket.add(activeEffect);
}
return target[key];
},
set(target, key, newVal) {
target[key] = newVal;
bucket.forEach((f) => f());
},
});
/**
* @description 副作用函数
*/
const effect = (fn) => {
activeEffect = fn;
fn();
};
/**
* @description 执行副作用函数,触发读取
*/
effect(() => {
document.body.textContent = obj.text;
});
/**
* @description 1 秒后修改响应式数据
*/
setTimeout(() => {
obj.text = "微型响应系统";
}, 1000);
当前目录结构
demo
├── index.html
├── index.js
└── package.json
3.3 package.json中添加指令
// ...
"scripts": {
"start":"http-server",
},
//...
3.4 启动项目
npm start
4. 总结
通过以上代码,我们实现了一个微型响应式系统。这个系统可以追踪数据的变化,并在数据变化时执行相关的副作用函数。如果你有任何问题或建议,欢迎在评论区留言。让我们一起学习,共同进步!