翼度科技»论坛 编程开发 JavaScript 查看内容

写几行代码,了解响应式原理

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
作者:袁首京  原创文章,转载时请保留此声明,并给出原文连接。
作为当下的开发人员,无论是不是前端,可能都会频繁的与 React、Vue、Svelte、Solidjs 等等打交道。也许你已经很清楚它们背后的运作原理,那不必往下看了。如果还不是很清楚,那咱们可以一起写几行代码,来瞅一眼这些响应式框架背后的思路。
响应式框架最根本的功能其实只有一条:当数据发生变化时,让界面随之发生变化
如何达成这一点呢?粗略的想一下就会觉得,首先要在数据和与之对应的 HTML 元素之间建立绑定关系。可以以某种方式给特定的 HTML 元素打个标记,然后当与此元素相关的值发生变更时,我们就能通过这个标记找到此元素,然后动态的改变它展示出来的值。
比如如下 HTML 模板片断:
  1. <p>{{ current_time }}</p>
复制代码
我们可以定义一个模板编译函数:
  1. function compile(tpl) {
  2.   const re = /(\{\{\s+)(\w+)(\s+\}\})/m;
  3.   const mg = tpl.match(re);
  4.   return tpl.replace(">{{", ' vid="' + mg[2] + '">{{').replace(mg[0], "");
  5. }
复制代码
执行该函数,就会给相关元素打上 vid 标记:
  1. > compile('<p>{{current_time}}</p>')
  2. <p vid="current_time"></p>
复制代码
这样如果需要,我们就可以很方便的找到页面上需要响应的元素:
  1. const vel = document.querySelector("[vid=current_time]");
复制代码
接下来是数据部分。如何监测数据的变化呢?一种方案是使用代理。假如我们有如下数据对象:
  1. {
  2.   current_time: "2023-05-03T05:14:46.176Z";
  3. }
复制代码
可以使用如下函数,为其生成一个代理,拦截其赋值操作:
  1. function reactive(data) {
  2.   return new Proxy(data, {
  3.     set(target, property, value) {
  4.       const prev = target[property];
  5.       target[property] = value;
  6.       if (prev !== value) {
  7.         const vel = document.querySelector(`[vid=${property}]`);
  8.         vel.innerHTML = value;
  9.       }
  10.       return true;
  11.     },
  12.   });
  13. }
复制代码
接下来,就可以面向数据编程了:
  1. const data = reactive({
  2.   current_time: "2023-05-03T05:14:46.176Z",
  3. });
  4. setInterval(() => {
  5.   data.current_time = new Date().toISOString();
  6. }, 1000);
复制代码
最终效果如下:

以下是完整代码:
  1. <!DOCTYPE html>
  2. <html lang="en">
  3.   <head>
  4.     <meta charset="UTF-8" />
  5.     <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6.     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7.     <title>Document</title>
  8.   </head>
  9.   <body>
  10.    
  11.    
  12.   </body>
  13. </html>
复制代码
来源:https://www.cnblogs.com/rockety/p/17369256.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具