日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mobx笔记

發(fā)布時間:2024/9/27 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mobx笔记 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

入門案例

1、環(huán)境搭建

創(chuàng)建項目

mkdir my-app cd my-app npm init -y

安裝依賴

cnpm i webpack webpack-cli -D cnpm i html-webpack-plugin -D cnpm i babel-loader @babel/core @babel/preset-env -D cnpm i @babel/plugin-proposal-decorators @babel/plugin-proposal-class-properties -D cnpm i @babel/plugin-transform-runtime -D cnpm i @babel/runtime -S cnpm i mobx -S

構(gòu)建項目結(jié)構(gòu)

按照以下目錄結(jié)構(gòu)創(chuàng)建文件

- my-app|-- src 源文件目錄|-- index.js 入口文件|-- public 靜態(tài)資源目錄|-- index.html|-- webpack.config.js|-- dist 打包后的靜態(tài)文件目錄

編寫 index.html 文件:

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Document</title> </head> <body></body> </html>

編寫 webpack.config.js 配置文件

const path = require('path'); const HtmlWebPackPlugin = require('html-webpack-plugin');module.exports = {mode: 'development',entry: path.resolve(__dirname, 'src/index.js'),output: {path: path.resolve(__dirname, 'dist'),filename: 'main.js'},module: {rules: [{test: /\.js$/,exclude: /node_modules/,use: {loader: 'babel-loader',options: {presets: ['@babel/preset-env'],plugins: [//支持裝飾器["@babel/plugin-proposal-decorators", { "legacy": true }],["@babel/plugin-proposal-class-properties", { "loose" : true }],['@babel/plugin-transform-runtime']]}}}]},plugins:[new HtmlWebPackPlugin({template: 'public/index.html',filename: 'index.html',inject: true})] }

在 package.json 文件中配置打包命令:

{"scripts": {"build": "webpack --mode production"} }

2、Mobx核心API

下面的代碼需要在 src/index.js 中完成。

2.1、observable可觀察的狀態(tài)

  • map
import {observable} from 'mobx' // 聲明 const map = observable.map({a: 1, b: 2}); // 設(shè)置 map.set('a', 11); // 獲取 console.log(map.get('a')); console.log(map.get('b')); // 刪除 map.delete('a'); console.log(map.get('a')); // 判斷是否存在屬性 console.log(map.has('a'));
  • object
import {observable} from 'mobx' // 聲明 const obj = observable({a: 1, b: 2}); // 修改 obj.a = 11; // 訪問 console.log(obj.a, obj.b);
  • array
import {observable} from 'mobx' const arr = observable(['a', 'b', 'c', 'd']); // 訪問 console.log(arr[0], arr[10]); // 操作 arr.pop(); arr.push('e');
  • 基礎(chǔ)類型
import {observable} from 'mobx'/ const num = observable.box(10); const str = observable.box('hello'); const bool = observable.box(true); // 獲得值 console.log(num.get(), str.get(), bool.get()); // 修改值 num.set(100); str.set('hi'); bool.set(false); console.log(num.get(), str.get(), bool.get());

2.2、 observable裝飾器

import { observable } from 'mobx'class Store{@observable arr = [];@observable obj = {a: 'htllo'};@observable map = new Map();@observable str = 'hello';@observable num = 123;@observable bool = false; }const store = new Store();console.log(store); console.log(store.obj.a); console.log(store.num);

注意:vscode編譯器中,js文件使用裝飾器會報紅。解決方式:

在根目錄編寫 jsconfig.json

{"compilerOptions": {"module": "commonjs","target": "es6","experimentalDecorators": true},"include": ["src/**/*"] }

2.3、對 observables 作出響應

computed

計算值是可以根據(jù)現(xiàn)有的狀態(tài)或其它計算值衍生出的值, 跟vue中的computed非常相似。

import { observable, computed } from 'mobx'var name = observable.box("John");var upperCaseName = computed(() =>name.get().toUpperCase() );//name的屬性值 console.log("name:",name.get()); console.log("轉(zhuǎn)換后:",upperCaseName.get());//對computed返回值做監(jiān)聽 var disposer = upperCaseName.observe_(change => {console.log("監(jiān)聽到數(shù)據(jù)變化:",change.newValue,change.oldValue) });//對observable觀察的屬性做修改 name.set("Dave"); name.set("Lily");

autorun

import { observable, computed, autorun } from 'mobx'const arry = observable([1,2,3])const result = computed(()=>{return arry.reduce((total,item)=>{return total + item}) }) //得到計算后的結(jié)果 console.log(result.get());//會先觸發(fā)一次監(jiān)聽,然后每次修改 arry 都會觸發(fā) autorun(()=>{console.log('監(jiān)聽到修改的結(jié)果:', result.get()); })//修改 observable 被觀察對象的值 arry.push(4) arry.push(5)

2.4、改變 observables狀態(tài)

import { observable, action } from 'mobx'class Store {@observable num = 10@action add(){return this.num += 1} }const store = new Store()console.log(store.add());

3、案例應用

在react中使用mobx,需要借助mobx-react。

它的功能相當于在react中使用redux,需要借助react-redux。

首先來搭建環(huán)境:

create-react-app react-app cd react-app npm run eject npm i @babel/plugin-proposal-decorators @babel/plugin-proposal-class-properties -D npm i mobx mobx-react -S

修改package.json中babel的配置:

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

注意:vscode編譯器中,js文件使用裝飾器會報紅。解決方式:

在根目錄編寫寫jsconfig.json

{"compilerOptions": {"module": "commonjs","target": "es6","experimentalDecorators": true},"include": ["src/**/*"] }

在 src 目錄下創(chuàng)建 store.js ,作為項目的全局狀態(tài)管理

import {observable, computed, action} from 'mobx'class Store {@observable num = 10@computed get sumOne() {return this.num += 1}@action add = ()=>{console.log(this);return this.num += 10} }const store = new Store()export default store

在其他組件中就可以使用了,例如在 index.js 中使用

import React from 'react'; import ReactDOM from 'react-dom'; import store from './store';console.log(store.num); console.log(store.sumOne); console.log(store.add());ReactDOM.render(<div>hello</div>,document.getElementById('root'));

總結(jié)

以上是生活随笔為你收集整理的mobx笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。