在写 关于MVC模式简单代码实现 的过程当中,以为最麻烦的就是操做 DOM。因此此次升级了,打算用 React。用过 React 的同窗都知道,React 在更新视图时,必需要经过 setState
方式改变状态,这一过程是须要咱们主动调用的。而 Vue 是经过对 data
下的变量赋值直接更新了视图,Vue 之因此这么简单,是由于采用了数据劫持的方式。因此,此次的目的就是在 React 的基础上实现和 Vue 相似的效果。react
实现思路就是利用高阶组件里的反向继承对包裹组件的 state
劫持。这是一个练手的小项目,没考虑那么多😂。为何这么闲,那是由于以前写了 用Type驯化JavaScript 这篇文章,因此就捣鼓出这么一个玩意。git
全部代码可见githubgithub
// Mvvm.tsx const hocExtends = (WrapperComponent: ComponentClass) => ( class extends WrapperComponent { constructor(props: any) { super(props); } render() { let self = this; this.state = new Proxy({ ...this.state }, { get: function (target, key, receiver) { return Reflect.get(target, key, receiver); }, set: function (target, key, value, receiver): any { self.setState({ [key]: value }) return Reflect.set(target, key, value, receiver); } }) return super.render() } } ) ...... filterSearchStuff(searchStuff: string): void { const { stuffData } = this.state; let stuffItem: IStuff = stuffData.find((item: IStuff) => item.stuff === searchStuff) this.state.stuffItem = stuffItem; // this.setState({ // stuffItem // }) } ......