mobx和vuex的简单对比及快速使用

1 篇文章 0 订阅

最近在将公司react项目迁移到vue上,react中使用的状态管理机制是mobx,而vue中使用的是vuex; 为了更快速的迁移代码,所以简单对比回忆了一下vuex和mobx之间的区别,以下是mobx和vuex的官网手册目录对比:

 
1,mobx的使用方式,可能若干组件使用一个store.js:
@observable:   以此为前缀的普通变量,将是全局变量;若该变量的类型是对象或者数组,需要使用observale(对象/数组) ,的方式定义全局变量;用于定义的类
@action:  以此为前缀的函数,是唯一可以修改 @observable定义的全局变量的函数;用于定义的类
@computed:  以此为前缀的函数,可以获取全局变量并计算值;用于定义的类
@observer: 以此为前缀的类,可以访问以@observable为前缀定义的全局变量;用于调用@observable的类

在store.js文件中定义全局变量@observable, @action,@computed

store.js文件

import { observable, action } from "../node_modules/mobx";   //react里面用到啥就需要引入啥
class WaterTool {
  @observable maxDepth = 100;  //这个maxDepth 是全局观测变量
  constructor() {}
  @action
  setMaxDepth(val) {
    this.maxDepth = val;   //这个setMaxDepth是可以修改maxDepth 的函数
  }
  @computed get total() {
        return this.maxDepth*10;
    }                         //这个total可以获取全局变量并计算
}
export  const  warterTool = new WaterTool();  
///在其他的react.js文件中使用@observer

suiban.js文件

import { waterTool } from "./store";     
@observer
class  suibian extends React.Component{
  constructor(props) {
    super(props);
  }
 function hi(){
   waterTool.setMaxDepth(100);   //直接以属性方式调用
    console.log(waterTool.total);  //直接以属性方式调用
}
 return(
    <div> waterTool.maxDepth </div>   //直接以属性方式调用
)

}

2,vuex的使用方式,  所有组件可能只有一个store.js文件
首先在main.js引入:

import Vuex from  "vuex";
Vue.use(Vuex);

 比较重要的几个前缀:
state:  存储全局变量(相当于mobx的@observable);用于定义的类
getters:  获取全局变量并计算(相当于mobx的@computed) ;  用于定义的类
mutations:  唯一可以修改全局变量的函数集(相当于mobx的@action);用于定义的类
actions:  据说,mutations只能处理同步的代码,所以官方补充一个actions用于处理异步的代码;用于定义的类

this.$store.state: 获取全局变量 ; 用于调用的类
this.$store.commit: 调用mutations中的函数;用于调用的类
this.$store.dispatch: 调用actions中的函数;用于调用的类

//store.js文件
import Vue from "vue";
import Vuex from "vuex";

Vue.use(Vuex);

export default new Vuex.Store({
  state: {   count:10  },
  getters: {   getCount(state){return state.count}    },
  mutations: {  setCount(state,num){ state.count = num  },
  actions: {},
  modules: {}
});
在main.js中挂载store.js文件,这样所有的组件都可以用了
import Vue from "vue";
import App from "./App.vue";

import store from "./store";
new Vue({
  store,
  render: h => h(App)
}).$mount("#app");
//在qita.vue文件中

<template>
</template>

<script>
export default{
    name:'qita',
    methods:{
        add(){
            console.log(this.$state.count);  //不需要import,直接调用store.js内容
            }
        }
    }

</script>

<style>
</style>

2.1,刚才提到,vue使用vuex一般所有组件使用同一个store.js文件,这样的话可能这个store会变的很混乱拥挤,为了快速找到某个组件需要的全局变量,modules属性出现,将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter,相当于是归类了:

const moduleA = {
  state: () => ({ ... }),
  mutations: { ... },
  actions: { ... },
  getters: { ... }
}

const moduleB = {
  state: () => ({ ... }),
  mutations: { ... },
  actions: { ... }
}

const store = new Vuex.Store({
  modules: {
    a: moduleA,
    b: moduleB
  }
})

store.state.a // -> moduleA 的状态
store.state.b // -> moduleB 的状态

3, 有些时候组件之间都是独立的,仅仅几个组件之间有关系,而大多数组件之间是没有数据传递的,这个时候使用vuex就很没有意义,因为你把小部分组件需要访问的少部分变量,放到全局可以访问的地方,其他组件根本不需要访问。这个时候就直接把公共变量放到一个独立 的js文件里,然后把公共全局变量放到类中最后export一下就可以了。
 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 微信小程序中的Mobx是一个类似于vuex的状态管理工具,可以实现全局数据共享和组件之间的通信。通过使用mobx-miniprogram和mobx-miniprogram-bindings这两个库,我们可以在小程序中创建Store实例对象,并将共享数据或方法绑定到组件或页面中使用。 这样就可以在小程序开发中更方便地管理和共享数据了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [微信小程序中的vuexMobX)](https://blog.csdn.net/ct5211314/article/details/120322080)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【微信小程序】-- 全局数据共享 - MobX(四十三)](https://blog.csdn.net/csh1807266489/article/details/129512310)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [微信小程序中的VUEX](https://blog.csdn.net/m0_55035610/article/details/122164765)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值