尝试做了一个公众号 —— 好股天天荐。

最适合上班族的选股神器!每个交易日结束后当晚,通过程序分析所有 A 股,推荐下个交易日最值得关注的股票。

呵!世上有免费的午餐?你这么能咋不自个留着发财呢?!

憋想那么多,先关注!关注了我再告诉你~嘻嘻!

最近帮中台团队面试了很多前端,有些想法不吐不快:发现现在很多前端都喜欢去 ToC 的业务团队,认为 ToB 的业务不就是去 XX 组件库里复制粘贴代码,然后增删改查吗?

但我想说,你那样产出的内容是没有灵魂的!你要说复制粘贴组件库可以帮助你来快速开发我信,但要是指望这种来输出一个好用的管理端我是不信的。

不同的数据用什么组件来承载?不同的操作用什么交互来实现?为什么用的同一套组件库我做的东西就总感觉差点意思?当然了,有的人会说:反正都是给内部人用的东西,能用就得了呗。好吧,只能说人各有志,这种心态来做前端,我是劝不了你的!


觉得土灶这种吃得可能是一种气氛吧

这是去年过年时候去外婆家,做饭的时候一家人在厨房里忙忙碌碌的场景:有洗菜切菜的,有烧火的,有炒菜的,当然了还有一家人的欢声笑语。

即使不参与做饭的,也可以搬个凳子在一旁一手嗑着瓜子,一手撸着小猫小狗,一边还能和「大厨们」聊天打趣,真是能快活到 giào 来 giào 去!

本文会不定期更新,我遇到的觉得值得分享的 TypeScript 问题都会写在这里

如果你有一些问都不知道咋问的 TypeScript 问题,来这里翻翻或许能找到答案!

互斥类型

2019.09.19 新增

1
2
3
4
5
// https://github.com/Microsoft/TypeScript/issues/14094#issuecomment-373782604
type Without<T, U> = { [P in Exclude<keyof T, keyof U>]?: never }
type XOR<T, U> = (T | U) extends object
? (Without<T, U> & U) | (Without<U, T> & T)
: T | U

使用上面的 XOR 范型,我们可以很容易地实现如下需求:

使用场景为增加商品表单,用户确定提交后,继续新增,需要清理之前用户输入数据,并对其初始化,再走一遍组件加载的流程,其中还包括几个子组件,如果手动去处理实在是太麻烦!! - 知乎提问

利用 v-if 控制 router-view,在路由容器组件,如 APP.vue 中实现一个刷新方法

😱 像多线程那样去轮询多个状态,不同的状态满足后去执行不同的定时任务。 项目地址

该状态机基本是为写游戏自动脚本量身定做,它就是整个脚本的”调度中心”。即使是基于 Node.js 的单线程,你也能够实现”同时”检测角色血条,掉落物品,游戏状态等等各种来触发不同的操作,搭配 dm.dll 食用更佳!如下图是本人之前做的流放之路脚本的主框架部分代码:

吐槽一下当前版本的 AntMenu,对强迫症很不友好!

多级菜单需要自己实现视觉聚焦,即同一层级只允许唯一展开。

而自己实现了之后会发现菜单在 Collapsed 的时候,你展开的那一级菜单会自动弹出 popover,而且位置还没有对齐(相关 issues),这也需要你自己来用很不优雅的方式来解决(先收起展开的子菜单,再折叠整个菜单,同时你要记录一下你收起的,为了再展开整个菜单的时候再展开之前收起的子菜单)。

但在折叠之后,如果点击 popover 中的菜单项,理论上在你重新展开整个菜单的时候,应当展开的子菜单是你 popover 时候点击的那个层级或者是关闭所有子菜单,而不能是你记录的那个了,这也得你自己实现。。(监听 onSelect,修改记录值)。

不过和路由地址的联动感觉怎么都得自己实现的才最能符合预期,这个功能没有提供就不吐槽了。(可以通过 PathToRegex 或 react router 4.x 中的 matchPath 来实现)。

顺便放出从 WithRouterProps.routes 中拿到当前匹配到的路由路径的方法:

1
2
3
4
5
6
7
withRouterProps.routes
.map(({ path }) => path)
.join('/')
.replace(/\/\//g, '/')
.replace(/\/$/, '')

// 返回的诸如 '/user/:id', '/profile' 等你定义在路由配置中的路径可以拿来和当前页面的路径来匹配,如果匹配成功则激活当前菜单项

不过也不要忽略了某些不在菜单中的页面,比如 /users/create 指向的是创建用户的页面,但是菜单中并没有,但是希望指向 /users 的那个菜单项被激活,这种时候可以简单地通过 includes 来匹配。