React + MobX - 完全上手指南

2023-11-09

前言

之前在學習 react 的狀態管理時當然第一個學到的就是 redux,關於 redux 如果有興趣或是還不清楚,可以先去看看 淺析 React Redux 的概念以及使用。而本篇的主角是 MobX,這篇會介紹關於 MobX 的一些概念以及基本用法,當然也會講到跟 redux 的區別,包括優勢選型等比較。

正文

MobX 其實跟 redux 一樣也是一個用於做全局狀態管理的一個工具,不過經過下面的介紹你就會發現 MobX 比 redux 方便簡單很多,所以其實 MobX 也蠻流行的。我會在介紹完 MobX 後再統一說說跟 redux 的對比。下面一樣以 todo 應用作為場景說說 MobX 的實現,廢話不多說進入 MobX 吧~

MobX 準備工作

首先,要在 react 應用中使用 MobX 我們當然要先裝 MobX 的包:

// npm
npm install mobx mobx-react

// yarn
yarn add mobx mobx-react

MobX 基本使用

其實 MobX 的概念很簡單,首先當然還是先要設計我們 todo 的 store。我們當然也是先建一個 store 文件夾存放狀態管理相關的所有代碼。

Store + Action

如果對 redux 有了解的人會知道,在 redux 中,redux 只有一個統一的大的 store,而具體怎麼處理,是根據你分發的 action 中的 type 進行不同的 reducer 處理,然後返回新的 state。

不過在 MobX 不是這樣的。MobX 不是單一數據源,在 MobX 可以有多個 store,我們可以根據不同的業務將狀態分成各自的 store,其實在某種意義上更直觀一點。在 MobX 中,我們借住 ES6 的 class 實現 store,來看看代碼:

// /store/todoStore.ts
import { makeAutoObservable } from "mobx";

export interface Todo {
  id: number;
  text: string;
  done: boolean;
}

const removeTodo = (todos: Todo[], id: number): Todo[] =>
  todos.filter((todo) => todo.id !== id);

const addTodo = (todos: Todo[], text: string): Todo[] => [
  ...todos,
  {
    id: Math.max(0, Math.max(...todos.map(({ id }) => id))) + 1,
    text,
    done: false,
  },
];

// Todo 總數據源
class TodoStore {
  todos: Todo[] = [];
  newTodo: string = "";

  constructor() {
    makeAutoObservable(this);
  }

  addTodo() {
    this.todos = addTodo(this.todos, this.newTodo);
    this.newTodo = "";
  }

  removeTodo(id: number) {
    this.todos = removeTodo(this.todos, id);
  }

  loadTodo(url: string) {
    fetch(url)
      .then((res) => res.json())
      .then((data) => (this.todos = data));
  }
}

const todoStore = new TodoStore();
export default todoStore;

上面代碼就是 MobX 中的 store 的寫法。通過 class 定義我們的 todo 應用狀態,其中我們可以直接在 class 中直接定義狀態以及更新狀態的函數。最後我們 new 出一個 todoStore 實例並 export 出去,這樣保證我們的 react 應用中只會有一個 todo 全局狀態。

可以看到比起 redux 要寫一堆 actions, reducers 等等,顯然 MobX 相對非常的方便,也好理解,而且還可以分很多個 store。

唯一不一樣的地方就是 todoStore 這個 class 中的 constructor。這邊我們引入 mobx 提供的 makeAutoObservable 函數,makeAutoObservable(this) 的用意就是說當我們的應用啟動,new 出 todoStore 的唯一實例的同時,讓 todoStore 變得可被觀察,也就是說可以追蹤 todoStore 所有 state 的變化,並通知整個應用中所有引用了 todoStore 的組件。

組件中 MobX 生效

MobX 中上面就定義好了整個 store 以及相應的 actions 了,因為可以直接對 state 做更改,所以也沒有了 reducer 的概念。接下來就是要在具體的組件中獲取 store。

這邊直接以添加 todo 的例子來看看怎麼使用:

// /components/TodoAdd.tsx
 
import * as React from "react";
import { Button, Input, Grid } from "@chakra-ui/react";

