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

这篇具有很好参考价值的文章主要介绍了写几行代码,了解响应式原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作者:袁首京

原创文章,转载时请保留此声明,并给出原文连接。

作为当下的开发人员,无论是不是前端,可能都会频繁的与 React、Vue、Svelte、Solidjs 等等打交道。也许你已经很清楚它们背后的运作原理,那不必往下看了。如果还不是很清楚,那咱们可以一起写几行代码,来瞅一眼这些响应式框架背后的思路。

响应式框架最根本的功能其实只有一条:当数据发生变化时,让界面随之发生变化

如何达成这一点呢?粗略的想一下就会觉得,首先要在数据和与之对应的 HTML 元素之间建立绑定关系。可以以某种方式给特定的 HTML 元素打个标记,然后当与此元素相关的值发生变更时,我们就能通过这个标记找到此元素,然后动态的改变它展示出来的值。

比如如下 HTML 模板片断:

<p>{{ current_time }}</p>

我们可以定义一个模板编译函数:

function compile(tpl) {
  const re = /(\{\{\s+)(\w+)(\s+\}\})/m;
  const mg = tpl.match(re);
  return tpl.replace(">{{", ' vid="' + mg[2] + '">{{').replace(mg[0], "");
}

执行该函数,就会给相关元素打上 vid 标记:

> compile('<p>{{current_time}}</p>')
<p vid="current_time"></p>

这样如果需要,我们就可以很方便的找到页面上需要响应的元素:

const vel = document.querySelector("[vid=current_time]");

接下来是数据部分。如何监测数据的变化呢?一种方案是使用代理。假如我们有如下数据对象:

{
  current_time: "2023-05-03T05:14:46.176Z";
}

可以使用如下函数,为其生成一个代理,拦截其赋值操作:

function reactive(data) {
  return new Proxy(data, {
    set(target, property, value) {
      const prev = target[property];
      target[property] = value;

      if (prev !== value) {
        const vel = document.querySelector(`[vid=${property}]`);
        vel.innerHTML = value;
      }

      return true;
    },
  });
}

接下来,就可以面向数据编程了:

const data = reactive({
  current_time: "2023-05-03T05:14:46.176Z",
});

setInterval(() => {
  data.current_time = new Date().toISOString();
}, 1000);

最终效果如下:

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

以下是完整代码:文章来源地址https://www.toymoban.com/news/detail-432534.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div id="root"></div>
    <script>
      function compile(tpl) {
        const re = /(\{\{\s+)(\w+)(\s+\}\})/m;
        const mg = tpl.match(re);
        return tpl.replace(">{{", ' vid="' + mg[2] + '">{{').replace(mg[0], "");
      }

      function reactive(data) {
        return new Proxy(data, {
          set(target, property, value) {
            const prev = target[property];
            target[property] = value;

            if (prev !== value) {
              const vel = document.querySelector(`[vid=${property}]`);
              vel.innerHTML = value;
            }

            return true;
          },
        });
      }

      const app = {
        tpl: "<p>{{ current_time }}</p>",

        data: {
          current_time: "2023-05-03T05:14:46.176Z",
        },

        mount() {
          const rootEl = document.querySelector("#root");
          rootEl.innerHTML = compile(this.tpl);

          this.data = reactive(this.data);

          this.mounted();
        },

        mounted() {
          setInterval(() => {
            this.data.current_time = new Date().toISOString();
          }, 1000);
        },
      };

      document.addEventListener("DOMContentLoaded", () => {
        app.mount();
      });
    </script>
  </body>
</html>

