import React, { Component } from "react";
import { View, Text } from "react-native";
var globalID = 0;
//@ts-ignore
function observable(obj) {
var oID = ++globalID;
return new Proxy(obj, {
get: function(target, key, receiver) {
//@ts-ignore
collect.startCollect(oID + "" + key);
return Reflect.get(target, key, receiver);
},
//@ts-ignore
set: function(target, key, value, receiver) {
Reflect.set(target, key, value, receiver);
//@ts-ignore
collection[oID + "" + key] && collection[oID + "" + key].forEach(c => {
c();
if($render && $forceUpdate){
$render()
$forceUpdate()
}
});
}
});
}
var collection = {};
var collect = {
//@ts-ignore
begin: function(handler) {
//@ts-ignore
collection.handler = handler;
//@ts-ignore
collection.now = true;
},
//@ts-ignore
startCollect: function(oIDKey) {
//@ts-ignore
if (collection.now) {
//@ts-ignore
if (collection[oIDKey]) {
//@ts-ignore
collection[oIDKey].push(collection.handler);
} else {
//@ts-ignore
collection[oIDKey] = [collection.handler];
}
}
},
end: function() {
//@ts-ignore
collection.now = false;
}
};
let $render: any
let $forceUpdate: any
//@ts-ignore
function observableRender(handler) {
collect.begin(handler);
handler();
collect.end();
//@ts-ignore
return function(tag){
tag.prototype.componentWillMount = function() {
$render = this.render.bind(this);
$forceUpdate = this.forceUpdate.bind(this);
}
return tag
}
}
var obj = observable({
a: 0,
});
setInterval(()=>{
obj.a = Math.random()
},100)
@observableRender(() => {
obj.a;
})
class App extends Component {
scrollView: any;
currIndex: number;
timer: any;
state = {
hide: true
};
render() {
return (
<View>
<Text>数值变化渲染::{obj.a}</Text>
</View>
);
}
}
export default App;
2019-11-15
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 【早盘核心概念】 1.折叠屏手机市场再添新军,行业有望加速爆发:【中石科技(300684)、股吧】、水晶光电、东睦...
- 在深圳这样一个追求快速、高效的一线城市,工作节奏快、工作压力大,几乎成了大多数人的常态,人们似乎已经将加班文化视为...