import todoStore from "../store/todoStore";
import { observer } from "mobx-react";

function TodoAdd() {
  return (
    <Grid pt={2} templateColumns="5fr 1fr" columnGap="3">
      <Input
        placeholder="New todo"
        value={todoStore.newTodo}
        onChange={(e) => (todoStore.newTodo = e.target.value)}
      />
      <Button onClick={() => todoStore.addTodo()}>Add Todo</Button>
    </Grid>
  );
}

export default observer(TodoAdd);

我們直接將 export 的 todoStore 引入,這樣就可以直接使用 todoStore 中的 state 跟 action。

不一樣的地方在我們引入了 mobx-react 提供的 observer 函數。這個 observer 函數的目的就是讓該組件和所有經過 makeAutoObservable 的 store(可能不只一個)配合起來,該組件中只要依賴了被 observe 的 state 發生了變化就會同步更新視圖。

observer 函數會返回一個新的組件簽名,默認就是原組件名,我們也可以改變名字。總之就是將原組件做了一層包裝,使其和 makeAutoObservable 的 store 綁定起來。

// /components/TodoList.tsx

import * as React from "react";
import { Button, Input, Flex, Checkbox, Heading } from "@chakra-ui/react";

import todoStore, { Todo } from "../store/todoStore";
import { observer } from "mobx-react";

function TodoListItems() {
  return (
    <>
      {todoStore.todos.map((todo: Todo) => (
        <Flex pt={2} key={todo.id}>
          <Checkbox onClick={() => (todo.done = !todo.done)} />
          <Input
            mx={2}
            value={todo.text}
            onChange={(e) => (todo.text = e.target.value)}
          />
          <Button onClick={() => todoStore.removeTodo(todo.id)}>Delete</Button>
        </Flex>
      ))}
    </>
  );
}

const TodoListItemsObserver = observer(TodoListItems);

function TodoList() {
  return (
    <>
      <Heading>Todo List</Heading>
      <TodoListItemsObserver />
    </>
  );
}

export default TodoList;
// /components/TopBar.tsx

import * as React from "react";
import { Button, Grid } from "@chakra-ui/react";
import { ColorModeSwitcher } from "./ColorModeSwitcher";
import todoStore from '../store/todoStore';

function TopBar() {
  const load = () => {
    todoStore.loadTodo("https://raw.githubusercontent.com/jherr/todos-four-ways/master/data/todos.json")
  }

  return (
    <Grid pt={2} templateColumns="1fr 1fr" columnGap="3">
      <ColorModeSwitcher />
      <Button onClick={load}>Load</Button>
    </Grid>
  );
}

export default TopBar;

MobX Decorators

上面其實就是 MobX 大概的用法,不過我個人覺得要把組件外面還要包一層 observer 有點醜,而且這麼做把代碼跟狀態又有點硬編碼在一起。

這邊介紹另一種使用 MobX 的方式,decorators。Decorator 的中文是裝飾器,如果有用過 springboot 的可能就知道,其實跟 spring 中的註釋(annotation)很像。在具體使用 MobX decorators 之前有一些工作要準備。

MobX Decorators 準備工作

在 react 中使用 MobX 如果想配合著 decorators 使用有一些配置工作,個人感覺過程有不少坑,在此紀錄一下。

首先我們要安裝兩個額外的包:

  • react-app-rewired
  • react-app-rewire-mobx
// npm 
npm install react-app-rewired react-app-rewire-mobx

// yarn 
yarn add react-app-rewired react-app-rewire-mobx

其實我們的目的就是要重寫 cra 的配置,讓 cra 可以認識 decorators,所以其實有另一個方法是 npm eject 彈出配置,不過因為這個過程是不可逆的,所以通常比較不推薦。

react-app-rewired 的功能就是協助我們重寫 cra 這個 react 腳手架的配置。react-app-rewired 提供了一個 injectBabelPlugin,通過這個函數我們可以改變配置加入一些 babel plugin。