到了这里,关于写几行代码,了解响应式原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 大家都在用的AI作画Python几行代码就可实现

    要想快速实现功能,咱们先了解一下OpenAI,OpenAI是一家人工智能公司,专注于开发强化学习、机器学习、自然语言处理等技术。OpenAI的主要目标是创造一套安全的人工智能系统,以帮助人们在各行各业中利用这项技术.接下来咱们来实现一下。 安装openai库: 调用openai生成图片以

    2024年02月06日
    浏览(39)
  • Unity教程2:保姆级教程.几行代码实现输入控制2D人物的移动

    目录 人物的创建以及刚体的设置 图层渲染层级设置 角色碰撞箱设置 使用代码控制人物移动 创建脚本文件  初始函数解释 控制移动代码 初始化变量  获得键盘输入  调用函数 手册链接在这:Unity User Manual (2019.3) - Unity 手册 没有控制人物移动的2D游戏就太说不过去了!那么接

    2024年02月06日
    浏览(43)
  • 几行代码,轻松教你用Java 将 Word 文档转换为 HTML

    Aspose.Words 是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word。此外, Aspose API支持流行文件格式处理,并允许将各类文档导出或转换为固定布局文件格式和最常用的图像

    2024年02月10日
    浏览(55)
  • HBuilderx 坑 之前没问题 改了几行代码 小程序上传报分包大小超过限制

      目录 Error: 分包大小超过限制,main package source size 4199KB exceed max limit 2MB [20221008 16:08:06][wx432abdb518bdc1eb] 本文重点来了!! 如题:小程序,只改了几行代码,上传报主包超过限制,简直有毒,估计很多人都遇到过此类情况,官方解释的优化方案也不是很好用,但是今天我试了一

    2024年02月16日
    浏览(54)
  • 使用Optimum-Intel OpenVINO™轻松文生图——几行代码加速Stable Diffusion

    作者 :武卓博士 英特尔AI布道师 随着AIGC模型越来越强大,并取得了更惊人的结果,任意运行AIGC模型, 比如Stable Diffusion,对于开发人员来说仍然面临一些挑战。首先,GPU的安装设置需要我们处理复杂的配置和兼容性问题,这可能既耗时又令人沮丧。此外,如果运行Stable Diff

    2024年02月08日
    浏览(44)
  • 公司来了个大牛:短短改了几行代码,接口吞吐量提升了 10 倍。。

    作者:FishBones 链接:https://juejin.cn/post/7185479136599769125 公司的一个ToB系统,因为客户使用的也不多,没啥并发要求,就一直没有经过压测。这两天来了一个“大客户”,对并发量提出了要求:核心接口与几个重点使用场景单节点 吞吐量 要满足最低500/s的要求。 当时一想,50

    2024年02月05日
    浏览(43)
  • 几行代码教你轻松完成超大模型推理:LLaMA-30B+TITAN RTX*4+accelerate

    是不是苦于没有ChatGPT的API key或者免费的token而无法愉快地和它玩耍?想不想在有限的计算资源上部署大模型并调戏大模型??想不想解锁大模型的除了对话之外的其它功能???几行代码教你搞定如何在有限的计算资源下部署超大模型并实现推理。 超大语言模型 。OPT,GPT,

    2024年02月13日
    浏览(46)
  • 如何批量修改 GitHub 代码提交作者

    批量修改 GitHub 代码提交作者需要进行以下步骤: 该操作如果涉及default分支的话 请确保有push的权限! 首先,你需要 clone 远程仓库到本地,使用以下命令: 进入到克隆下来的代码库目录,使用以下命令查看所有提交记录: 使用以下命令将要修改的提交记录的作者和邮箱修改

    2024年02月08日
    浏览(47)
  • 免费开源的高精度OCR文本提取,支持 100 多种语言、自动文本定位和脚本检测,几行代码即可实现离线使用(附源码)

    免费开源的高精度OCR文本提取,支持 100 多种语言、自动文本定位和脚本检测,几行代码即可实现离线使用(附源码)。 要从图像、照片中提取文本吗?是否刚刚拍了讲义的照片并想将其转换为文本?那么您将需要一个可以通过 OCR(光学字符识别)识别文本的应用程序。 图

    2024年02月01日
    浏览(128)
  • 了解HTTP代理日志:解读请求流量和响应信息

      嗨,爬虫程序员们!你们是否在了解爬虫发送的请求流量和接收的响应信息上有过困扰?今天,我们一起来了解一下。 首先,我们需要理解HTTP代理日志的基本结构和内容。HTTP代理日志是对爬虫发送的请求和接收的响应进行记录的文件。在日志中,我们可以看到每一次请求

    2024年02月14日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包