react+mobx 编写 Async装饰器
使用
// indexStore.js
import axios from "axios";
import { from } from "rxjs";
import { map } from "rxjs/operators";
@util.Async(from(axios("http://localhost:5000/test")).pipe(map(v => v.data.users)))
@util.isEmpty(true)
// @observable // 不需要observer
list;
实现
import { set } from "mobx";
import * as u from "lodash";
/**
* * async: false => data => isData
* * async: true => data => isData$
*/
export const isEmpty = (async = false) => {
return function(target, key) {
let opt = async ? `is${u.upperFirst(key)}$` : `is${u.upperFirst(key)}`;
Object.defineProperty(target, opt, {
get: function proxyGetter() {
const k = async ? `${key}$` : key;
return !u.isEmpty(this[k]);
},
enumerable: true,
configurable: true,
});
};
};
// list=> list$
export const Async = (fn$, initData = null) => {
return function(target, key) {
set(target, {
[`${key}$`]: initData,
});
fn$.subscribe(
v => {
set(target, {
[`${key}$`]: v,
});
},
err => console.error(err),
() => {
/* done */
},
);
};
};
组件
const INDEXSTORE = "indexStore";
@inject(INDEXSTORE)
@observer
class Test extends Component {
render() {
const { indexStore } = this.props;
return (
<>
{indexStore.isList$ && (
<>
<h2>list</h2>
<ul>
{indexStore.list$.map(el => (
<li key={el}>{el}</li>
))}
</ul>
</>
)}
</>
);
}
}
react+mobx 编写 Async装饰器的更多相关文章
- react+mobx 编写 withStoreHistory 装饰器
主要作用是向store里面注入一个history对象,方便story里面的函数调用 function withStoreHistory(storeName) { if (!storeName) ret ...
- python练习笔记——编写一个装饰器,模拟登录的简单验证
编写一个装饰器,模拟登录的简单验证(至验证用户名和密码是否正确) 如果用户名为 root 密码为 123则正确,否则不正确.如果验证不通过则不执行被修饰函数 #编写一个装饰器,模拟登录的简单验证 #只 ...
- mobx 添加 isEmpty 装饰器
避免 obj.xxx && obj.xxx.length 这样的写法 store import * as u from "lodash"; function isE ...
- Python练习笔记——编写一个装饰器,测算出一个函数的运行时间
import time def time_value(dec): def wrapper(*args,**kwargs): start_time = time.time() get_str = dec ...
- Python进阶之装饰器
函数也是对象 要理解Python装饰器,首先要明白在Python中,函数也是一种对象,因此可以把定义函数时的函数名看作是函数对象的一个引用.既然是引用,因此可以将函数赋值给一个变量,也可以把函数作为一 ...
- Day4 装饰器——迭代器——生成器
一 装饰器 1.1 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多 ...
- Day4 闭包、装饰器decorator、迭代器与生成器、面向过程编程、三元表达式、列表解析与生成器表达式、序列化与反序列化
一.装饰器 一.装饰器的知识储备 1.可变长参数 :*args和**kwargs def index(name,age): print(name,age) def wrapper(*args,**k ...
- 浅显易懂的谈一谈python中的装饰器!!
hello大家好~~我是稀里糊涂林老冷,一天天稀里糊涂的. 前一段时间学习了装饰器,觉着这东西好高大上哇靠!!哈哈,一定要总结一下,方便以后自己查阅,也希望帮助其他伙伴们共同进步! 装饰器: 大家可以 ...
- Python 装饰器(Decorator)
装饰器的语法为 @dec_name ,置于函数定义之前.如: import atexit @atexit.register def goodbye(): print('Goodbye!') print ...
随机推荐
- 彻底搞清楚javascript中的require、import和export
为什么有模块概念 理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 但是,Javascript不是一种模块化编程语言,在es6以前,它是不支持”类”(class),所以也 ...
- WordPress主题开发:footer.php
最简 <?php wp_footer();?> </body> </html>
- eclipse项目名称后面括号里的名称和项目名称不一样
解决方案: 1:项目右键-属性(Properties)-Web Project Setting, 改名称注意:这个名字将成为你在浏览器访问的路径 2:打开项目目录的.setting文件夹,随便一个文本 ...
- Android编码学习之Adapter
1. Apter的作用 Adapter是将数据绑定到UI界面上的桥接类.Adapter负责创建显示每个项目的子View和提供对下层数据的访问.Adapter的作用就是将要在列表内显示的数据和列表本身结 ...
- 转发:entos7修改文件夹权限和用户名用户组
Linux系统下经常遇到文件或者文件夹的权限问题,或者是因为文件夹所属的用户问题而没有访问的权限.根据我自己遇到的情况,对这类问题做一个小结.在命令行使用命令“ll”或者“ls -a”,可以查看文件或 ...
- java 获取当天(今日)零点零分零秒
两种方法 一种得到的是时间戳,一种得到是日期格式: 1.日期格式的 Calendar calendar = Calendar.getInstance(); calendar.setTime(new D ...
- 19.翻译系列:EF 6中定义自定义的约定【EF 6 Code-First约定】
原文链接:https://www.entityframeworktutorial.net/entityframework6/custom-conventions-codefirst.aspx EF 6 ...
- 【Vegas原创】VirtualBox扩容、分割的整体方案
背景:在低压i7上跑vmware,卡顿无极限,决定转战virtual Box. 但是VirtualBox最讨厌的一点,就是vdi文件无法分割,平时习惯备份的我,百度网盘最大也就20G的上传.咋整? v ...
- Java 设计模式专栏
Java 设计模式之工厂模式学习心得 转:Java 设计模式之单例模式 转: Java设计模式之建造者模式 转:Java设计模式之代理模式
- window10下TensorFlow-gpu环境搭建
安装python 下载python3.5.4 https://www.python.org/downloads/release/python-354/ 选择Windows x86-64 executa ...