根據官方文檔,我們需要再 /src 下面新建一個名為 config-overrides.js 的文件,並在該文件中我們就可以開始添加新的 babel 插件更改配置等等,這邊我們加上一個 babel-plugin-styled-components 作為示範(當然也要先裝,npm/yarn),因為在代碼中嘗試使用了一點點 styled-components。

要注意的是,在 config-overrides.js 中只能使用 CommonJS 的語法,不支持 ES6 import/export 的語法。

// config-overrides.js

const { injectBabelPlugin } = require("react-app-rewired");
const rewireMobX = require("react-app-rewire-mobx");

module.exports = function override(config, env) {
  config = injectBabelPlugin("babel-plugin-styled-components", config);
  config = rewireMobX(config, env);

  return config;
};

具體代碼如上,最後還有一個要注意的點。我們還要到 package.json 中修改一下 scripts 的配置,因為我們通過 react-app-rewired 重寫了一些配置,為了讓我們的配置在啟動時被啟用,我們就不能再使用 default cra 為我們提供了 react 腳本,而要使用 react-app-rewired 提供了,更改如下:

  "scripts": {
-   "start": "react-scripts start",
+   "start": "react-app-rewired start",
-   "build": "react-scripts build",
+   "build": "react-app-rewired build",
-   "test": "react-scripts test",
+   "test": "react-app-rewired test",
    "eject": "react-scripts eject"
}

github 上源項目中特別提醒不要更改 eject 的腳本,原因就是因為當我們不再需要 react-app-rewired 後我們仍然可以通過執行 default 的 eject 來重置配置,且 react-app-rewired 也沒有提供對 eject 的腳本,所以不要亂來hhh。

使用 MobX Decorators

經過上面的配置我們就可以在 react 中使用 mobx 裝飾器了,接下來就介紹怎麼使用以及一些特別有用的裝飾器。

下面會實現一個簡易更改主題的效果,配合 mobx 裝飾器以及 styled-components。

同樣我們通過 class 來組織我們的 store,這邊我們設計一個 theme 屬性,通過 theme 的變化要觸發相應的視圖渲染,也就是說 theme 這個 state 應該要是 observable,這邊引出第一個 decorator。

@observable

通過 @observable 就可以使我們的 state 變成可觀察的,也就是說 state 的變化會引發通知任何依賴該 state 的組件進行重新渲染。

import { observable } from 'mobx';

@observable 
theme = "day";

@action

@action 裝飾器可以允許我們對 @observable 的 state 進行更改。

@action
toggleTheme = () => {
  this.theme = this.theme === "day" ? "night" : "day";
};

@computed

@computed 可以說是計算屬性,這個裝飾器可以允許我們基於 observable 的 state 返回關於 state 的計算屬性,其實跟 vue 中的 computed 很像。

@observable
todos = [];

@action
addTodo = (todo) => {
  this.todos.push(todo);
};

@computed
get todoCount() {
  return this.todos.length;
};

Store 代碼

// /stores/UiStore.js

import { action, observable } from "mobx";

class UiStore {
  @observable
  theme = "day";

  @action
  toggleTheme = () => {
    this.theme = this.theme === "day" ? "night" : "day";
  };
}

const uiStore = new UiStore();
export default uiStore;
// /stores/TodoStore.js

import { action, observable, computed } from "mobx";

class TodoStore {
  @observable
  todos = [];

  @action
  addTodo = (todo) => {
    this.todos.push(todo);
  };

  @computed
  get todoCount() {
    return this.todos.length;
  }
}

const todoStore = new TodoStore();
export default todoStore;

Provider

在 MobX 中我們可能會有很多個 store,而我們必須要使這些 store 和應用裝配起來。這邊跟 redux 很像,通過一個全局的 Provider 標籤將所有需要裝配的 store 裝配起來:

// /stores/Store.js

import uiStore from "./UiStore";
import todoStore from "./TodoStore";

class Store {
  constructor() {
    this.uiStore = uiStore;
    this.todoStore = todoStore;
  }
}

const store = new Store();
export default store;
// index.js

import React from "react";
import ReactDOM from "react-dom";
import "./index.css";
import App from "./App";
import registerServiceWorker from "./registerServiceWorker";

