mobx的使用

mobx的使用

1、API

  • mobx-react
    • Provider 包裹根组件,用于传递数据
    • observer 组件变为响应式
    • inject 接收mobx实例(用于类组件)
    • MobXProviderContext
  • mobx
    • observable 声明变量
    • action 声明函数用于修改observable 的值
    • makeObservable 更新状态

2、安装

  • yarn add mobx
  • yarn add mobx-react
    使用@语法糖需要安装
  • yarn add @babel/plugin-proposal-decorators
  • yarn add @babel/plugin-proposal-class-properties

3、安装之后需要修改package.json文件

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

现在就已经可以正常使用mobx了

4、父级入口管理

1、引入mobx-react中的Provider
import {Provider} from 'mobx-react'
2、将仓库中的类进行集中管理

const stores ={store1 = new Store1( ),store2 = new Store2( ),……
}

3、通过Provider向下传递
<Proveder {...stores}></Provider>

5、子组件接收(类组件、函数组件)

  • 类组件
    1、从react-router-dom引入withRouter
    import {withRouter} from 'react-router-dom';
    2、从mobx-react中引入inject和observer;
    3、使用
@withRouter  //更新的作用
@inject('store1','store2')  //接收
@observer         //组件变为响应式
//这三步会把对应的store挂在props上
  • 函数组件
    1、从react-router-dom引入withRouter
    2、从mobx-react中引入inject和MobXProviderContext;
    3、使用
//获取mobox实列
//const Store1 = React.useContext(MobXProviderContext)['Store1'];//简单封装之后
function useStore(name) {return React.useContext(MobXProviderContext)[name]
}
const Store1 = useStore('Store1')export default withRouter(observer(componentName))
5.0版本
用class类创建仓库
大多使用`@`语法糖
声明变量 @observable  
声明函数 @action (用箭头函数,不然解构会失去this)
监测更新 makeObservable(this)configure   //开启严格模式之后需要用runInAction(()=>{这里写逻辑}) 
runInAction6.0版本 
用makeAutoObservable( )创建对象
不能写箭头函数,所以使用方法时不能解构,不然会失去this

6、 5.0版本案列

目录

	srcstore- index.js- num.jsviewsAbout- index.jsx

src/store/index.js

这个文件主要是引入所有的mobx文件,做一个统一的导出

import Num from './num.js';const stores = {num: new Num()
}export default stores;

src/store/num.js

