[mobx]入门学习:API的理解和mobx-react在hooks的demo

一、[前导]class类语义

用原型链实现继承:

function Animal(){}  //父类
function Dog(){}    //子类

/**根据原型链
  dog._proto_ === Animal.prototype
  Dog.proptotype._proto_ === Animal.prototype
**/

//--->实现继承(但是Dog.prototype.constructor指向的是Animal)
Dog.prototype = Object.create(Animal.prototype);


//父类Animal定义两个方法name,say

Object.defineProperties(Animal.prototype,{
    name:{
        value() {
            return 'Animal';
         }
    }
    say:{
        value() {
            return 'i am ${this.name()}';
         }
    }
});


//在子类Dog中重新定义name方法(多态实现)

Dog.prototype = Object.create(Animal.prototype, {
    //让子类的constructor强制指向自己
    constructors:{
        value: Dog,
        enumerable: false
    }
    name:{
        value() {
            return 'Dog';
        }
    }
});

class类的继承:

class Animal {
    name() {
        return 'Animal';
    }
}

class Dog extends Animal {
    name() {
        return 'Dog';
    }
}

console.log(new Dog() instanceof Animal); //true

二、【前导】修饰器: decorator

修饰类方法

/*
log修饰器,target指被修饰的类对象calNumber
*/
function log(target){
}


/*
** @ 是decorate的语法 --意为修饰
*/
@log
class calNumber {   
}

修饰类成员

/*
reanderOnly 修饰器
**target指被修饰的成员对象 data
**key 对象名称
**descriptor
*/
function reanderOnly(target, key, descriptor ){
    descriptor.writable = false; //不可改
}


class calNumber {  
    @reanderOnly data = '888';
}

三、mobx--observable

[1] observable 数组: 将数组转变为可观察的,数组中的所有包括未来的值都是可观察的。

 

[2] observable.box --对于原始类型:number , string , Boolean,包装成可观察的数据.

每个对象都有Get方法,可以得到原始类型值,set方法可以去设置更新原始类型值。

import {observable} from "mobx";

const cityName = observable.box("Vienna");

console.log(cityName.get());
// 输出 'Vienna'

cityName.observe(function(change) {
    console.log(change.oldValue, "->", change.newValue);
});

cityName.set("Amsterdam");
// 输出 'Vienna -> Amsterdam'

API简化 ,在class类定义中,可以直接使用decorate的语法:比如

@observable str = "hello";
@observable arr = [1,2,3,4,5];
@observable num = 88;

四.computed 、autorun

computed:纯函数,返回一个值。

autorun:在可观察数据被修改后,自动去执行依赖的数据的函数。

import {observable, computed , autorun} from 'mobx'

class Store {
  @observable title:string = "hello mobx";
  @observable age:number = 44;

  @computed get calculate() {
    return this.age < 88 ? '中年人' : '老年人';
  }

}

var store = new Store();

autorun(() => {
  console.log(store.calculate); //'中年人'
}, {
  onError(e) {
      window.alert("onError");
  }
})

 五、when、reaction

when

  when(predicate: () => boolean, effect?: () => void, options?)

when 观察并运行给定的 predicate,直到返回true。 一旦返回 true,给定的 effect 就会被执行,然后 autorunner(自动运行程序) 会被清理。 该函数返回一个清理器以提前取消自动运行程序。

when接收两个参数,第一个参数返回true,第二个参数就会执行。

  • 如果第一个参数一开始就返回真,那么第二个参数会同步执行。   
  • 第一个参数必须是根据可观察的数据来计算boolean返回值,不能是普通变量。
class Store {
  @observable title:string = "hello mobx";
  @observable age:number = 44;
  @observable isVisible:boolean = false;

}

var store = new Store();

when(() =>store.isVisible , ()=> console.log("it is true!"));

store.isVisible = true;
// Log: it is true!

reaction

reaction接收两个参数,第一个参数返回的值,作为第二个函数的参数

应用场景:第一次数据拿到后,可加入缓存。

class Store {
  @observable title:string = "hello mobx";
  @observable age:number = 44;
  @observable isVisible:boolean = false;

}

