Set & Map 数据结构是无法被 Vue 监听的

这次在写业务的时候因为是无限层级的递归表单,用了 provide/inject 来暴露注册以便收集数据。所以就想要用 Map 数据结构来处理数据的收集等等功能。直接使用 记录ID 作为键名就可以了,这样也可以直接去重。但是写完了业务代码之后发现我把后代的表单注册进来并没有触发响应,导致数据回填失败。

所以想着是不是 Vue 2x 无法监听 Map 或者 Set 的数据变更的。就去检索了一下相关的信息,发现 Vue 2x 真的无法监听 Map 以及 Set 俩兄弟。只能够通过修改其他变量来曲线救国。

Vue 3x 通过 Proxy 来代理就没有了这个问题。

阅读全文

Vue中接收没有声明的Prop属性[null/undefined]的接收问题

最近在写基础组件,同事一直反馈说组件总是提示警告:

[Vue warn]: Invalid prop: type check failed for prop "value". Expected String, Array, got Null

一开始以为是接收的问题,把定义的props加上了工厂函数后没有报异常就没再管了。
今天再去看的时候发现还是有报错,检查了一下组件代码没发现问题,在查看业务代码的时候发现同事喜欢给声明的变量默认赋值为 null。而不是声明正确的基础类型。所以我就想应该如何把这个问题彻底解决掉。

🔔 其实这个提示为了提醒可能你绑定的变量并不一定存在。

阅读全文

聊一个复用组件中使用debounce时遇到的问题

今天我中遇到了一个这样的场景,发现触发复用的自定义组件中添加了防抖的函数,发现只执行了一次,并没有如预期的那样每个组件内的函数都执行一次。

一开始以为是没有同步赋值,检查了一下没问题,才把关注点转移到 debounce 上面。移除防抖之后果然解决问题了,但防抖又不能去去掉。

所以查了一下相关的问题,发现是因为多个组件实例是共享同一个预置防抖的函数,并不是相互独立的。

阅读全文

CSS实现毛玻璃效果的一种新方式

今天在逛V站看到一个自推UI组件库的帖子,我觉得很不错,在查看组件样例的时候呢,发现了他的抽屉组件的遮罩可以把整个页面添加毛玻璃效果!我就很惊讶。马上就 F12查看了一下他的实现方式,因为在我映像里还没有一个很简单的的可以直接实现背景元素毛玻璃效果的方式。

其实不光是抽屉组件,其它的一些类 Modal 带有遮罩的组件都有这个毛玻璃的效果,大伙可以点点看看。

好了,不多废话直接开始正题。

阅读全文

使用Alt+Tab切换窗口时会显示Edge打开的所有页签

自从入职新公司之后默认浏览器是 Edge 一直都没有切换,发现一个事情就是每次使用 Alt+Tab 切换应用的时候总是会把当前 Edge 打开的网页都展示出来,就很麻烦。
明明我应用内使用 Ctrl+Tab/Ctrl+Shift+Tab 就可以前后切换页签。不知道为啥就要把单个页签也当成一个应用来展示,所以就想关闭这个功能。

一开始想当然的从 Edge 的设置内,但是找了一圈没有找到。就去问度娘了,发现是要从系统设置里去修改的。
操作步骤为:

  • 在桌面右键后选择 显示设置
  • 然后在侧边栏找到 多任务处理 选项
  • 按Alt + Tab将显示 项修改成 仅打开的窗口 即可。
阅读全文

HTML API + CSS 控制页面打印内容和样式

本周来了一个新的需求,需要前端生成打印内容,每一项数据占据一张 A4 纸,选择多项就是分多张打印,所以需要打印指定内容区域,并且使用 page-break 来控制打印区域的分页。
以前就只使用 CSS 控制过打印时样式,隐藏一些不需要打印的区域,还尝没有试过打印指定区域内容,并且控制打印内容强制分页,所以记录一下。

阅读全文

迁移到NVS(NodeVersionSwitcher)来管理NodeJS版本

最近工作在有信息管控的厂内,配发的电脑是受限用户账户,使用 NVM for Windows 来切换版本的话,会有访问被拒绝的情况,需要使用管理员权限来切换。这在日常工作中会是一件十分麻烦的事情,每次切换版本都需要去找IT Admin授权。

之前刚入职配置开发环境的时候就遇到过使用 NVM4W 切换版本的时候会出现访问被拒绝的问题(提示 exit status 1: Access is denied.),需要管理员权限才可以切换,只不过现在负责的都是新项目不需要切换 NodeJS 的版本,所以当时指定完当前 Node 版本为 LTS 之后就放弃纠结了。

昨天小伙伴也遇到了需要切换版本的情况,我也因为时间间隔太久了就和他说可以使用NVM4W来切换,他尝试之后发现并不行。

正好我手头上也忙完了大部分工作内容就研究了一下如果来解决这个情况。在浏览 NVM4W 的 Discussions 时,看到了 一篇帖子,其中有人提到了 NVS,所以在V2EX提问之后就去了解了一下,以下步骤皆为 Win10 环境下,Mac 及 Linux 可以查看仓库的 README

阅读全文

AntD of Vue 中 <AForm> 表单域组件化使用的尝试

最近有一个项目,我发现有一些表单内容高度重复的情况,几张页面的表单虽有些细微差,但还是有很多同样的表单内容,或者 表单域A表单域B 同时出现在一个页面中的这种情况。

我就想着能不能把他们都提出来,单独的做成组件在再使用到这些内容的时直接引入对应的表单域组件,并且可以把下拉菜单的远程查询也放到组件中,这样就会精简点很多重复的代码。

阅读全文

JS中的数字格式化和大位数缩写

以前因为项目需要 i18n ,一直以来都是自己写了一个格式化函数来处理,会使用 replace 配合正则对数字进行千位分割来展示,并且搭配 Vue.filter 来实现快速格式化。
但是对于大位数处理就会比较麻烦了,因为在境内就需要使用 万位分割,大位数使用 万、亿、万亿 来缩,而在英语系国家就会使用 千分分隔,比如说: K、M、B 来缩写数额。

正巧最近开始了一个需要国际化的项目,在一开始编写数字格式化过滤器的时候偶尔发现了 Intl.NumberFormat().format() 这个API,原来现在 原生JS就支持了对数字的格式化,并且不光可以千位分隔,还可以将大位数缩写。

阅读全文

记录在 uni-app 中使用 uViewUI 的图标组件使用 @click.stop 拦截冒泡事件报错

嗨呀,我也开始写 uni-app 了 😂,这次在使用 uView 这个UI库的时候遇到了一个问题,就是 <u-icon> 组件使用 @click.stop 阻止冒泡事件使会提示异常:TypeError: e.stopPropagation is not a function

去看了一下组件的源码,发现 u-icon 组件的 click 事件是自定义事件,没有 event,只返回了一个 this.index,所以不能使用 .stop 来阻止冒泡,

阅读全文