创建项目第六步 mobx

1、安装

yarn add mobx
yarn add mobx-react

2、新建/src/store/store.js

import {observable, computed, action, autorun,runInAction} from 'mobx';
// import {observable, computed, action} from 'mobx';
class Store {
@observable tradeCfg = {
'sadf':'sadf'
};
@observable baseInfo = {};
@observable callback = null;
@observable token = [
{
"id":1,
"name":"YD"
},
{
"id":2,
"name":"ETH"
}
];
} export default Store;

Router.js 新增加如下代码

import { Provider } from 'mobx-react';
import { observable, useStrict ,autorun} from 'mobx'; import App from './App.js';
import firstStore from './store/first';
// const cnstore = new cnStore();
const stores = {
first: new firstStore(),
// ...other stores
}; <Provider {...stores}>
<App/>
</Provider> 完整代码如下:
import React from 'react'; import { BrowserRouter, HashRouter, Route, Link, Switch } from 'react-router-dom';
import { Provider } from 'mobx-react';
import { observable, useStrict ,autorun} from 'mobx'; import App from './App.js';
import firstStore from './store/store';
// const cnstore = new cnStore();
const stores = {
first: new firstStore(),
// ...other stores
}; const Router = () => (
<BrowserRouter>
<Provider {...stores}>
<App/>
</Provider>
</BrowserRouter>
)
export default Router;

mobx 报错

SyntaxError: /Users/hello/workspace/fe.youdeal.io/app/my-app/src/store/otc.js: Support for the experimental syntax 'decorators-legacy' isn't currently enabled (3:5):

  1 | import {observable, computed, action} from 'mobx';
