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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 网络号 子网号 主机号「建议收藏」

    网络号 子网号 主机号「建议收藏」网络号子网号主机号第一个例子:已知 IP:192.169.20.50   子网掩码:255.255.255.224  求网络号 子网号 主机号。首先子网掩码255.255.255.224转换为二进制位255.255.255.224:11111111.11111111.11111111.11100000可以看到这个掩码的左边三节与C类默认掩码相同,只有第四节与C类默认掩码不 同,

    2022年6月24日
    30
  • 人工智能 – 五子棋人机对战

    人工智能 – 五子棋人机对战人工智能 – 五子棋人机对战作者:jig    阅读人次:6635    文章来源:本站原创    发布时间:2007-7-12    网友评论(8)条 
    原帖及讨论:http://bbs.bccn.net/thread-154777-1-1.html
    */————————————————————————————–
    */出自:编程中国  http://www.

    2022年6月17日
    36
  • 【搜索】八皇后「建议收藏」

    【搜索】八皇后「建议收藏」这道题应该不陌生吧,这是一道很经典的搜索题。总的意思就是说在一个n*n的棋盘上放n个皇后,要求它们互不攻击,求解有多少种情况,并输出前三种。那么开始分析:这毕竟是一道搜索题,搜索最大的弊端是什么,

    2022年8月4日
    8
  • JAVA中死锁例子分析和上下文切换的实战[通俗易懂]

    本篇是整理《java多线程编程核心技术》和《java并发编程的艺术》中对于死锁和上下文切换 的学习总结!

    2022年2月26日
    37
  • kotlin 跳出循环[通俗易懂]

    kotlin 跳出循环[通俗易懂]kotlin跳出循环有一个标记,满足条件就跳到标记处。

    2022年6月3日
    37
  • docker(6)镜像的使用

    docker(6)镜像的使用前言Docker的三大核心概念:镜像、容器、仓库。初学者对镜像和容器往往分不清楚,学过面向对象的应该知道类和实例,这跟面向对象里面的概念很相似我们可以把镜像看作类,把容器看作类实例化后的对象。|

    2022年7月28日
    9

发表回复

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

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