当前位置:网站首页>mobx 知识点集合案例(快速入门)
mobx 知识点集合案例(快速入门)
2022-07-07 02:06:00 【胖鹅68】
一、文章参考
二、知识点串联
2.1 使用注解方式串联
import React, {
Component } from 'react';
import ReactDOM from 'react-dom';
import './index.css';
// import App from './App';
import * as serviceWorker from './serviceWorker';
import {
BrowserRouter } from 'react-router-dom';
import {
observable, action, autorun, computed, configure, runInAction, when, reaction } from 'mobx';
import {
observer } from 'mobx-react';
import store from './mobx/AppStore';
configure({
// 强制要求 修改 observable 的数据,一定要放到 action 中
enforceActions: 'observed',
});
// 1. 初始化 mobx 容器仓库
class MyStore {
@observable count = 0;
name = 'huangbiao';
@observable foo = 'bar';
@observable price = 10;
@action.bound increment() {
this.count++;
}
@computed get totalPrice() {
console.log('totalPrice 这里使用了缓存,不是展示多少次,就调用多少次');
return this.count * this.price;
}
// bound 表示上下文 this 为 实例对象,不能使用箭头函数
@action.bound change() {
console.log(this);
this.foo = 'hello';
this.foo = 'world';
this.count = 10;
}
@action.bound asyncChange () {
setTimeout(() => {
// this.count = 100
// 1. 定义 action 函数
// this.changeCount()
// 2. 直接调用action
// action('changeFoo', () => {
// this.count = 30
// })()
// 3. runInAction
runInAction(() => {
this.count = 40
})
}, 200)
}
@action.bound changeCount(value = 20) {
this.count = value
}
}
const mystore = new MyStore();
/** * auto 默认会执行一次 * 然后,当内部所依赖的 observable 数据发生改变的时候重新触发执行 */
autorun(() => {
console.log('autorun: ', mystore.name, mystore.count, mystore.foo);
});
/****************** 修改多次observable会引发多次执行 autorun 函数 ******************** // 如果连续调用两次 observable 的数据,则 autorun 也会调用两次,效率比较低 // mystore.foo = 'hello' // mystore.foo = 'world' // mystore.count = 10 // 1. 将多次修改的操作 放到一个 action 中 // mystore.change() // 2. runInAction 创建一个被立即调用的一次性 action。 // runInAction(() => { // mystore.foo = 'hello'; // mystore.foo = 'world'; // mystore.count = 10; // }) */
// const tempChnage = mystore.change
// 上下文已经不是 store对象了,因此需要使用 @action.bound 保证上下文
// tempChnage()
/****************** 异步触发会引发的问题 ******************** */
// mystore.asyncChange()
/****************** when ******************** // 当 count > 100 的时候,只执行一次自定义逻辑 when( () => { return mystore.count > 100 }, () => { console.log('when -> ', mystore.count) } ) mystore.changeCount(200) // when 满足条件只触发了一次 mystore.changeCount(300) */
/****************** 异步触发会引发的问题 ******************** */
reaction(
() => {
return mystore.count
},
(data, reaction) => {
console.log('reaction -> ', data)
// 手动停止当前 reaction 的监听
if (data > 3) {
reaction.dispose()
}
}
)
// 2. 在组件中使用 mobx 容器的状态
@observer
class App extends Component {
render() {
const {
store } = this.props;
return (
<>
<div>AppMobx</div>
<div>{
store.count}</div>
<div>
<button onClick={
store.increment}>increment</button>
</div>
<div>总价:{
store.totalPrice}</div>
<div>总价:{
store.totalPrice}</div>
<div>总价:{
store.totalPrice}</div>
<div>总价:{
store.totalPrice}</div>
<div>总价:{
store.totalPrice}</div>
<div>总价:{
store.totalPrice}</div>
<div>总价:{
store.totalPrice}</div>
</>
);
}
}
// 3. 在组件中发起 action 修改容器的状态
ReactDOM.render(
<React.StrictMode>
<BrowserRouter>
{
/* <App/> */}
<App store={
mystore} />
</BrowserRouter>
</React.StrictMode>,
document.getElementById('root')
);
// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: https://bit.ly/CRA-PWA
serviceWorker.unregister();
2.2 使用函数
import {
observable, autorun, action} from "mobx";
var person = observable({
// observable 属性:
name: "John",
age: 42,
showAge: false,
// 计算属性:
get labelText() {
return this.showAge ? `${
this.name} (age: ${
this.age})` : this.name;
},
// 动作:
setAge(age) {
console.log('setAge')
this.age = age;
}
}, {
setAge: action
});
// person 实际上是一个 proxy 对象
console.log('person', person)
// 对象属性没有暴露 'observe' 方法,
// 但不用担心, 'mobx.autorun' 功能更加强大
autorun(() => {
console.log(person.labelText)
});
person.name = "Dave";
// 输出: 'Dave'
person.showAge = true
person.setAge(21);
// 等等
边栏推荐
- Redisl garbled code and expiration time configuration
- Force deduction 62 different paths (the number of all paths from the upper left to the lower right of the matrix) (dynamic planning)
- JVM in-depth
- laravel 使用腾讯云 COS5全教程
- Rk3399 platform development series explanation (interruption) 13.10, workqueue work queue
- 【解决】Final app status- UNDEFINED, exitCode- 16
- 安装VMmare时候提示hyper-v / device defender 侧通道安全性
- How to use wechat cloud hosting or cloud functions for cloud development of unapp development applet
- 360 Zhiyu released 7.0 new products to create an exclusive "unified digital workspace" for the party, government and army, and central and state-owned enterprises
- LM小型可编程控制器软件(基于CoDeSys)笔记二十三:伺服电机运行(步进电机)相对坐标转换为绝对坐标
猜你喜欢

matlab / ENVI 主成分分析实现及结果分析

How can I check the DOI number of a foreign document?

可极大提升编程思想与能力的书有哪些?

CloudCompare-点对选取

Markdown displays pictures side by side

线性代数(一)

JWT 认证

string(讲解)

LM small programmable controller software (based on CoDeSys) Note 23: conversion of relative coordinates of servo motor operation (stepping motor) to absolute coordinates

Jcmd of JVM command: multifunctional command line
随机推荐
请问如何查一篇外文文献的DOI号?
Change the original style of UI components
【OpenCV】形态学滤波(2):开运算、形态学梯度、顶帽、黑帽
JVM monitoring and diagnostic tools - command line
Handling hardfault in RT thread
JVM command - jmap: export memory image file & memory usage
Rk3399 platform development series explanation (WiFi) 5.53, hostapd (WiFi AP mode) configuration file description
Find duplicate email addresses
ceres-solver和g2o性能比较
Array proof during st table preprocessing
3428. Put apples
地质学类比较有名的外文期刊有哪些?
博士申请 | 上海交通大学自然科学研究院洪亮教授招收深度学习方向博士生
UIC(组态UI工程)公版文件库新增7款行业素材
谷歌 Chrome 浏览器发布 103.0.5060.114 补丁修复 0-day 漏洞
jmeter 函数助手 — — 随机值、随机字符串、 固定值随机提取
Symmetric binary tree [tree traversal]
【GNN】图解GNN: A gentle introduction(含视频)
VMware安装后打开就蓝屏
计算模型 FPS