”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 将事件映射器与 Rimmel.js 结合使用:简单介绍

将事件映射器与 Rimmel.js 结合使用:简单介绍

发布于2024-11-08
浏览:140

如果您想提高代码的整体质量,您可能希望使数据模型与底层视图完全解耦。

功能响应式框架或 UI 库(如 Rimmel.js)完全支持 Observables,除了鲜为人知的设计之外,还使您能够将模型定义为 Observable 流(例如:简单的数据输入、数据输出流)模式,即事件适配器。

Using Event Mappers with Rimmel.js: a simple introduction

事件适配器帮助您将任何源事件(例如:DOM 的 MouseEvent、PointerEvent、KeyboardEvent 等)映射到数据模型实际使用的格式,因此它们将从这种转换任务中解放出来,并最终与用户界面。

Rimmel 使将此类流连接到 DOM 变得简单:

import { rml } from 'rimmel';

const component = () => {
  const total = new Subject().pipe(
    map(x => doSomethingWith(x)),
  );

  return rml`
    
    
${stream}
`; }

绑定很简单:Rimmel 将来自按钮的点击事件直接连接到您的可观察流中,每次单击按钮时,该流都会接收 PointerEvent 的实例。

到目前为止,一切都很好。如果您的流需要从多个源获取数据,并且根据每个源的行为有所不同,该怎么办?
让我们创建一个带有递增和递减按钮的简单计数器,每个按钮都会加一或减一。

import { scan } from 'rxjs';
import { rml } from 'rimmel';

const component = () => {
  const total = new BehaviorSubject(0).pipe(
    scan((old, new) => old new, 0),
  );

  return rml`
    
    

    
${total}
`; }

这可行,但模板部分包含一些逻辑,这是一种反模式。理想情况下,我们应该努力拥有无逻辑的模板,以最大限度地提高整体可测试性。

因此,Rimmel 1.2 提供了一项新功能,即事件映射器,它可以帮助解决这一问题。它们帮助您将 DOM 事件映射到模型所需的内容,以便您可以将逻辑与模板完全分开。这是它的工作原理。

import { map, scan } from 'rxjs';
import { rml, reversePipe } from 'rimmel';

const Inc = reversePipe(map(() => 1));
const Dec = reversePipe(map(() => -1));
const component = () => {
  const total = new BehaviorSubject(0).pipe(
    scan((old, new) => old new, 0),
  );

  return rml`
    
    

    
${total}
`; };

reversePipe 是这里的创新补充:一个管道创建工具,与 RxJS 中的 pipeline() 函数相反。后者将转换应用于流的输出,reversePipe() 将它们应用于输入。
这样您就可以确保您的主流Subject/BehaviorSubject/Observer/EventListener 始终以您想要的格式获取数据,并且您可以将适配器作为单独的关注点。

您可以在反向管道中使用任何 RxJS 运算符。您是否只想过滤掉某些事件,例如当用户按 Enter 键时,而不是任何其他键?只需使用过滤运算符:

import { Subject, filter, map } from 'rxjs';
import { rml, inputPipe } from 'rimmel';

const UpperOnEnter = inputPipe(
  filter((e: Event) => e.key == 'Enter'),
  map((e: Event) => e.target.value.toUpperCase()),
);

const Component = () => {
  const state = new Subject();

  return rml`
    Type some text and hit Enter
${state}
`; };

关于单元测试,这是一个微小但有用的补充,将使测试更简单、更高效。

查看此 Stackblitz 上正在运行的事件映射器

