React使用Mobx6.x共享状态问题

 更新时间:2023年10月13日 09:11:50   作者:明知山_  
这篇文章主要介绍了React使用Mobx6.x共享状态问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

React使用Mobx6.x共享状态

文档地址

安装mobxmobx-react-lite
 

mobx-react-litemobx-react的轻量级版本

yarn add mobx mobx-react-lite

src目录下新建store文件夹,新增count.js文件

  • count为共享的数据
  • addCount为共享的方法
import { makeAutoObservable } from "mobx"
export default makeAutoObservable({
    count: 0,
    addCount() {
        this.count++
    }
})

jsx文件引入

observer 包裹的组件可以监听store的值并改变

import { useEffect } from 'react'
import countStore from '@/store/count'
import { observer } from "mobx-react-lite"
export default observer(() => {
    //监听mobx触发事件
    useEffect(() => {
        console.log(countStore.count)
    }, [countStore.count])
    return (
        <div>
            <div>count为:{countStore.count}</div>
            <button onClick={() => countStore.addCount()}>+1</button>
        </div>
    )
})

react-Mobx基本使用

十分钟交互式的 MobX + React 教程

mobx 的核心理念是 简单、可扩展的状态管理库。比redux和react-redux方便许多

先create-react-app 构建一个项目

1.装包

1.1安装mobx mobx-react

npm install  mobx mobx-react -S

1.2安装装饰器装包搭配依赖去解析(可选),装饰器作用>代码更简洁

  npm i --save-dev babel-plugin-transform-decorators-legacy

1.3装完依赖,然后json 文件中配置启用,现在采用的是babel7所以要这样配置,也可以单独在.babelrc文件中配置。

2者不能冲突,选其一

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

2.项目应用

2.1一般先在src创建个store文件夹(定义状态和创建实例)

2.2定义状态并使其可观察(状态可以自定义创建)

import { observable, computed, action } from "mobx";
class OrderLine {
	// 被观察者属性
    @observable price = 0;
    @observable amount = 1;
    // 计算属性  
    @computed
    get total() {
        return this.price * this.amount;
    }
    @observable length = 2;
    @computed
    get squared() {
        return this.length * this.length;
    }
    set squared(value) {
        // 这是一个自己的动作,不需要注解
        this.length = Math.pow(2, value);
    }
    //触发的动作
    @action.bound
    resize() {
        this.price++;
    }
}
export default OrderLine;

2.3 在store目录创建index.js (创建仓库实例)

import OrderLine from "./OrderLine";
class Stores {
    constructor() {
        this.orderLine = new OrderLine();  //每次创建的状态在这里注入
    }
}
export default new Stores();

2.4 类似react-redux一样,MOBX也有mobx-react实现mobx与react的链接,所以在根组件中使用注入这个仓库。

import React, { Component } from "react";
import MobxTest from "./Components/Mobox/MobxTset01";
import stores from "./Components/Mobox/store";
import { Provider } from "mobx-react";
class App extends Component {
    render() {
        return (
            <Provider {...stores}>
                <MobxTest />
            </Provider>
        );
    }
}
export default App;

2.5 创建视图以响应状态的变化,在别的组件中使用注解的方式使用

import React, { Component } from "react";
import { observer, inject } from "mobx-react";
import { observable } from "mobx";
//@inject() 将组件链接到 stores,以props的形式传递给目标组件
@inject("orderLine")
@observer  //观察者
class MobxTest extends Component {
  constructor(props) {
    super(props);
    this.state = {};
  }
  componentWillMount() {
    console.log("componentWillMount方法");
  }
  onReset() {
    this.props.orderLine.resize(); //状态中定义的方法从而改变仓库中的值
  }
  render() {
    //通过发现仓库中定义的值,和方法都可以通过props属性拿到注入orderLine所有属性和方法
    console.log(this.props,'this.props');
    console.log(this.props.orderLine.amount);
    return (
      <div>
        <p>{this.props.orderLine.total}</p>
        {/* <p>{this.secondsPassed}</p> */}
        <p>{this.props.orderLine.total}</p>
        <button onClick={this.onReset.bind(this)}>按钮</button>
      </div>
    );
  }
}
export default MobxTest;

效果图 :

Mobx官网传送门:https://cn.mobx.js.org/

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • React Native项目中使用Lottie动画的方法

    React Native项目中使用Lottie动画的方法

    这篇文章主要介绍了React Native 实现Lottie动画的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • React路由管理之React Router总结

    React路由管理之React Router总结

    React项目通常都有很多的URL需要管理,最常使用的解决方案就是React Router了,本篇文章主要介绍了React路由管理之React Router总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • React服务端渲染原理解析与实践

    React服务端渲染原理解析与实践

    这篇文章主要介绍了React服务端渲染原理解析与实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • React-Route6实现keep-alive效果

    React-Route6实现keep-alive效果

    本文主要介绍了React-Route6实现keep-alive效果,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧<BR>
    2022-06-06
  • 使用react-beautiful-dnd实现列表间拖拽踩坑

    使用react-beautiful-dnd实现列表间拖拽踩坑

    相比于react-dnd,react-beautiful-dnd更适用于列表之间拖拽的场景,本文主要介绍了使用react-beautiful-dnd实现列表间拖拽踩坑,感兴趣的可以了解一下
    2021-05-05
  • 浅谈react+es6+webpack的基础配置

    浅谈react+es6+webpack的基础配置

    下面小编就为大家带来一篇浅谈react+es6+webpack的基础配置。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • React中实现编辑框自动获取焦点与失焦更新功能

    React中实现编辑框自动获取焦点与失焦更新功能

    在React应用中,编辑框的焦点控制和数据回填是一个常见需求,本文将介绍如何使用useRef和useEffect钩子,在组件中实现输入框自动获取焦点及失焦后更新数据的功能,文中通过代码示例给大家讲解的非常详细,需要的朋友可以参考下
    2024-01-01
  • 基于react封装一个通用可编辑组件

    基于react封装一个通用可编辑组件

    前段时间接到这样一个需求,需要封装一个组件实现可编辑,这个到底有多通用呢,就是需要在普通的文字展示包括表格,列表等等,所以本文将给大家介绍如何基于react封装一个通用可编辑组件,需要的朋友可以参考下
    2024-02-02
  • React拆分窗格组件的两种方法

    React拆分窗格组件的两种方法

    这篇文章主要介绍了React拆分窗格组件的两种方法,使用第三方库react-split-pane适用于快速实现拆分窗格功能,并且对功能和样式的要求较为简单的场景,本文结合示例代码介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • 一个基于react的图片裁剪组件示例

    一个基于react的图片裁剪组件示例

    本篇文章主要介绍了一个基于react的图片裁剪组件示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04

最新评论