import { Provider } from "mobx-react";
import store from './stores/Store';

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById("root")
);
registerServiceWorker();

我們新建一個 store 作為應用的 根 store,並且通過 Provider 與整個應用裝配在一起。

@inject

上面我們做好了 mobx 中的 store 的設計,也跟應用裝配在一起,現在就是要在組件中實際用上這些 store。

@inject 裝飾器加在類組件之上,告訴組件要注入哪些 store。

@inject('store')
class App extends Component {
  // ...
}

@observer

@observer 裝飾器其實跟上面不用裝飾器的 observer() 作用一樣,就是讓組件中只要依賴了被 observe 的 state 發生了變化就會同步更新視圖,與 @inject 的 store 有關。

@inject('store')
@observer
class App extends Component {
  render() {
    const { uiStore, todoStore } = this.props.store;


    return (
      // code
    )
  }
}

MobX 異步

上面還算詳細的介紹了 mobx 的用法以及配合 react 的方式。不過注意到,上面對 store 數據的操作都是同步的,這邊就來介紹一下在 mobx 中的異步怎麼做,其實也很簡單的。

其實異步一樣是 action,最一開始基本的 mobx 中其實有寫到一個異步,如下:

@action
loadTodo(url: string) {
  fetch(url)
    .then((res) => res.json())
    .then((data) => (this.todos = data));
}

感覺上好像沒什麼問題,但其實這是比較不好的寫法。如果我們的 react 應用啟用了 use Strict 的檢查,那就上面代碼會出現以下報錯:

Unhandled Rejection(Error): [mobx] Since strict-mode is enabled, changing observed observable values outside actions are not allowed.

原因就是因為,在 mobx 中規定 action 對 observable state 的修改必須在 action 體內,而上面代碼顯然把對 todos 的更改放在了 then 回調函數內。

當然,第一種方式就是再多寫一個 action 專門用於改變 state 的值,類似 setter 概念,不過如果有很多 state 那這種方式顯然不好。

所以我們借住 mobx 提供了一個 runInAction 函數,它接受一個函數作為參數,裡面寫我們的邏輯就好,很方便,如下:

@action
loadTodos = (url) => {
  fetch(url)
    .then((res) => res.json())
    .then((data) => {
      runInAction(() => {
        this.todos = data;
      });
    });
};

或是你喜歡用 async/await 當然也可以:

@action
loadTodos = async url => {
  const res = await fetch(url);
  const data = await res.json();
  runInAction(() => {
    this.todos = data;
  })
}

MobX vs Redux

最後,就來說說 mobx 跟 redux 到底差別在什麼地方,個人感覺在了解技術的同時也要知道到底有什麼區別。

  • Redux 原理

  • MobX 原理

總結來說,mobx 和 redux 有以下差異:

  • 函数式和面向对象
  • 单一store和多store
  • JavaScript对象和可观察对象
  • state 不可变(Immutable)和可变(Mutable)

這邊分享一篇關於 mobx 跟 redux 的比較,還算詳細,你需要Mobx还是Redux?

結語

本篇介紹了 MobX 這個 react 狀態管理工具,整體應該還算詳細,使用上感覺確實比 redux 直觀一點,不過還是要在具體項目中實際實踐才能更有感覺。希望看完這篇對不知道 mobx 的你有一些幫助,若有錯誤或不完整也歡迎請多指教!

參考