版本声明 本文转载于:https://dev.to/dariomannu/using-event-mappers-with-rimmeljs-a-simple-introduction-1hj7?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • Python 列表理解
    Python 列表理解
    Python 最酷的事情之一是列表推导式如何让在一行代码中创建和操作列表变得非常容易。列表理解是一种通过转换和过滤现有列表中的元素来构建新列表的简洁方法。这个特性是 Python 使代码更具可读性和高效性的众多方法之一,对于初学者来说是一个很好的学习工具。在这里阅读更多示例...... 奥利弗 |图...
    编程 发布于2024-11-08
  • 如何在 Gin 中组织路由:分组路由定义指南?
    如何在 Gin 中组织路由:分组路由定义指南?
    如何在 Gin 中组织路由为了避免路由定义使主文件混乱,您可以将路由分组到单独的文件中。这种方法可以实现更好的代码组织和可维护性。要创建嵌套路由分组,您可以将路由器变量存储在结构体或全局变量中。然后,各个文件可以将处理程序添加到此共享路由器实例。示例实现routes.gopackage app im...
    编程 发布于2024-11-08
  • Leetcode链表问题
    Leetcode链表问题
    反向链表(LeetCode #206) 难度:简单 概念:迭代和递归方法。 合并两个排序列表 (LeetCode #21) 难度:简单 概念:链表遍历和合并技术。 从列表末尾删除第 N 个节点 **(LeetCode #19) **难度:中等 概念:两指针技术(慢指针和快指针)。 链表循环 **(...
    编程 发布于2024-11-08
  • 如何在 C++ 容器中存储异构对象:boost::any 或自定义实现?
    如何在 C++ 容器中存储异构对象:boost::any 或自定义实现?
    在 C 容器中存储异构对象C 容器通常需要同质元素,这意味着它们只能保存单一类型的对象。但是,在某些情况下,您可能需要一个可以容纳混合数据类型的容器。本文探讨了如何使用 boost::any 库和自定义方法来实现此目的。使用 boost::anyboost::any 是一个模板类可以容纳任何 C 类...
    编程 发布于2024-11-08
  • 使用 Pandas 掌握数据分析:从数据中释放洞察力
    使用 Pandas 掌握数据分析:从数据中释放洞察力
    数据分析是数据科学的核心,Python 的 Pandas 库是一个强大的工具,可以使这项任务变得更轻松、更高效。无论您使用简单的电子表格还是大型数据集,Pandas 都可以让您像专业人士一样灵活地操作、分析和可视化数据。在本文中,我们将深入探讨 Pandas 的基础知识,涵盖从数据操作到高级分析技术...
    编程 发布于2024-11-08
  • 最佳免费开源图标库 4
    最佳免费开源图标库 4
    In 2024, finding the best free icon library can significantly enhance the visual appeal of your websites, apps, or digital projects. Whether you're a ...
    编程 发布于2024-11-08
  • React Part 组件、State 和 Props 入门
    React Part 组件、State 和 Props 入门
    欢迎回到我们的 React.js 之旅!在上一篇文章中,我们介绍了 React 的基础知识,强调了它作为构建动态用户界面的库的优势。今天,我们将深入探讨创建 React 应用程序所必需的三个基本概念:组件、状态和属性。让我们详细探讨这些概念! 什么是 React 组件? React ...
    编程 发布于2024-11-08
  • 如何利用原生 ES6 Promises 有效地链接异步 jQuery 函数?
    如何利用原生 ES6 Promises 有效地链接异步 jQuery 函数?
    JavaScript 的互操作性承诺实现异步 jQuery 函数的高效链接链接异步 jQuery 函数时,通常需要避免 jQuery 的内置函数Promises 功能并使用原生 ES6 Promises 代替。这种互操作性允许 jQuery 操作和您想要的 Promise 实现之间的无缝集成。使用 ...
    编程 发布于2024-11-08
  • 在 Python 中使用 ElementTree 的“find”和“findall”方法时如何忽略 XML 命名空间?
    在 Python 中使用 ElementTree 的“find”和“findall”方法时如何忽略 XML 命名空间?
    在 ElementTree 的“find”和“findall”方法中忽略 XML 命名空间使用 ElementTree 模块解析和定位 XML 文档中的元素时,命名空间会带来复杂性。下面介绍了如何在 Python 中使用“find”和“findall”方法时忽略命名空间。当 XML 文档包含命名空间...
    编程 发布于2024-11-08
  • Bitbucket 综合指南:功能、集成和最佳实践
    Bitbucket 综合指南:功能、集成和最佳实践
    Bitbucket简介 Bitbucket 是 Atlassian 旗下基于 Git 的源代码存储库托管服务,以其强大的集成能力和强大的协作功能而闻名。它适合各种规模的团队,提供可简化开发工作流程、提高生产力并确保安全代码管理的解决方案。无论您是小型团队还是大型企业的一部分,Bitbucket 都...
    编程 发布于2024-11-08
  • 如何在 Python 中用逗号连接列表中的字符串?
    如何在 Python 中用逗号连接列表中的字符串?
    从列表中用逗号连接字符串将字符串列表映射到逗号分隔的字符串是编程中的常见任务。可以采用各种方法来实现此目标,每种方法都有自己的优点和缺点。一种流行的方法是将 join 方法与映射函数结合使用。此方法需要创建一个中间字符串,用作各个字符串之间的分隔符。例如:my_list = ['a', 'b', '...
    编程 发布于2024-11-08
  • 如何处理 AngularJS 应用程序中的锚点哈希链接?
    如何处理 AngularJS 应用程序中的锚点哈希链接?
    AngularJS 中的锚点哈希处理使用锚点浏览网页是一种常见的做法,特别是对于具有多个部分的长页面。然而,在 AngularJS 应用程序中,锚链接处理可能会出现问题。当单击 AngularJS 中的锚链接时,默认行为是拦截单击并将用户重定向到不同的页面。为了解决这个问题,AngularJS 提供...
    编程 发布于2024-11-08
  • 用 Java 编写多线程应用程序:综合指南
    用 Java 编写多线程应用程序:综合指南
    在软件开发领域,效率和速度至关重要。随着应用程序复杂性的增加以及需要处理的数据量的增加,利用现代多核处理器的功能变得至关重要。这就是 Java 的并发特性发挥作用的地方,它允许开发人员编写可以同时执行多个任务的多线程应用程序,从而显着提高性能。 了解 Java 并发 Java 中的...
    编程 发布于2024-11-08
  • JavaScript 中的 Promise,4 人指南
    JavaScript 中的 Promise,4 人指南
    随着 JavaScript 的不断发展,理解异步编程对于现代开发至关重要。 Promise 是一个强大的工具,可让您更有效地处理异步操作。这是有关如何在 JavaScript 项目中使用 Promise 的指南。 什么是 Promise? Promise 是一个对象,表示异步操作的最终完成(或失败)...
    编程 发布于2024-11-08
  • 除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为的主要场景bool:语句:if、whi...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3