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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • grid数据格式_echarts grid属性

    grid数据格式_echarts grid属性显示图片grid.Column(null,”图片”,format:p=>Html.Raw(string.Format(“<imgsrc='{0}’/>”,p.ImageUrl)),style:”g-img”),日期格式:grid.Column(“EditDate”,”修改日期”,(p)=>string.F…

  • UE4 Slate四 SlateUI如何做动画「建议收藏」

    UE4 Slate四 SlateUI如何做动画「建议收藏」原创文章,转载请注明出处。点击观看上一篇《UE4Slate三SlateUI代码讲解》点击观看下一篇《UE4Slate五开篇》虚幻引擎SlateUI介绍1>前言2>SlateAnimation代码1>前言我们都知道在UMG里面如何创建一个UMG的动画,其实就是时间帧动画。那么在Slate纯手写的代码上如何做动画呢?2>SlateAnimation代码…

  • typedef struct Lnode{ Elemtype data; struct Lnode *next; } Lnode,*Linklist;「建议收藏」

    typedef struct Lnode{ Elemtype data; struct Lnode *next; } Lnode,*Linklist;「建议收藏」*next是指向下一个值的地址而*Linklist是当前这个值的地址,只是这个值里有数据data,和下一个值的地址就是说链表中,因为数据是随机储存的,所以地址不是连续的,要想读取下一个数,就要知道下一个数据的地址不知道有没有看懂,表达能力不是很好*Linklist相当于一个数组头指针,只是这个数组的元素是结构体*next则是构成链表的一个基本元素,指向该结点下一个结点的地址从某种意义上讲,*Linklist是指定了这段空间在内存中的位置(可以申请连续的结点空间),而*next则对结点进行了一

  • 网站的引导页介绍

    外贸企业站就是要走出过门,买域名,买空间的、请设计公司、请这请那,一切的努力都是要为了能通过网站给公司带来订单,“一分耕耘一分收获”,但是耕耘了未必就有收获,很多企业站点建好了,可是并没有发现,它所给

    2021年12月25日
  • Html 设置整个页面的背景颜色

    Html 设置整个页面的背景颜色在index.css中添加body{background:#ffffff}设置颜色为白色也就是给index.html设置了body的颜色,然后就可以看到整个html页面的颜色就成了白色。

  • mybtis jdbctype

    mybtis jdbctype思路:1.在mapper.xml中使用#{参数,jdbctype=VARCHAR}2.在javadao层中使用传入map的方式3.mybatis中就可以应用字段了mybatisjdbctype写法daomapper.xml例子:&lt;?xmlversion="1.0"encoding="UTF-8"?&gt;&lt;!DOCTYPEmapper…

    2022年10月20日

发表回复

您的电子邮箱地址不会被公开。

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