使用RXJS实现React中的redux功能
2021-01-21 09:15
标签:fun consumer 对象 依赖 function git list react https 使用RXJS实现React中的redux功能 标签:fun consumer 对象 依赖 function git list react https 原文地址:https://www.cnblogs.com/aloneMing/p/13294511.html起因
Angular
的服务的依赖注入和rxjs
的观察者流的使用,觉得还有点意思,就想在React
中实现一下类似的。准备工作
React
项目。rxjs
,npm install rxjs --save
;实现思路
Provider
和connect
方法,将对应的全局状态和服务进行组件的注入。mapStateToProps
自定义需要获取的服务以及全局状态。代码实现
// 用来包裹服务类,生成一个实例存到闭包中,保证每次拿到的服务对象是同一个实例
const wrapService = (Service, initData = {}) => {
const service = new Service(initData);
return () => {
return service;
}
}
// 一个服务类
import { Subject } from ‘rxjs‘;
import { wrapService } from ‘Utils/service‘;
class TestService {
constructor(initData = {}) {
this.data = initData;
}
data$ = new Subject();
subscribe = (callback) => {
this.subscription = this.data$.subscribe(callback);
this.data$.next(this.data);
return () => {
this.subscription.unsubscribe();
}
}
add = (data) => {
this.data.count = Number(data.count) + Number(this.data.count);
this.data$.next(this.data);
}
set = (data) => {
this.data = { ...this.data, ...data };
this.data$.next(this.data);
}
}
const initData = {
count: 0,
test1: ‘Hello‘,
test2: ‘World‘
};
export default wrapService(TestService, initData)();
// 获取唯一的context
const getContext = (() => {
const Context = React.createContext(null);
Context.displayName = ‘serviceProvider‘;
return () => {
return Context;
}
})();
// 默认注入所有的全局状态
const defaultMapStateToProps = (data) => {
return {
...data
};
}
/**
* 注入服务的高阶组件
*/
function ServiceProvider({ services = {}, children = null }) {
const Context = getContext();
const [contextValue, setContextValue] = useState({
...services
});
const unsubscribeList = [];
useEffect(() => {
Object.keys(services).forEach((key) => {
const unsubscribe = services[key].subscribe(_data => {
setContextValue({
...contextValue,
..._data
});
});
unsubscribeList.push(unsubscribe);
});
return () => {
unsubscribeList.forEach(unsubscribe => {
typeof unsubscribe === ‘function‘ && unsubscribe();
});
}
}, [])
return (
// 使用,先在最外层的render中使用Provider包裹。
ReactDOM.render(
小结
React
的高阶组件,Context的使用更加熟悉了,后续应该还可以继续完善。
文章标题:使用RXJS实现React中的redux功能
文章链接:http://soscw.com/index.php/essay/44933.html