2 | class Store {
> 3 | @observable tradeCfg = {
| ^
4 | 'sadf':'sadf'
5 | };
6 | @observable baseInfo = {};

以上问题 需安装

yarn add @babel/plugin-proposal-decorators
yarn add @babel/plugin-proposal-class-properties

需添加代码 package.json

"presets": [
["react-app"],
["@babel/preset-react"]
],
"plugins": [
["@babel/plugin-proposal-decorators", {"legacy": true }],
["@babel/plugin-proposal-class-properties", { "loose" : true }]
]

event 页面调整

import React , { Component } from 'react';
import { withRouter,NavLink,Switch,Redirect,Route} from 'react-router-dom'; import {observer,inject} from 'mobx-react';
// 导入需要的模块
@withRouter
@inject('first')
@observer
class View extends Component {
render(){
console.log(this.props.first)
return (
<React.Fragment>
<div className="mian">这是event面</div>
<NavLink to="/">首页</NavLink><br/>
<NavLink to="/input">表单</NavLink><br/>
<NavLink to="/event">事件</NavLink>
</React.Fragment>
)
}
}
export default View;

常见问题

MobX 是框架吗?

MobX 不是一个框架。它不会告诉你如何去组织你的代码,在哪存储状态或者如何处理事件。然而,它可能将你从以性能的名义对你的代码提出各种限制的框架中解放出来。

MobX

简单、可扩展的状态管理

MobX 是一个经过战火洗礼的库,它通过透明的函数响应式编程(transparently applying functional reactive programming – TFRP)使得状态管理变得简单和可扩展。MobX背后的哲学很简单:

任何源自应用状态的东西都应该自动地获得。

其中包括UI、数据序列化、服务器通讯,等等。

为什么使用Mobx

React 和 MobX 是一对强力组合。React 通过提供机制把应用状态转换为可渲染组件树并对其进行渲染。而MobX提供机制来存储和更新应用状态供 React 使用。

一些简单的api介绍

1:状态state

组件中的数据。

2:被观察observable

被observable修饰的state数据将会暴露给整个app,各观察者组件都可以根据state值的变化作出响应。

3:观察者observer

被observer修饰的组件,将会根据组件内使用到的被observable修饰的state的变化而自动重新渲染(原理:用autorun包裹了render函数,state变化触发autorun从而自动渲染)

4:action

state值的修改需要在action函数中进行。

5:衍生值computed

get:基于state值,通过一些计算得到的新值并返回给调用者。

set:get的相反运算,参数为一个值,由该值进行get函数中的反运算,得到对应的state值并赋予state。

6:衍生行为autorun

基于state的变化而触发的一系列行为(注意:这些行为不改变state值、不产生新的数据),通常为日志记录、请求发送、UI渲染等。

import { Provider } from ‘mobx-react’;

mobx-react中Provider和inject通过context将store注入并使得任何层级的子组件可以访问到store。

在根组件通过Provider组件注入它

import { withRouter,NavLink,Switch,Redirect,Route} from ‘react-router-dom’;

import {observer,inject} from ‘mobx-react’;

// 导入需要的模块

@withRouter

@inject(‘first’)

@observer

@inject(‘first’)

在子组件中通过inject获取store

@observer

可以把你的(无状态函数)组件变成响应式组件,方法是在组件上添加 observer 函数/ 装饰器.

@withRouter

1.目的就是让被修饰的组件可以从属性中获取history,location,match

路由组件可以直接获取这些属性,而非路由组件就必须通过withRouter修饰后才能获取这些属性了

2.withRouter是专门用来处理数据更新问题的。

在使用一些redux的的connect()或者mobx的inject()的组件中,如果依赖于路由的更新要重新渲染,会出现路由更新了但是组件没有重新渲染的情况。这是因为redux和mobx的这些连接方法会修改组件的shouldComponentUpdate。

注意

constructor(){

makeObservable(this)

}

更新数据

mobx在react的使用的更多相关文章

  1. 十分钟介绍mobx与react

    原文地址:https://mobxjs.github.io/mobx/getting-started.html 写在前面:本人英语水平有限,主要是写给自己看的,若有哪位同学看到了有问题的地方,请为我指 ...

  2. [React + Mobx] Mobx and React intro: syncing the UI with the app state using observable and observer

    Applications are driven by state. Many things, like the user interface, should always be consistent ...

  3. react mobx webpack 使用案例

    1.package.json: { "name": "wtest", "version": "1.0.0", " ...

  4. mobx.js 使用教程-react

    1.store: import { observer } from "mobx-react"; import { observable, action, computed ,aut ...

  5. 从零配置webpack(react+less+typescript+mobx)

    本文目标 从零搭建出一套支持react+less+typescript+mobx的webpack配置 最简化webpack配置 首页要初始化yarn和安装webpack的依赖 yarn init -y ...

  6. 前端003/【React + Mobx + NornJ】开发模式

    1.React + Mobx + NornJ 开发模式快速上手教程 github网址:https://github.com/joe-sky/nornj-cli/blob/master/docs/gui ...

  7. React MobX 开始

    MobX 用于状态管理,简单高效.本文将于 React 上介绍如何开始,包括了: 了解 MobX 概念 从零准备 React 应用 MobX React.FC 写法 MobX React.Compon ...

  8. Vue.js 2.0 和 React、Augular等其他框架的全方位对比

    引言 这个页面无疑是最难编写的,但也是非常重要的.或许你遇到了一些问题并且先前用其他的框架解决了.来这里的目的是看看Vue是否有更好的解决方案.那么你就来对了. 客观来说,作为核心团队成员,显然我们会 ...

  9. mobx源码解读2

    我们将上节用到的几个类的构造器列举一下吧: function Reaction(name, onInvalidate) { if (name === void 0) { name = "Re ...

随机推荐

  1. Atcoder Regular Contst 084 D - XorShift(bitset)

    洛谷题面传送门 & Atcoder 题面传送门 没错,这就是 Small Multiple 那场的 F,显然这种思维题对我来说都是不可做题/cg/cg/cg 首先如果我们把每个二进制数看作一个 ...

  2. Codeforces 1149C - Tree Generator™(线段树+转化+标记维护)

    Codeforces 题目传送门 & 洛谷题目传送门 首先考虑这个所谓的"括号树"与直径的本质是什么.考虑括号树上两点 \(x,y\),我们不妨用一个"DFS&q ...

  3. MySQL 数据库的下载、安装和测试

    实例:Ubuntu 20.04 安装 mysql-server_5.7.31-1ubuntu18.04_amd64.deb-bundle.tar 1. 下载安装MySQL(安装 MySQL 5.7) ...

  4. docker 使用加速器下载

    因为docker官网的镜像地址docker.hum.com是在国外的 所以下载速度比较慢,国内有一些镜像源是比较快的,内容是和docker官网的一致 常用的加速器有 docker-cn 阿里云加速器 ...

  5. 简单mvc框架核心笔记

    简单mvc框架核心笔记 看了thinkphp5的源码,模仿写了一个简单的框架,有一些心得笔记,记录一下 1.目录结构 比较简单,没有tp那么复杂,只是把需要的核心类写了一些. 核心类库放在mykj里, ...

  6. LeetCode 第一题 两数之和

    题目描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组 ...

  7. kubernetes部署 kube-apiserver服务

    kubernetes部署 kube-apiserver 组件 本文档讲解使用 keepalived 和 haproxy 部署一个 3 节点高可用 master 集群的步骤. kube-apiserve ...

  8. Vector总结及部分底层源码分析

    Vector总结及部分底层源码分析 1. Vector继承的抽象类和实现的接口 Vector类实现的接口 List接口:里面定义了List集合的基本接口,Vector进行了实现 RandomAcces ...

  9. android studio Please configure Android SDK / please select Android SDK

    有可能是sdk文件损坏造成的. file->settings->appearance&behavior->system settings->android sdk-&g ...

  10. java Random()用法

    1.random.nextInt() random.nextIn()的作用是随机生成一个int类型,因为int 的取值范围是 -2147483648--2147483647 ,所以生成的数也是处于这个 ...