最近在看react相关技术栈,感觉好多东西看起来有点吃力。
比如redux-saga的相关使用,如下:
import { createStore, combineReducers, applyMiddleware } from 'redux';
import userNameReducer from '../username/reducer.js';
import createSagaMiddleware from 'redux-saga';
import rootSaga from './saga.js';
const sagaMiddleware = createSagaMiddleware() // 执行create函数之后,返回值是一个中间件/函数 sagaMiddleware
const reducerAll = {
userNameReducer: userNameReducer
}
export const store = createStore(
combineReducers({...reducerAll}), // 这里是常规的fn(对象)的使用。最后返回的也是一个reducer对象
window.devToolsExtension ? window.devToolsExtension() : undefined,
applyMiddleware(sagaMiddleware) // 这里就有点难理解了,为什么需要在applyMiddleware这个函数中将上面返回的sagaMiddleware这个函数传进来。如果把createStore看作fnA,那么可以转换为这种fnA({},fnB(fnC))结构,可是这个函数套函数的写法有点接受不了,习惯了fn(参数)的形式。。
)
sagaMiddleware.run(rootSaga) // 看到这里发现,原来sagaMiddleware还有一个run方法。。那也就是说它应该是一个具有run方法的对象。然后这里的rootSaga又是一个函数。。。又是fnA(fnB)的形式。。。。又晕了。
问题有两个:
- import createSagaMiddleware from 'redux-saga'; 中的createSagaMiddleware为什么不可以像 import { deepClone } from 'lodash';中的deepClone()直接使用。而是还需要将这个函数再用fnA(fnB)这种形式返回出一个新的函数,再去使用。
- 这种fnA({}, fnB(fnC(fnD), {}))这种写法感觉看着好难理解。。
求大佬们指点迷津。
要看这个模块导出的东西和其他模块需要用到的东西是什么。简单说:
它导出一个工具函数,比如cloneDeep那就可以直接解构直接用。
它导出一个函数,但是实际要用的是这个函数的返回值,那就得先执行一下函数获取需要的东西。
对于你的第二个问题,面向对象思维。函数其实也是对象,它就像一个数组一样,只是函数内部有自己独特的方法属性,并且实现了一个call方法而已。