当前位置:网站首页>Mobx knowledge point collection case (quick start)
Mobx knowledge point collection case (quick start)
2022-07-07 07:11:00 【Fat goose 68】
List of articles
One 、 Article reference
Two 、 Knowledge points in series
2.1 Concatenate using annotation
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({
// Mandatory requirements modify observable The data of , Make sure to put action in
enforceActions: 'observed',
});
// 1. initialization mobx Container warehouse
class MyStore {
@observable count = 0;
name = 'huangbiao';
@observable foo = 'bar';
@observable price = 10;
@action.bound increment() {
this.count++;
}
@computed get totalPrice() {
console.log('totalPrice This uses caching , Not how many times , Just how many times ');
return this.count * this.price;
}
// bound Express context this by Instance object , You cannot use arrow functions
@action.bound change() {
console.log(this);
this.foo = 'hello';
this.foo = 'world';
this.count = 10;
}
@action.bound asyncChange () {
setTimeout(() => {
// this.count = 100
// 1. Definition action function
// this.changeCount()
// 2. Call directly 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 By default, it will execute once * then , When the interior depends on observable The execution is triggered again when the data changes */
autorun(() => {
console.log('autorun: ', mystore.name, mystore.count, mystore.foo);
});
/****************** Modify multiple times observable Will cause multiple executions autorun function ******************** // If called twice in a row observable The data of , be autorun It will also be called twice , Low efficiency // mystore.foo = 'hello' // mystore.foo = 'world' // mystore.count = 10 // 1. The operation that will be modified many times In a action in // mystore.change() // 2. runInAction Create a one-time action. // runInAction(() => { // mystore.foo = 'hello'; // mystore.foo = 'world'; // mystore.count = 10; // }) */
// const tempChnage = mystore.change
// The context is no longer store Object , So you need to use @action.bound Guarantee context
// tempChnage()
/****************** Problems caused by asynchronous triggering ******************** */
// mystore.asyncChange()
/****************** when ******************** // When count > 100 When , Execute custom logic only once when( () => { return mystore.count > 100 }, () => { console.log('when -> ', mystore.count) } ) mystore.changeCount(200) // when Meeting the condition only triggers once mystore.changeCount(300) */
/****************** Problems caused by asynchronous triggering ******************** */
reaction(
() => {
return mystore.count
},
(data, reaction) => {
console.log('reaction -> ', data)
// Manually stop the current reaction Listening in
if (data > 3) {
reaction.dispose()
}
}
)
// 2. Use in components mobx Container state
@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> The total price :{
store.totalPrice}</div>
<div> The total price :{
store.totalPrice}</div>
<div> The total price :{
store.totalPrice}</div>
<div> The total price :{
store.totalPrice}</div>
<div> The total price :{
store.totalPrice}</div>
<div> The total price :{
store.totalPrice}</div>
<div> The total price :{
store.totalPrice}</div>
</>
);
}
}
// 3. Initiate... In the component action Modify the state of the container
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 Using functions
import {
observable, autorun, action} from "mobx";
var person = observable({
// observable attribute :
name: "John",
age: 42,
showAge: false,
// Compute properties :
get labelText() {
return this.showAge ? `${
this.name} (age: ${
this.age})` : this.name;
},
// action :
setAge(age) {
console.log('setAge')
this.age = age;
}
}, {
setAge: action
});
// person It's actually a proxy object
console.log('person', person)
// Object properties are not exposed 'observe' Method ,
// But don't worry , 'mobx.autorun' More powerful
autorun(() => {
console.log(person.labelText)
});
person.name = "Dave";
// Output : 'Dave'
person.showAge = true
person.setAge(21);
// wait
边栏推荐
- .net core 访问不常见的静态文件类型(MIME 类型)
- How Oracle backs up indexes
- 请教一下,监听pgsql ,怎样可以监听多个schema和table
- 组件的通信
- Select the product attribute pop-up box to pop up the animation effect from the bottom
- 詳解機器翻譯任務中的BLEU
- Complete process of MySQL SQL
- 什么情况下考虑分库分表
- 请教一个问题,flink oracle cdc,读取一个没有更新操作的表,隔十几秒就重复读取全量数据
- Pass child component to parent component
猜你喜欢
随机推荐
Explain Bleu in machine translation task in detail
请教一下,监听pgsql ,怎样可以监听多个schema和table
IP address
虚拟机的作用
Academic report series (VI) - autonomous driving on the journey to full autonomy
jdbc数据库连接池使用问题
父组件传递给子组件:Props
Communication between non parent and child components
LC 面试题 02.07. 链表相交 & LC142. 环形链表II
Matlab tips (29) polynomial fitting plotfit
. Net core accesses uncommon static file types (MIME types)
from . onnxruntime_ pybind11_ State Import * noqa ddddocr operation error
Stack Title: nesting depth of valid parentheses
什么情况下考虑分库分表
Torefs API and toref API
. Net 5 fluentftp connection FTP failure problem: this operation is only allowed using a successfully authenticated context
组件的通信
云备份项目
Freeswitch dials extension number source code tracking
Comment les entreprises gèrent - elles les données? Partager les leçons tirées des quatre aspects de la gouvernance des données









