Mobx入门和较佳实践

Mobx入门和较佳实践

之前讲到过我们团队从redux迁移到mobx,为什么我们抛弃了redux呢?一个很重要的原因就是使用redux开发,代码量增多,复杂度增大,同时需要维护api,action,reducer,即使是借助redux-thunk或者redux-promise这样的中间件,action这一层的代码量感觉还是太多了,光是actionType的命名都需要斟酌思考,mobx将action和reducer结合到了一起,省去了type的命名,以及es6+的装饰器的引入,整个代码量和复杂度降低了不少,自从用了mobx整个人都轻松了许多!

首先简单介绍一下mobx,他和redux类似数据都是单向流动,通过action改变state,促使view更新

下面让我们来撸一个简单的例子吧

//store.js
import { observable, autorun, flow, computed, when, reaction, action } from 'mobx';
import * as api from './api';

class UserStore {
    @observable
    basicInfo = {};
    
    // constructor函数里面可以放一些初始化的action
    constructor() {
        // when如果没有第二个参数,则返回一个promise,配合await或yield使用
        when(   
            // 一旦...
            () => false,
            // ... 然后
            () => this.dispose()
        )
    }
    
    // 在observable对象发生变化时,会调用,第二个参数表示配置,有delay和onError
    auto = autorun(
        e => {
            // console.log(e);
        },
        { delay: 3000 }
    );
    
    // autorun的变种,可以更精确的配置对象的属性
    myReaction = reaction(() => this.isLogined, isLogined => console.log('myReaction'));
    
    // 类似vue中computed的用法
    @computed
    get total() {
        console.log(this.currentStaffInfo);
        return this.currentStaffInfo;
    }

    getBasicInfo = flow(function*() {
        try {
            // 这里也可以调用其他action
            this.basicInfo = (yield api.queryInfo()).payload;
        } catch (error) {
            this.basicInfo = {};
        }
    });
    
    @action
    setBasicInfo = value => {
        this.basicInfo = value;
    };
}

export default new UserStore();
复制代码
//User.jsx
import React, { Component } from 'react';
import { observer, Provider, inject } from 'mobx-react';
import UserStore from './store';

@inject('UserStore')
@observer
class User extends Component {
    componentDidMount() {
        this.props.UserStore.getBasicInfo()
    }
    render() {
        return (
            <div>
                {this.props.UserStore.basicInfo.name}
            </div>
        );
    }
}

export default (
    <Provider UserStore={UserStore}>
        <User />
    </Provider>
);
复制代码

这样就大功告成啦,怎么样,mobx是不是特别简单清爽,mobx还有很多其他特性,希望大家能够多多去探索交流!

转载于:https://juejin.im/post/5c07d21a51882518805aee3a

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101250.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c语言中ff用16进制怎么表示什么,0xff(十六进制0xff表示什么)

    c语言中ff用16进制怎么表示什么,0xff(十六进制0xff表示什么)0xff从数值上看,0xff表示一个十六进制数FF,也就是十进制的255。从电平高低来看,比如读取P1口得到0xFF,表示P1口8个引脚都是高电平。以0x开始的数据表示16进制,0xff换成十进制为255。A,B,C,D,E,F这五个字母来分别表示10,11,12,13,14,15。16进制变十进制:f表示15。第n位的权值为16的n次方,由右.我现在要把这个16进制的数转换成2进制的或者是10…

    2022年6月19日
    104
  • git拉取代码冲突了怎么解决_github拉取代码慢

    git拉取代码冲突了怎么解决_github拉取代码慢问题描述在idea通过git从develop分支拉取最新代码时,又遇到了git冲突,特此记录一下原因分析:大部分原因都是其他同事更改了某些文件然后本地也更改了同样的文件导致冲突,所以每天上班先拉取一下最新代码,这样会大大减少冲突发生的可能(别问我怎么知道的)解决方案:如下图所示:我们点击merge去合并即可,解决冲突,不建议直接选择acceptyours或者accepttheirs会导致代码覆盖…

    2022年10月20日
    2
  • shell中if elif_shell编程if语句格式

    shell中if elif_shell编程if语句格式测试shell脚本编程时,写了如下代码:在对if-elif-else分支进行数值判断时,发现一个奇怪的现象:如果使用testconditon(即[condition])进行判定,当第一条if条件为假时,无论代码中的elif语句条件是否为真,都输出elif分支下的语句;查看输出结果,发现输出结果显然与期望值不一样为了能够得到预期结果,发现如果采用双圆括号是进行判断,可得到预期结…

    2022年8月18日
    8
  • Perf4J@Profiled的几种写法[通俗易懂]

    Perf4J@Profiled的几种写法[通俗易懂]在项目中使用Perf4J的最简便的方法就是直接在任何一个需要监控的方法上加上@Profiled注释即可。 @Profiled支持一些定制,在此记录几种@Profiled写法: 1、最简写法@Profiled     由此产生的日志语句形如: 2009-09-0714:37:23,734[main]INFOorg.perf4j.T…

    2022年4月29日
    34
  • Ubuntu中Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend)问题的解决「建议收藏」

    Ubuntu中Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend)问题的解决「建议收藏」环境:Ubuntu18.04-amd64问题描述:在ubuntu下安装mysql时,进行apt-get操作,出现了如下报错:参考了一篇博客,已经解决问题。现将步骤记录下来。解决办法:第一种情况: 进程中存在与apt相关的正在运行的进程: 首先检查是否在运行apt,apt-get相关的进程psaux|grep-iapt如果存在与apt相关的正在运行的进程…

    2022年10月7日
    4
  • Yui3使用指南一

    Yui3使用指南一1、开始使用script>//CreateaYUIsandboxonyourpage.YUI().use(‘node’,’event’,function(Y){//TheNodeandEventmodulesareloadedandreadytouse.//Yourcodegoeshere!});script>

    2022年7月12日
    17

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号