參考 鏈接
MobX - document https://doc.ebichu.cc/mobx/refguide/object.html
react-app-rewired https://github.com/timarney/react-app-rewired#how-to-rewire-your-create-react-app-project
Rewire create-react-app to use MobX https://www.npmjs.com/package/react-app-rewire-mobx/v/1.0.8
react-app-rewired使用 http://wmm66.com/index/article/detail/id/165.html
create-react-app + mobx + yarn 架子,你要的轮子 https://www.jianshu.com/p/181be41fba6b
终于讲清楚了nodejs中exports和module.exports的区别 https://blog.csdn.net/qq_31967569/article/details/82461499
你需要Mobx还是Redux? https://juejin.cn/post/6844903562095362056
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React + MobX - 完全上手指南 的相关文章

  • Ionic3开发教程 - 开发(2)

    Ionic3开发系列教程Ionic3开发教程 环境准备 1 Ionic3开发教程 开发 2 Ionic3开发教程 发布Android版本 3 Ionic3开发教程 发布IOS版本 4 Ionic3开发教程 更新 5 本文中介绍的Ionic3
  • Ant Design Pro 从零到一教程

    说在最前面的话 可是能全网唯一适合小白的antd教程 因为我找了接近一个周的教程 无论是视频 博客等等都没有比较完整的教程 所以才说这可能是唯一全网适合小白教程 文章末有相关学习链接 适用人群 喜欢看文字或者代码学习的人 学习的人掌握基本的
  • Vite搭建react+ts项目

    创建一个react项目 首先需要打开终端 进行vite的引入 yarn create vite 使用react模板创建项目 yarn create vite react test template react cd react test y
  • React路由懒加载的实现

    React lazy 通过引入lazy Suspense两个方法实现路由懒加载 首先 我们需要在组件中引入lazy Suspense这两个方法 然后我们需要通过Suspense组件 包裹着注册路由 import React Componen
  • 【react】新旧生命周期对比

    componentWillUpdate componentWillReceiveProps componentWillMount 上述这三个生命周期在V18以上的版本中 使用时要加上UNSELF name
  • react组件状态同步-状态提升

    假设定义组件TemperatureInputSon import React from react class TemperatureInputSon extends React Component constructor props su
  • react 上传文件(多选)功能入的坑

    1 这里报错是因为onChange的this指向不对 解决方法在constructor中写 this onChange this onChange bind this 或者在绑定事件的时候写 onChange this onChange b
  • React核心概念:状态提升

    上一节 表单 下一节 组合vs继承 React核心概念 状态提升 引言 添加第二个输入框 编写转换函数 状态提升 经验总结 引言 很多情况下我们使用的多个组件需要对同一个数据做出对应的反应 在这里我们推荐把这个共享的状态提升到距离这些组件最
  • 【react】回调函数形式的ref

    回调函数有3个特点 是我定义的函数 我没有调用这个函数 在我没有调用的情况下这个函数自己执行了 ref绑定一个箭头函数作为回调函数 可以输出以下这段看下 ref绑定的箭头函数是会自己执行的 class Demo extends React
  • React、Vue2.x、Vue3.0的diff算法

    前言 本文章不讲解 vDom 实现 mount 挂载 以及 render 函数 只讨论三种 diff 算法 VNode 类型不考虑 component functional component Fragment Teleport 只考虑 E
  • hooks实践总结

    何为hooks 在React中hook是指不编写 class 的情况下使用 state 以及其他的 React 特性 而Vue3也推出了具有相同功能的组合式API 如果你用过Vue3就会知道在 setup 中你应该避免使用 this 因为h
  • vue发展历史简介

    基本介绍 Vue 是一套用于构建用户界面的 渐进式框架 与其它大型框架不同的是 Vue 被设计为可以自底向上逐层应用 最初它不过是个人项目 时至今日 已成为全世界三大前端框架之一 github 上拥有 17 8万 Star 领先于 Reac
  • reactJS 干货(reactjs 史上最详细的解析干货)

    一 State和 Props state是状态机 应该包括 那些可能被组件的事件处理器改变并触发用户界面更新的数据 譬如需要对用户输入 服务器请求或者时间变化等作出响应 不应该包括 计算所得数据 React组件 在render 里使用pro
  • 为什么 MobX v6.x 在 React with Typescript 中不能按预期工作?

    我目前正在编写一个 React 应用程序 它应该能够在任何可观察到的值发生变化时重新渲染组件 问题是我无法得到email如果发生变化则重新渲染 store ts export class ExampleStore observable em
  • 在存在 getter 的情况下使用 Mobx makeObservable 让 setter 成为一个动作

    在 mobx 中 如果我想使用继承 我需要使用 makeObservable 而不是 makeAutoObservable 但是使用 makeObservable 需要我命名改变状态的操作 那么如何将 setter 声明为操作 因为它与 g
  • 如何提高React组件的渲染效率的?在React中如何避免不必要的render?

    面试官 说说你是如何提高组件的渲染效率的 在React中如何避免不必要的render 一 是什么 react 基于虚拟 DOM 和高效 Diff 算法的完美配合 实现了对 DOM 最小粒度的更新 大多数情况下 React 对 DOM 的渲染
  • 在 React 应用程序中更改商店的路线

    我有一个 React 组件 它接收用户名和密码并将其发送以进行身份 验证 如果身份验证成功 页面应移动到呈现另一个组件的不同路由 现在的问题是 我不知道如何更改从我的商店出发的路线 即不使用React Router 的组件 我知道我们可以使
  • 无法读取未定义的属性 - javascript 类

    我想尝试 mobx 进行反应状态管理 但是 我无法让它工作 我有一个简单的存储 用于存储一个称为计数器的数字 您可以增加 减少它 并增加 x 我有这个文件 store js 用于存储状态 import action makeObservab
  • React安装依赖 node_modules中有下载依赖项但package.json文件中没有依赖

    React安装依赖 node modules中有下载依赖项但package json文件中没有依赖 直接在下载依赖项后 加 S 就可以解决 随机 id 生成器 uuid nanoid npm install nanoid S S save
  • MobX - 当我可以在将数据注入 React 组件时使用“inject”时,为什么我应该使用“observer”

    MobX 文档建议我应该使用observer在我的所有组件上 然而 通过使用注入 我可以更细粒度地控制哪些数据导致组件的重新渲染 我的理解是我observer 最后一次渲染中所有访问的可观察量的更改将导致重新渲染 即使可观察量嵌套在数据存储