var store = new Store();

reaction(() =>[store.title , store.age ], (arr:any[]) => console.log(arr));
//改变被观察的数据的值
store.title = "we are";
store.age = 32;

// Log: ["we are" , 32]

 六、action: 改变观察的数据

action是任何用来修改状态的东西。将多次对可观察数据的状态的赋值合并成一次,达到减少触发autorun 和reaction的次数。

class Store {
  @observable title:string = "hello mobx";
  @observable age:number = 44;
  @observable isVisible:boolean = false;

  @action bar() {
    store.title = "we are";
    store.age = 32;
  }

}

var store = new Store();

reaction(() =>[store.title , store.age ], (arr:any[]) => console.log(arr));

//调用bar这个action
store.bar();
// Log: ["we are" , 32]

action.bound

action 装饰器/函数遵循 javascript 中标准的绑定规则。 但是,action.bound 可以用来自动地将动作绑定到目标对象。 注意,与 action 不同的是,(@)action.bound 不需要一个name参数,名称将始终基于动作绑定的属性。

class Store {
  @observable title:string = "hello mobx";
  @observable age:number = 44;
  @observable isVisible:boolean = false;

  @action.bound bar() {
    store.title = "we are";
    store.age = 32;
  }

}

var store = new Store();

reaction(() =>[store.title , store.age ], (arr:any[]) => console.log(arr));

//调用bar这个action
var bar  = store.bar;
bar();
// Log: ["we are" , 32]
class Store {
  @observable title:string = "hello mobx";
  @observable age:number = 44;
  @observable isVisible:boolean = false;
  @observable list: number[] = [1,2,3,4];

  //删除list中最后一项
  @action.bound cancel() {
    console.log("@action.bound",this);
  }

  @action test() {
    console.log("@action",this);
  }

}
const store = new Store();
store.cancel();
store.test();

runInAction(name?, thunk)

runInAction(f) 是 action(f)() 的语法糖。可以用于匿名的action:

var store = new Store();

reaction(() =>[store.title , store.age ], (arr:any[]) => console.log(arr));

runInAction(() =>{
  store.title = "we are";
  store.age = 32;
})
// Log: ["we are" , 32]


mobx-react的应用

【1】

【2】mobx v6.0以上

1.mobx/store.js

 2.mobx/index.js

3.src/index.tsx

 4.父组件 Box/BarBox.tsx

 5.子组件 cube,tsx

 效果

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React Hooks 实战项目包括解决真实开发场景下的问题和应用基础知识、进阶知识以及实践经验。这些项目可以帮助开发者在实际开发中更加游刃有余地应用 React Hooks。其中一些项目包括: 1. React 基础知识项目: - 搭建 React 项目:学习如何使用 React 创建一个新的项目。 - React 组件:了解如何创建和使用 React 组件,以及组件之间的通信。 - JSX 语法:学习如何在 React 中使用 JSX 语法来创建组件。 - CSS 处理方案:探索不同的 CSS 处理方案,如 CSS-in-JS 或 CSS 模块化等。 - 生命周期:了解 React 组件的生命周期及其使用方法。 2. React 进阶知识项目: - 表单处理:学习如何使用 React 处理表单输入,并验证和提交表单数据。 - 事件处理:掌握 React 中处理事件的方法,如点击事件、输入事件等。 - Portals 的使用:了解如何使用 Portals 在 React 中实现跨组件的 DOM 渲染。 - 状态管理:学习如何使用状态管理库(如 Redux 或 Mobx)来管理应用程序的状态。 3. 实战项目: - 社交媒体应用程序:开发一个基于 React Hooks 的社交媒体应用,包括用户认证、发布消息、评论等功能。 - 待办事项应用程序:使用 React Hooks 构建一个简单的待办事项列表应用,实现添加、删除和完成任务等功能。 - 博客应用程序:开发一个博客应用,包括文章列表、文章详情、评论等功能。 通过这些实战项目,开发者可以在实践中掌握 React Hooks 的使用,应对真实开发场景中的问题,并提升自己的 React 技能水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值