惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

阮一峰的网络日志
阮一峰的网络日志
P
Proofpoint News Feed
Hacker News: Ask HN
Hacker News: Ask HN
T
Threatpost
WordPress大学
WordPress大学
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 【当耐特】
Know Your Adversary
Know Your Adversary
P
Palo Alto Networks Blog
S
SegmentFault 最新的问题
月光博客
月光博客
Latest news
Latest news
博客园 - Franky
T
Threat Research - Cisco Blogs
有赞技术团队
有赞技术团队
博客园_首页
T
The Exploit Database - CXSecurity.com
The Cloudflare Blog
人人都是产品经理
人人都是产品经理
C
Cybersecurity and Infrastructure Security Agency CISA
S
Schneier on Security
Simon Willison's Weblog
Simon Willison's Weblog
爱范儿
爱范儿
Security Latest
Security Latest
Scott Helme
Scott Helme
博客园 - 聂微东
T
Tor Project blog
美团技术团队
IT之家
IT之家
Stack Overflow Blog
Stack Overflow Blog
B
Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
C
Cisco Blogs
Cisco Talos Blog
Cisco Talos Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
G
Google Developers Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
AWS News Blog
AWS News Blog
Jina AI
Jina AI
Vercel News
Vercel News
小众软件
小众软件
T
Tenable Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Forbes - Security
Forbes - Security
aimingoo的专栏
aimingoo的专栏
O
OpenAI News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Last Watchdog
The Last Watchdog
Cloudbric
Cloudbric
AI
AI

NBlog

NBlog - 软件工程和工程师们的未来在何方? NBlog - Gitlab EE 破解手册 NBlog - Gitlab EE 破解手册 NBlog - 又是一年高考季 NBlog - 又是一年高考季 NBlog - 心浮气躁的AI时代 NBlog - 心浮气躁的AI时代 NBlog - 我的2025 NBlog - 我的2025 NBlog - 一位高考数学73的学生证明了黎曼猜想 NBlog - 一位高考数学73的学生证明了黎曼猜想 NBlog - 2017 夏 NBlog - 2017 夏 NBlog - OPanel: 较大型开源个人项目初尝试 NBlog - OPanel: 较大型开源个人项目初尝试 NBlog - [博客更新] 博客添加AI生成内容标识 NBlog - [博客更新] 博客添加AI生成内容标识 NBlog - 为什么我感觉Minecraft越来越无聊了? NBlog - 为什么我感觉Minecraft越来越无聊了? NBlog - 对Abc曲谱标记语言的探索 NBlog - 对Abc曲谱标记语言的探索 NBlog - 域名弃用公告 NBlog - 域名弃用公告 NBlog - [博客更新] 转移至next.js,并重新设计整个网站 NBlog - [博客更新] 转移至next.js,并重新设计整个网站 NBlog - 我的歌单 NBlog - 我的歌单 NBlog - 证明简谐运动的周期公式 NBlog - 证明简谐运动的周期公式 NBlog - [聽后有感] 二 NBlog - [聽后有感] 二 NBlog - The Connells 歌词翻译 NBlog - The Connells 歌词翻译 NBlog - [聽后有感] 一 NBlog - [聽后有感] 一 NBlog - [博客更新] 域名已全面迁移至nocp.space NBlog - [博客更新] 域名已全面迁移至nocp.space NBlog - 证明皮克定理 NBlog - 证明皮克定理 NBlog - 英语选词填空中的数学问题 NBlog - 英语选词填空中的数学问题 NBlog - 如何在家制作食盐(NaCl)晶体? NBlog - 如何在家制作食盐(NaCl)晶体? NBlog - 拒绝“学习方法论”视频 NBlog - 拒绝“学习方法论”视频 NBlog - [博客更新] 现已支持RSS Feed NBlog - [博客更新] 现已支持RSS Feed NBlog - [代码日记] 编译运行VSCode源码 NBlog - [代码日记] 编译运行VSCode源码 NBlog - 证明一些导数结论 NBlog - 证明一些导数结论 NBlog - [代码日记] Calcium源码仓库喜提20stars NBlog - C大调卡农(摇滚版) NBlog - 陈升新单《望鄉》发布 NBlog - 陈升新单《望鄉》发布 NBlog - [博客更新] 全面重写整个网站 NBlog - [博客更新] 全面重写整个网站 NBlog - 我开发了一款计算器 (Calcium 使用手册) NBlog - 论如何免费的游玩离线Minecraft NBlog - 论如何免费的游玩离线Minecraft NBlog - Ferrum文件管理器荣获软件创新大赛二等奖 NBlog - Ferrum文件管理器荣获软件创新大赛二等奖 NBlog - 自己推导的三角函数二级结论 NBlog - 自己推导的三角函数二级结论 NBlog - 证明海伦公式 NBlog - 证明海伦公式 NBlog - Ferrum文件管理器参加了一个软件创新比赛活动! NBlog - Ferrum文件管理器参加了一个软件创新比赛活动! NBlog - NBlog, 2023新年好! NBlog - NBlog, 2023新年好! NBlog - [代码日记] 手写多功能计算器! (未完工+难题) NBlog - [代码日记] 手写多功能计算器! (未完工+难题) NBlog - 中考结束, 我回来了! NBlog - 中考结束, 我回来了! NBlog - [代码日记] 上手实践webpack、babel NBlog - [代码日记] 上手实践webpack、babel NBlog - [代码日记] 在游戏中为实体写一个AI NBlog - [代码日记] 在游戏中为实体写一个AI NBlog - 为什么铜傀儡比轻灵更好? NBlog - 为什么铜傀儡比轻灵更好? NBlog - [代码日记] PR经历记录 NBlog - [代码日记] PR经历记录 NBlog - [代码日记] 为nodejs.org网站源码提PR NBlog - [代码日记] 为nodejs.org网站源码提PR NBlog - [博客更新] 博客已更换主题至经典landscape NBlog - [博客更新] 博客已更换主题至经典landscape NBlog - ICraft开发日志-3 NBlog - ICraft开发日志-3 NBlog - 发现某反mc网站的bug NBlog - 发现某反mc网站的bug NBlog - ICraft开发日志-2 NBlog - ICraft开发日志-2 NBlog - ICraft开发日志-1 NBlog - ICraft开发日志-1 NBlog - 在旧手机上部署MC服务器 NBlog - 在旧手机上部署MC服务器 NBlog - 函数图像生成器 一个控制台小游戏 Nocp-startpage NBlog - 新博客正式开启
NBlog - [代码日记] Calcium源码仓库喜提20stars
NriotHrreion · 2024-01-21 · via NBlog

