Redux —— combineReducers

事出有因,写 rabbit 的时候,一条单测出了问题

Reducer _object returned undefined during initialization.

想来必然是 reducer 缺少默认的 state 所致,但是我的单测是从 dva 直接拿过来改改就用的,应该不会出现问题,所以一定是哪里出了差错。后面发现了,虽然 dva 可以接受 reducers 是空对象,但应用运行起来有一样问题。

主要是这个问题无伤大雅,model 不会出现只有 reducers 这种情况。我也给出了解决:构建 reducer 给一个默认 state 顶着(但我认为一个 model 应该强制存在 state

显然这次并不想讲这个,而是想理解 combineReducers

看过 Redux 之后,我写了一个不负责任的状态管理

我们现在小程序需要使用状态管理,但因为项目体量实在很小又没必要使用 redux 或者 mobx。所以我打算不负责任的写一个。

createStore

Redux 最核心的部分,提供基础的功能。createStore接受三个参数:reducer, initialState, enhancer。前两个比较好理解,enhancer主要用在接受中间件中。返回产物我们主要使用三个方法:getState, dispatch, subscribe

  • getState:获取当前 state 值
  • subscribe:接受监听,存入 listeners 池中
  • dispatch:处理 reducer 操作,触发 listeners 方法

一位赌狗前端的自我修养

这两个月工作巨多,直到今天才有时间写点骚东西。

可是要写点什么比较好呢?这时候看到了隔壁桌面上放着一张福彩,我脑子里有画面了。(所以这位赌狗不是我,我不买彩票)

为了方便以后支持更多的彩票,直接搞个类

class Gamble {
    static dualColor(red: number = 6, blue: number = 1) {
        const reds: [number, number] = [1, 33];
        const blues: [number, number] = [1, 16];

        return [this.randomVal(reds, red), this.randomVal(blues, blue)];
    }

    private static randomVal(
        fromto: number[],
        total: number,
        temp: number[] = [],
    ): number[] {
        const [head, ...body] = (!temp.length
            ? [...Array(fromto[1]).keys()]
                  .map(item => item + 1)
                  .splice(fromto[0] - 1)
            : fromto
        ).sort(() => Math.random() - 0.5);
        return !total
            ? temp
            : this.randomVal(body, total - 1, temp.concat(head));
    }
}

记在NPM抢空包名的经历

年前想搞定React的时候想了个骚操作:尝试用React的思路去做Vue的事情。又诞生了「Vue生态统一可以聚合」的骚想法,开始产生做Ahri的念头。想着那得搞个 npm 包吧,孤儿上线了。

嘛,在 npm 拿《英雄联盟》英雄名字抢注包名的做法都很弱智了,还“大义凛然”的在描述里写着:League of Legends hero.

关于第一次遇到它的时候,我就想算了,重新找合适的名字吧,但后来因为其他原因就搁置了。现在重新回坑,依然遇到这个问题,这次我不忍了,我打算找 npm 肛他!

我就写个方法,这么麻烦?

最近想到一个问题:为什么JavaScript定义一个函数有那么多种形式,是历史残留还是为了装逼?研究了一下发现还是有区别的。

JavaScript中定义一个方法主要可以分成两种形式:

  • 函数声明
  • 函数表达式

promise链式调用

学会了却不会活用是真的菜…

前几天面试,提到了回调地狱用promise,然后抛出个衍生问题:promise也会嵌套,怎么解决promise的回调地狱。

我想不到,直接问能不能用ES8,说行,然后我就想到了const p2 = await Promise这种做法。

可是,我记得我在若干天前才写了一篇关于「JS方法链式调用」。

只要函数返回值是一个函数,就可以连着调用

So,

p1.then(({ p2 }) => {
  return p2
}).then({ p3 } => {})

抛下不成熟,开始nvim

想活得跟过去有些区别,活得更有效率该有的样子,而且我讨厌上一年的自己,不知道为什么会这么想。反正,放弃spacemacs开始使用vim了。

很简单,spacemacs有时候会卡一下,就像十年前的电脑,按了一长串需要等一下才会突突突突全显示出来。后来vscode + vim插件又出现了“不自觉按空格”的情况,就是写完按两下空格调插件。那既然这样的话,从零开始一个vim吧,把leader换成空格然后一些改不过来的习惯换过来就行了。

实际上,如果不是因为懒,早就该定制编辑器了。。不过我不会放弃vscode,因为还是有些残留。为什么不从零开始一个emacs?成本太高啊,又要vim模式又要改成leader键操作,而且逐渐能理解那个蚊香图是什么意思了。

iterm2

宿主用这个,原先很排斥在终端写东西(不能用鼠标),不过后来一手菜鸡操作xj, xk还有wwwwwwww...也能达到需求了,应该没问题了。

vuex源码理解(二)

继续,这次尝试逐行理解Store类的东西

然后关于这次,一些“工具函数”都集中在util.js的这种做法,已经够我学的了。这是个很受用的做法。

一些简单的东西

if (process.env.NODE_ENV !== 'production') {
  assert(Vue, `must call Vue.use(Vuex) before creating a store instance.`)
  assert(typeof Promise !== 'undefined', `vuex requires a Promise polyfill in this browser.`)
  assert(this instanceof Store, `Store must be called with the new operator.`)
} // 断言函数在util,如果不满足前面的情况,后面以error 排出来
// (实际上就是想看有没有在vue环境中和有没有正确安装)
const {
  plugins = [],
  strict = false
} = options // 定义两个变量,在传入的对象中把这两个东西拿出来,字面意思

vuex源码理解(一)

看个代码代价很高,我边读边转笔,然后一个失手把手挑了个滴血不止…(笔头挑掉了一层手皮)

vuex和dva的源码都想看,不然没办法知道相性在哪。

由口而入

这都暴露干净了…

export default {
  Store,
  install,
  version: '__VERSION__',
  mapState,
  mapMutations,
  mapGetters,
  mapActions,
  createNamespacedHelpers
}

install肯定是Vue老套路,想把东西当插件用肯定要暴露这个方法。这个之前写组件经常需要碰到,弃之!

这次就先读暴露出来的四个方法吧

通过dva得到的思考 —— “滥用”VUEX

首先这一手骚操作要感谢@ahonn,确实这几天学习dva,我自己都觉得自己有点烦了。但是老哥好耐心,真心感谢。

直接上正题吧不磨磨唧唧的了!

dva是什么

这还用说吗,坦克啊!双命特性,大招是通过机甲自爆产生大范围爆炸,本体只有100血,可以反…啊!!!别打我啊!

好吧可能阿里的工程师也喜欢玩守望先锋,而且我清晰记得dva这个框架就是守望大火的时候诞生的,而且还有一个协同工具叫路霸吧。(看来阿里的工程师都不喜欢当C…)


0%