“Add Tags” 技术方案并行对比:React Hooks vs dagger.js(含核心 JS 代码)

源码:

  • React Hooks:https://codepen.io/prvnbist/pen/jJzROe?editors=1010
  • dagger.js:https://codepen.io/dagger8224/pen/ZErjzwm

在这里插入图片描述

一、对比总览(表格)

维度React Hooks 实现(prvnbist)dagger.js 实现(dagger8224)结论
框架/依赖依赖 React/ReactDOM + Babel/JSX;ReactDOM.render 挂载原生 DOM + 指令(+load/*each/*value#trim/+click/+keyup),零构建可跑dagger 依赖更轻;React 生态更全
状态管理useState(不可变更新)作用域对象可变更新(push/spliceReact 可预测性强;dagger 上手直观
事件/输入onKeyUp 手写回调读取/清空输入*value#trim 双向绑定,+keyup#every:-Enter 声明式触发dagger 更少样板
列表渲染/删除tags.map(...) + onClick*each="tags" + +click="removeTags(...)"均直观;dagger 更贴 HTML
对外通信props.selectedTags([...]) 向父级冒泡示例未展示(可拓展自定义事件/全局 store)React 更现成
A11y删除控件是 span“x”,无按钮角色/ARIA(两边均是)同左建议两者都改 <button aria-label="Remove tag">
性能(本例)VDOM diff 开销极小直达 DOM 绑定小组件差异可忽略
适用场景工程化/组件生态/团队协作免构建/轻量嵌入/快速原型视项目体量取舍

二、代码量差异(粗略非空行统计)

注:仅为量级参考;CSS 两边大致一致。

面板React Hooksdagger.js
HTML~1 行(<div id="root">~10 行(含指令模板)
JS~33 行(TagsInput + App + render~12 行(loading/removeTags/addTags
CSS~80+ 行(两者近似)~80+ 行
合计(HTML+JS)~34 行~22 行

结论:dagger.js 显著减少 JS 体量,把交互“下沉”到 HTML 指令;React JS 更多但 HTML 更薄,符合组件化/状态提升的常规模式。


三、核心 JS 代码对照

1) React Hooks(核心 JS)

const TagsInput = props => {const [tags, setTags] = React.useState(props.tags);const removeTags = indexToRemove => {setTags([...tags.filter((_, index) => index !== indexToRemove)]);};const addTags = event => {if (event.target.value !== "") {setTags([...tags, event.target.value]);props.selectedTags([...tags, event.target.value]);event.target.value = "";}};return (<div className="tags-input"><ul id="tags">{tags.map((tag, index) => (<li key={index} className="tag"><span className='tag-title'>{tag}</span><span className='tag-close-icon'onClick={() => removeTags(index)}>x</span></li>))}</ul><inputtype="text"onKeyUp={event => event.key === "Enter" ? addTags(event) : null}placeholder="Press enter to add tags"/></div>);
};
const App = () => {const selectedTags = tags => {console.log(tags);};return (<div className="App"><TagsInput selectedTags={selectedTags}  tags={['Nodejs', 'MongoDB']}/></div>);
};
ReactDOM.render(<App />, document.getElementById("root"));

2) dagger.js(核心 JS)

const loading = () => ({tag: '',tags: ['Nodejs', 'MongoDB']
});
const removeTags = (index, tags) => tags.splice(index, 1);
const addTags = $scope => {const { tag, tags } = $scope;if (tag) {tags.push(tag);$scope.tag = '';}
};

dagger 对应模板(片段),可见通过指令表达列表、事件与双向绑定:

<div dg-cloak class="App" +load="loading()"><div class="tags-input"><ul id="tags"><li class="tag" *each="tags"><span class='tag-title'>${ item }</span><span class='tag-close-icon' +click="removeTags(index, tags)">x</span></li></ul><input type="text" placeholder="Press enter to add tags"*value#trim="tag" +keyup#every:-Enter="addTags($scope)"></div>
</div>

四、与代码对应的实现分析

A. 初始化与挂载

  • Reactconst [tags, setTags] = useState(props.tags); 为局部状态;通过 ReactDOM.render(<App/>, #root) 挂载。组件化边界清晰,便于复用与组合。
  • dagger+load="loading()" 在容器上注入初始作用域(tag/tags),无需显式渲染入口,适合在任意静态页“就地”增强。

B. 输入与校验

  • ReactaddTags(event) 里手动读取/清空 event.target.value;默认不 trim,可在函数中补充校验与去重。
  • dagger*value#trim="tag" 天然裁剪空白,结合 +keyup#every:-Enter 让“回车新增”无需手写键值判断。

C. 列表渲染与删除

  • Reacttags.map(...) 渲染项,onClick={() => removeTags(index)} 删除。不可变更新(filter)便于可预测渲染、状态回溯。
  • dagger*each="tags" 迭代;+click="removeTags(index, tags)" 直接调用,常配合可变更新(splice)写法简洁。

D. 对外通信

  • Reactprops.selectedTags([...]) 将内部变更上报给父组件或外层应用(常见于表单控件封装)。
  • dagger:示例未展示;可通过自定义事件(dispatchEvent)或外层监听指令来完成数据冒泡。

E. 可访问性(A11y)

  • 两边删除控件均为 span,建议替换为:
    <button type="button" class="tag-close-icon" aria-label="Remove tag">x</button>
    
    并配合键盘支持(Enter/Space)和更明确的焦点样式。

五、改进建议(两边通用)

  • 输入规则:去重、最大标签数、禁止全空白;支持粘贴多标签(按逗号/空格分割)。
  • 错误反馈:同名标签时给出可视化提示(如 shake 动画/辅助文本)。
  • 测试:React 侧可配合 Testing Library;dagger 侧可通过 DOM 测试/端到端测试保障交互。
  • 样式与主题:抽离 tokens/vars,支持暗色模式与尺寸变体。

六、选型参考

  • 需要工程化、强生态、多人协作 —— 倾向 React:组件化边界清晰、工具链与第三方库成熟。
  • 追求零构建、轻量嵌入、快速上线 —— 倾向 dagger:指令式绑定 + 原生 DOM,代码量更小,上手极快。

本文内容就到这里,后续文章将为大家带来更多案例和讲解。

如果对dagger.js感兴趣的话,请您点赞收藏、分享本系列文章,也欢迎留言或者私信作者提出问题和建议,您的关注是对我最大的支持和鼓励。感谢您的阅读,祝工作学习顺利!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95477.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95477.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/95477.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

矩池云中LLaMA- Factory多机多卡训练

LLaMA Factory 是一款开源低代码大模型微调框架&#xff0c;集成了业界最广泛使用的微调技术&#xff0c;支持通过 Web UI 界面零代码微调大模型&#xff0c;目前已经成为开源社区内最受欢迎的微调框架之一。但是在矩池云上如何使用LLaMA-Factory多机多卡训练模型呢&#xff1f…

Nginx的反向代理与正向代理及其location的配置说明

一、Nginx中location匹配优先级Nginx中location匹配优先级location支持各种匹配规则&#xff0c;在多个匹配规则下&#xff0c;Nginx对location的处理是有优先级的&#xff0c;优先级高的规则会优先进行处理&#xff1b;而优先级低的规则可能会最后处理或者不进行处理。注意&am…

神经网络正则化三重奏:Weight Decay, Dropout, 和LayerNorm

正则化是机器学习中防止模型过拟合、提升泛化能力的核心技术。Weight Decay、Dropout和LayerNorm是三种最常用的方法&#xff0c;但它们的工作原理和首要目标截然不同。下面的流程图揭示了它们的核心区别与联系&#xff1a; #mermaid-svg-vymek6mFvvfxcWiM {font-family:"…

两台电脑通过网线直连共享数据,设置正确,却互相ping不通的解决方法

因为某些原因&#xff0c;需要两台电脑互传资源&#xff0c;但是某台电脑可能无法连接外网。如果手头有根网线&#xff0c;很容易想到通过一根网线连接两台电脑互传数据。 这里先说一下基本的设置&#xff1a; 两台电脑最好都关闭防火墙&#xff1b;两台电脑都打开专用网络和公…

面试新纪元:无声胜有声,让AI成为你颈上的智慧伙伴

面试&#xff0c;无论是对于面试官还是求职者&#xff0c;都像一场无声的战争。 一方要精准识人&#xff0c;一方要完美自荐&#xff1b;一方怕问不到点子上&#xff0c;一方怕答不到心坎里。 紧张、遗忘、表达失误、准备不足……这些问题几乎每个人都经历过。 有没有一种方…

qt-C++笔记之QtDesigner-Creator按钮图标与样式

qt-C笔记之QtDesigner-Creator按钮图标与样式 整理&#xff1a;如何用 .qrc 管理资源、在 Designer/Creator 中为 QPushButton 设置图标&#xff08;资源或系统主题&#xff09;&#xff0c;以及用样式表调整文字样式。涵盖 C/Qt 与 PySide/PyQt&#xff1b;Linux 桌面优先&am…

maven 常用指令

Maven 是 Java 项目构建和依赖管理的得力助手。这里为你总结了一些常用指令&#xff0c;希望能帮你提升开发效率。下面这个表格汇总了 Maven 最核心和常用的一些命令&#xff1a;命令主要功能典型使用场景mvn clean清理项目&#xff0c;删除 target 目录及其所有编译输出文件。…

# pdf.js完全指南:构建现代Web PDF查看与解析解决方案

在当今Web开发中&#xff0c;实现高质量的PDF查看功能一直是前端开发者面临的挑战之一。作为最受欢迎的JavaScript PDF库&#xff0c;pdf.js已经成为解决这一问题的行业标准。由Mozilla开发并维护的pdf.js项目&#xff0c;通过纯JavaScript实现PDF解析与渲染&#xff0c;彻底改…

高效对象属性复制工具

日常编程中&#xff0c;经常会碰到对象属性复制的场景&#xff0c;比如 VO、DTO、PO、VO 等之间的转换&#xff0c;关于什么是VO、DTO、PO、VO 等可以看上篇文章&#xff0c;VO、DTO、PO、VO 等对象具体有哪些方式可以使用呢&#xff1f; set/get 方式 性能最好的方式&#x…

大疆图传技术参数对比 你了解多少?

无人机是现代航空技术与智能控制技术结合的产物&#xff0c;已从军事领域广泛渗透至民用场景&#xff0c;成为推动各行业效率升级的关键工具。无人机的全称为 “无人驾驶航空器&#xff08;Unmanned Aerial Vehicle&#xff0c;简称 UAV&#xff09;”&#xff0c;简言之&#…

Redis 缓存热身(Cache Warm-up):原理、方案与实践

在 Redis 缓存架构中&#xff0c;“缓存热身”是指在系统正式提供服务前&#xff08;如重启、扩容后&#xff09;&#xff0c;主动将热点数据加载到 Redis 中的操作。其核心目标是避免**缓存穿透**&#xff08;请求直达数据库&#xff09;和**缓存雪崩**&#xff08;大量请求同…

基于SpringBoot的大学生就业招聘系统

1. 在线演示&#xff1a; 后台&#xff1a;http://springbootiv1oo.xiaobias.com/springbootiv1oo/admin/dist/index.html 前台&#xff1a;http://springbootiv1oo.xiaobias.com/springbootiv1oo/front/index.html 管理员&#xff1a;abo/abo 用户&#xff1a;用户1/123456、…

Java反序列化漏洞揭秘:从原理到攻击实战

一、背景 熟悉接口开发的同学一定知道&#xff0c;能将数据对象很轻松的实现多平台之间的通信、对象持久化存储&#xff0c;序列化和反序列化是一种非常有效的手段&#xff0c;例如如下应用场景&#xff0c;对象必须 100% 实现序列化。 DUBBO&#xff1a;对象传输必须要实现序…

Time-MOE 音频序列分类任务

prompt 我准备做语音疾病分类任务。语音音频是 WAV 格式的音频&#xff0c;基本上分为两类&#xff0c;分别是疾病类和非疾病类。也有少数数据集是多分类&#xff0c;现在我找到了26个数据集&#xff0c;我准备我已经在 MLP CNN 上面测试了它们的基准&#xff0c;下面我找到了一…

[嵌入式embed][Qt]Qt5.12+Opencv4.x+Cmake4.x_测试Qt编译的opencv4.x的库

[嵌入式embed][Qt]Qt5.12Opencv4.xCmake4.x_测试Qt编译的opencv4.x的库编译Qt-Opencv库测试流程-①创建一个简单的qt-ui工程配置 & 测试配置库编译环境测试代码百度云-工程(opencv4.xqt5.12的工程)参考文档编译Qt-Opencv库 [嵌入式embed][Qt]Qt5.12Opencv4.xCmake4.x_用Qt…

相较于传统AR矿物鉴定有哪些优势?

与传统的矿物鉴定方法相比&#xff0c;AR矿物鉴定就像是一位全面升级的“超级助手”&#xff0c;展现出了无可比拟的优势。传统的矿物鉴定方法&#xff0c;往往依赖于地质学家或专业鉴定人员的丰富经验。他们需要通过肉眼观察矿物的颜色、光泽、硬度等物理特征&#xff0c;再结…

第5节:分布式文件存储

本节主要是讲解的是分布式文件存储&#xff0c;主要介绍了阿里云OSS云存储和Minio文件存储&#xff0c;本章重点主要是掌握怎么在SpringBoot项目里面接入文件存储。 记录、交流、实践&#xff0c;让每一份付出皆可看见&#xff0c;让你我共同前行&#x1f601; 1.分布式文件存…

当 GitHub 宕机时,我们如何协作?

一、引言1.1 GitHub 的重要性及宕机影响在当今软件开发的生态系统中&#xff0c;GitHub 已然成为全球开发者不可或缺的核心平台。它为无数开源项目与企业级开发团队提供了高效的代码托管、版本控制、协作开发以及项目管理等服务。然而&#xff0c;2025 年 8 月那场波及全球的 G…

Ansible 常用模块归纳总结

[studentmaster ansible]$ ansible-galaxy collection install http://ansible.example.com/materials/community-general-6.3.0.tar.gz -p collections/##将第三方模块下载到collections下 [studentmaster ansible]$ ansible-galaxy collection install http://ansible.exampl…

计算机网络:概述层---TCP/IP参考模型

&#x1f310; TCP/IP四层模型详解&#xff1a;互联网的核心协议架构深度剖析 &#x1f4c5; 更新时间&#xff1a;2025年9月3日 &#x1f3f7;️ 标签&#xff1a;TCP/IP模型 | 互联网协议 | 四层模型 | 计算机网络 | 协议栈 | 网络通信 | 王道考研 摘要: 本文将深入浅出地解析…