[代码日记] Calcium源码仓库喜提20stars

By NriotHrreion2024-01-21

最近,Calcium源码仓库来参观的人越来越多了,star也是涨了挺多,让它一跃成为了我star数最多的仓库。这个数字与其他的大项目比起来仍然不值一提,但这也算是我的一小步成就了。随着star的不断增加,fork数也涨到了4个,尽管那些来fork的人都没有对代码进行任何修改,但这也算对我的一种肯定。

当下的Calcium功能已经较为齐全,但仍然有许多的不足和bug,以及一些一直以来的“屎山”——虽然我在不断地克服。

提到屎山,就不得不让我想到那个计算器输入框的代码。输入框组件的代码一直都比较抽象,甚至于有的地方随着代码量不断增多变得越来越难以阅读和维护。这次,我想为输入框添加一个字符高亮的功能(就是给诸如变量、函数之类的字符着色),结果我发现这部分的代码过于难以修改,所以我就重写了这里的一部分代码,增加了InputContext,用来管理输入的字符。

但是,毕竟这个类里面存储的字符并不是组件的state,所以在这些字符发生改变的时候,组件并不会自动重新渲染。因此,我需要增加一个机制,让它能自动检测字符发生改动然后刷新组件。下面是我想到的几个解决方案:

ProxyObject

这是我最开始想到的解决方案,因为ProxyObject可以通过代理的方式监听对象内部属性的改变,进而进行对应的操作,而不需要借助Emitter事件系统。但这不知道为什么,在有的时候,字符改动的时候它会莫名其妙地拦截这个改动,进而使这个改动失效。

Setter

这是我之后想到的另一个解决方案,因为Setter的写法会更加简单易懂。但相应地,它就需要借助Emitter事件系统。那么,为什么ProxyObject不需要Emitter,而Setter就需要呢?这正是因为前者是在外部监听属性变化的,而后者恰恰相反。

有了解决方案之后,我就添加了下面的代码

tsprivate _symbolList: InputSymbol[] = [];

public get symbolList(): typeof this._symbolList {
    return this._symbolList;
}

public set symbolList(newValue: typeof this._symbolList) {
    this._symbolList = newValue;
    /**
     * Manually emit the event that makes `InputBox` component being updated forcedly,
     * so that the value in the input box will be consistent with `symbolList`.
     */
    Emitter.get().emit("symbol-list-update");
}

原理很简单,我就不解释了。

InputContext的作用

原本没有InputContext的时候,所有字符的管理和操作都得靠输入框组件来完成,甚至由于字符存储的方式(原本是string存储的,现在以string[]来存储),字符的操作也更加复杂。现在有了InputContext之后,就可以把一些常用的操作封装成方法,接着就只要简单调用这些方法就能完成先前复杂的操作了。

小结

Calcium达到20stars之际,我写的代码仍然存在许多问题需要解决,就如上文提到的输入框组件的问题。因此我还需要更加努力地提升技术力,进而让这个计算器更加强大,让它的代码更加完备。