随机推荐

  • C#连接SQL数据库

    一 连接数据库服务器 1 连接SQL服务器 以下面为例 这里我使用的是SQL Server 身份验证 也可使用windows 身份验证 账户信息如下 登录名 sa 密码 mima 输入时自动隐藏 建立好数据库和表 服务器名 HG66 MSS
  • JavaScript应用——手把手教你做一个页面化猜数字游戏

    一听到猜数字游戏 想必大家都不太陌生吧 是的没错 很多人都用C语言或者Java写过猜数字游戏小程序 博主也不例外 之前写过C语言版本的猜数字游戏 感兴趣的同学可以看看C语言版本猜数字游戏 本篇博客主要介绍如何用JavaScript实现一个页
  • Django配置文件介绍

    本文主要讲一下django的settings文件中各个配置的代表的含义 from pathlib import Path 项目根路径 BASE DIR Path file resolve parent parent 密钥 自动生成的 很复杂
  • 源代码:STM32 SPI “DMA”操作W25QXX(16/32/64/128)系列芯片代码详解

    系列文章目录 文章目录 系列文章目录 前言 一 SPI h 二 SPI c 1 SPI配置 2 DMA配置 3 w25q64 c 4 w25q64 h 五 main c 六 串口打印代码 七 输出结果 前言 框架 自己新建库文件夹 取名li
  • 力扣第一题两数之和 PHP方法

    有事没事 什么都尝试 慢慢积累 都能走很远 很早之前就开始了解算法 然后知道算法是一种很神奇的东西 主要的那种逻辑明白之后你会觉得很秀啊 而各种联系在一起解决实际问题 瞬间感觉算法真的有用 所有开始看力扣中的题目并且尝试去做吧 比较笨拙等写
  • app上线发布流程_上架app的流程,需要提供什么资料,找人代上架靠谱?

    本文转载自姑婆那些事儿APP 注册应用商店账号 申请应用商店上架是APP推广的第一步 这一步没做好 会延迟甚至耽误后续的工作 因此 做好上架工作尤为重要 今天姑婆根据我们自己APP上架的经验进行了整理 分享给大家 希望对大家有所帮助 一 安
  • mongodb显示:‘mongo‘不是内部或外部命令,也不是可运行的程序或批处理文件

    我们在安装完mongodb之后都需要去校验一下是否安装成功 一般都用 mongo 去查看我们的mongodb安装是否成功 正常情况是这样的 但是如果是出现 mongo 不是内部或外部命令 也不是可运行的程序或批处理文件 我们有两个方法去排查
  • 2023前端面试题及答案整理(Vue)

    watch 和 computed 区别 watch 是监听动作 computed 是计算属性 watch 没缓存 只要数据变化就执行 computed 有缓存 只在属性变化的时候才去计算 watch 可以执行异步操作 而 computed
  • 枚举子集复杂度 O(n^3) 证明

    困扰多年的问题 居然在学习离散数学后的一分钟内得到解决 形式化问题为 求满足 A B S A sube B sube S A B S 的有序对
  • 解读三大财务报表

    三张报表是一体化的报表 但在不同的报表里 概念之间有些差异 大家应该适应此情况 这是全球性的问题 三张报表实际上是站在两个不同的角度 实际上 两个体系 维度 描述了同样的经济活动 但它们各自描述经济活动的方式是不一样的
  • java 枚举数据字典_枚举值当数据字典使用

    public interface EnumType enum E TRANCALL AFTER SUBTRAN PROCESS AFTER SUBTRAN PROCESS afterSubtranProcess 子交易处理模板后 Commo
  • 磁盘使用率大于90% 磁盘inode使用率大于90%

    线上机器一直再报 磁盘使用率大于90 发现 var log 下边有个mail文件 很大就直接清理掉 gt mail 但是这个问题反复出现 感觉一个没有什么业务的机器怎么磁盘使用率那么大 就查了下mail日志文件的形成 ps 发现有好多sen
  • Tigase开发笔记6:packet流转机制 -> 一条消息(packet)的请求和响应过程解析

    初看Tigase的packet内部流转机制一开始不是太明白 里面用到了较多的线程 代码不太看得懂 慢慢的通过一条消息的请求和响应的代码跟踪分析 搞清楚了消息流转的过程 前言 本文使用Tigase Server version 7 0 2 进
  • [考研数学]概率论难点总结:样本标准差,样本均值,均值的期望和方差,与t分布、卡方分布和F分布的关系及推导

    首先需要清楚一件事情 样本均值为X拔 上面有个棍 样本的均值是讲从总体中抽样 这些样本的均值 而均值是指所有样本的真实均值 后面部分很好推导 将括号展开后 由三部分组成 中间的部分为2倍的样本和样本均值的乘积 将样本的和变成n倍的样本均值即
  • MVC ——RouteTable.Routes的使用

    public class RouteTable Fields private static RouteCollection instance new RouteCollection Properties public static Rout
  • ubuntu64位安装交叉编译器出现一些问题

    安装交叉编译工具时 因为交叉编译工具为32位的 而我的ubuntu51 10是64位的 使用交叉编译工具时会出错 一般是安装 apt get install lib32ncurses5 再有出错就去安装对应的库吧 如libstdc so 6
  • 50行代码,实现AI文章生成器,牛逼!

    本文共1502字 预计阅读时间 3分钟 据说 AI 已经可以自动写文章 类似的报道屡见不鲜 但是 AI 写出来的文章到底是什么样的 我想没几个人见识过 无意中看到了 Gayhub 上的这个项目 全称就是 狗屁不通文章生成器 英文名字是 Bu
  • mongovue 导入mysql_【mongo】用户添加、导入数据库、连接VUE

    添加用户 1 安装mongo时最好用apt get install 因为这样可以省去很多麻烦 比如一些环境变量 还有一些文档路径等等的问题 2 确认一下自己的mongodb和mongodb clients的版本 要版本一致才可以 查看mon
  • Linux 中power supply软件架构和相关API

    一 概述 电源管理整体上可以分为两个部分 一个是电池监控 fuel gauge 另外一个是充放电管理 这两部分在内核中也是分为两个驱动来管理 fuelgauge驱动的功能主要是负责向上层Android系统提供当前电池的电量和健康信息等等 同
  • React + MobX - 完全上手指南

    React MobX 完全上手指南 前言 正文 MobX 準備工作 MobX 基本使用 Store Action 組件中 MobX 生效 MobX Decorators MobX Decorators 準備工作 使用 MobX Decora