import { observable, action, makeObservable } from 'mobx';class Num {constructor() {//获取thismakeObservable(this)}//声明变量@observable num = 0;//声明函数@actionincrement = () => {this.num += 1}@actiondecrement = () => {this.num -= 1}
}export default Num

src/views/About/index(函数组件写法)

withRouter数据更新 +MobXProviderContext接收变量+observer 数据响应

import React, { Fragment, useEffect } from 'react';
import { withRouter } from 'react-router-dom';
import { MobXProviderContext,observer } from 'mobx-react'
const View = () => {const {num,increment,decrement} = React.useContext(MobXProviderContext)['num']useEffect(() => {console.log(num)},[])return (<Fragment><h2>关于页面</h2><hr />{num}<button onClick={increment}>增加1</button><button onClick={decrement}>减小1</button></Fragment>)
}export default withRouter(observer(View))

src/views/About/index(类组件写法)

withRouter更新+inject接收+observer数据响应
inject接收的是store的属性
通过this.props可以拿到值

import React, { Fragment,Component } from 'react';
import { withRouter } from 'react-router-dom';
import { inject, observer } from 'mobx-react';
//这里注意要放在组件之外
@withRouter
@inject('num')
@observer
class View extends Component{componentDidMount() {console.log(this.props.num)}render() {let {num,increment,decrement}=this.props.numreturn (<Fragment><h2>关于页面</h2><hr />{num}<button onClick={increment}>增加1</button><button onClick={decrement}>减小1</button></Fragment>)}
}export default View

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/510988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OPLG:新一代云原生可观测最佳实践

简介&#xff1a;OPLG 体系拥有成熟且富有活力的开源社区生态&#xff0c;同时也经过了大量企业生产环境的实践检验&#xff0c;是当下建设新一代云原生统一可观测平台的热门选择。但是&#xff0c;OPLG 只是提供了一个技术体系&#xff0c;如何灵活运用&#xff0c;解决实际问…

EventBridge 集成云服务实践

简介&#xff1a;本篇文章主要向大家分享了通过 EventBridge 如何集成云产品事件源&#xff0c;如何集成云产品事件目标以及通过事件流如何集成消息产品。 作者&#xff1a;李凯&#xff08;凯易&#xff09; EvenBridge 集成概述 EventBridge 是阿里云所推出了一款无服务器…

前端性能——数据持久化

如何实现数据持久化 一般情况下&#xff0c;借用本地存储用的比较多&#xff0c;或者一些插件&#xff0c;如vue的keep-alive&#xff0c;配合redux使用的persist 为什么需要数据持久化 1、减少发起请求的次数&#xff0c;从而提高性能。 场景&#xff1a;比如一个网站&…

云原生微服务的下一站,微服务引擎 MSE 升级

简介&#xff1a;管好微服务&#xff0c;成为云原生时代的新难题。 管好微服务&#xff0c;成为云原生时代的新难题。 从建好微服务到管好微服务&#xff0c;差的虽是一个字&#xff0c;连接起两边的却需要大量的微服务落地经验。因为软件架构的核心挑战是解决业务快速增长带…

火爆全网的“数字人”,到底是个啥?

作者 | 小枣君来源 | 鲜枣课堂庄子他老人家说过&#xff1a;“人生&#xff0c;就是一场游戏。”对于这场游戏&#xff0c;有些人玩得很嗨&#xff0c;到了结尾不肯退场&#xff0c;总希望无限期玩下去。例如秦始皇&#xff0c;总想着灵丹妙药、长生不死。还有些人呢&#xff0…

阿里云RemoteShuffleService新功能:AQE和流控

简介&#xff1a;阿里云EMR自2020年推出Remote Shuffle Service(RSS)以来&#xff0c;帮助了诸多客户解决Spark作业的性能、稳定性问题&#xff0c;并使得存算分离架构得以实施。为了更方便大家使用和扩展&#xff0c;RSS在2022年初开源&#xff0c;欢迎各路开发者共建。本文将…

react如何在父组件中调用子组件事件

父组件是如何使用子组件的事件的&#xff0c;下边数值累加的例子 类组件 将子组件的this传到父组件&#xff0c;给父组件添加一个属性&#xff0c;值为this&#xff0c;之后就可以通过父组件的属性调用子组件的事件了 import React,{Component} from react;// 这是子组件 clas…

OpenSergo 正式开源,多家厂商共建微服务治理规范和实现

简介 OpenSergo&#xff0c;Open 是开放的意思&#xff0c;Sergo 则是取了服务治理两个英文单词 Service Governance 的前部分字母 Ser 和 Go&#xff0c;合起来即是一个开放的服务治理项目。 该项目由阿里云、bilibili、字节跳动&#xff0c;以及 Spring Cloud Alibaba、Nacos…

Linux中常见的网络端口号

在使用计算机或智能手机时&#xff0c;我们使用各种硬件端口&#xff0c;如用于音频、HDMI、Type-c 等的 3.5mm 端口&#xff0c;其用于与硬件外围设备通信。同样&#xff0c;网络端口可以让我们在一台计算机上访问各种网络服务来达到通信的目的。因此&#xff0c;端口被认为是…

如何在云原生混部场景下利用资源配额高效分配集群资源?

简介&#xff1a;由于混部是一个复杂的技术及运维体系&#xff0c;包括 K8s 调度、OS 隔离、可观测性等等各种技术&#xff0c;之前的一篇文章《历经 7 年双 11 实战&#xff0c;阿里巴巴是如何定义云原生混部调度优先级及服务质量的&#xff1f;》&#xff0c;主要聚焦在调度优…

前端面试题网址合辑

八个笔试&面试仓库 1.Front-end Developer Interview Questions网址&#xff1a;https://h5bp.org/Front-end-Developer-Interview-Questions/ 2.CS-Interview-knowledge-Map 网址&#xff1a;https://github.com/InterviewMap/CS-Interview-Knowledge-Map 3.Daily-Questio…

稳定性与高可用保障的工作思路

简介&#xff1a;稳定性与高可用性是老生常谈的两个词。凭借经验和感受我们知道&#xff0c;提高系统的这两项指标&#xff0c;系统会更加健康&#xff0c;产品也会有更好的用户体验。但是如果要给稳定性和高可用性下一个定义该如何表述&#xff1f;稳定性和高可用性这二者又有…

招商银行 KubeVela 离线部署实践

简介&#xff1a;本文将以 KubeVela v1.2.5 版本为例&#xff0c;介绍招商银行 KubeVela 的离线部署实践&#xff0c;来帮助其他用户在离线环境中更便捷的完成 KubeVela 的部署。 招商银行云平台开发团队自 2021 年开始接触 KubeVela&#xff0c;并探索 KubeVela 在招商银行云…

腾讯云数据库自研内核全新升级 新架构比原先性能提升20%

9月16日&#xff0c;腾讯云数据库自研内核TXSQL完成了全新升级。搭载了新一代内核的云数据库在性能上较之前提升超过20%&#xff0c;延迟降低80%。目前&#xff0c;新一代内核TXSQL已应用于腾讯云数据库MySQL、分布式数据库TDSQL、云原生数据库TDSQL-C等多款主流云数据库产品中…

系统性能分析从入门到进阶

简介&#xff1a;本文以系统为中心, 结合日常工作和用例, 由浅入深地介绍了性能分析的一些方法和体会, 希望对想了解系统性能分析的同学有所帮助。 作者 | 勿非 本文以系统为中心, 结合日常工作和用例, 由浅入深地介绍了性能分析的一些方法和体会, 希望对想了解系统性能分析的…

百度地图实用案例

1、创建一个js文件 export function BMPGL(ak) {return new Promise(function (resolve, reject) {window.init function () {// eslint-disable-next-lineresolve(BMapGL)}const script document.createElement(script)script.type text/javascriptscript.src http://api…

宜搭小技巧|第一时间看到审批进度?消息通知来帮你

简介&#xff1a;「消息通知」自动发送&#xff0c;再也不用担心错过流程审批进度&#xff01; 今天&#xff0c;宜小搭要申请出差&#xff0c;为了第一时间获取审批进度&#xff0c;他频繁刷新审批页面&#xff0c;这样既麻烦同时也浪费了大量时间&#xff0c;影响其他工作。…

一看即会:Serverless 应用开发的 7 个实战小技巧

简介&#xff1a;干货满满&#xff0c;马住收藏&#xff01; Serverless 应用开发的 7 个经验心得 作者说&#xff1a;Serverless 架构下的应用开发&#xff0c;与传统架构的应用开发还是有比较大的区别点的&#xff0c;例如天然分布式架构会让很多框架丧失一定的"便利性…

vue路由权限

1&#xff0c;配置每个页面的meta信息 meta:{grade:[1,2,3], //权限等级title:页面标题,icon:图标,show:是否展示导航 } 2&#xff0c;将无权限的页面路由直接配置到routes let routes [{path: /login,name: login,component: () > import(../components/login/login.vu…

如何使用 Serverless Devs 部署静态网站到函数计算

简介&#xff1a;手把手教你&#xff1a;如何使用 Serverless Devs 部署静态网站到函数计算。 前言 公司经常有一些网站需要发布上线&#xff0c;对比了几款不同的产品后&#xff0c;决定使用阿里云的函数计算&#xff08;FC)来托管构建出来的静态网站。 FC 弹性实例自带的50…