思路
要实现可以追踪dispatch action 的过程,很容易想到在dispatch action前面打印一下aciton,再在dispatch action后,再通过store.getState() 获取现在store中存储的值。就可以完成这个需求了。如下图所示:
但当很多组件都使用redux时,就会有很多地方做这样的dispatch操作,就会要在很多地方加上这样的代码。很不优雅太麻烦了。应该思考一个在源头解决的办法。
因为修改store中的值,都得通过store.dispatch(), 所以这个源头就是dispatch函数,我们可以通过hook掉dispatch函数方式,让执行dispatch函数,变成执行我们的自定义方法(也就是方法交换,专业说法叫monkey patching)
所以我们在创建store的地方,加上替换store的dispatch方法的代码。
在创建store的index.js文件中创建一个函数log,并传入一个store作为参数
第17行:先存储一下store中原来的dispatch方法
第19行:定义一个自定义函数logAndDispatch,接收action参数。用来打印派发的action 、 真正调用sotre中的dipatch方法派发action、 打印派发后store中的值
第29行:将store中原来的dispatch函数 替换成 我们的自定义函数logAndDispatch
第32行:执行一下这个log函数,这样store中的dispatch函数就被换成了我们自定义的函数了。
那这样当有地方调用store.dispatch(action)时,因为方法交换的原因,实际上执行了我们的自定义函数logAndDispatch,我们在自定义函数中可以打印传进来的action,然后执行一下真正store中的dispatch函数,最后再打印派发后store中存储的值。