webpack环境搭建

npm init -ynpm i webpack webpack-cli webpack-dev-server -Dnpm i html-webpack-plugin -Dnpm i babel-loader @babel/core @babel/preset-env -Dnpm i @babel/plugin-proposal-decorators @babel/plugin-proposal-class-properties -Dnpm i mobx -S

编写webpack.config.js

const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {mode: 'development',entry: {app: path.resolve(__dirname, './src/index.js')},output: {path: path.resolve(__dirname, './dist')},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()],// 代码合并方式在一行devtool:'inline-source-map'
}

observable可观察对象

import {observable} from 'mobx'

map

set设置,get获取,delete删除,has判断有无

const map = observable.map({a:1,b:2})
map.set('a',11)
console.log(map.get('a'));
console.log(map.get('b'));
map.delete('a')
console.log(map.has('a'));

数组

数组转成可观察的后是proxy,访问和操作与js相同

const arr = observable([1,2,3,4,5])
// arr是一个proxy
console.log(arr[2]);
arr.pop()
arr.push(12)
console.log(arr);

对象

对象转成可观察的后是proxy

let obj = observable({a:1,b:2})
console.log(obj);//obj是一个proxy

基础类型

枚举,布尔值,字符串需要放入box,使用get访问,使用set设置

枚举

 const num = observable.box(10)console.log(num.get());

字符串

const str = observable.box('str')
console.log(str.get());

布尔值

const bool = observable.box(true)
console.log(bool.get());

observable装饰器

对 observables 作出响应

autorun

检测数据变化,数据必须是可观察的

参数是一个回调函数

第一次运行会调用,回调函数被引用的数据有变化会调用

用于检测回调函数里对象的变化

let obj = observable({title:'msg'})
autorun(()=>{console.log(obj.title);
})
obj.title = 'mmm'

when

有两个参数,都是回调函数,第一个回调函数返回布尔值,为true才运行第二个回调函数

when(()=>{return store.bool},()=>{console.log('when function run...');}
)

reaction

autorun的变种

基于某个数据实现视图更新

两个参数,均为回调函数,第一个回调函数的返回值作为第二个回调函数的输入

和autorun的区别:第一次不会调用,发生变化时调用

reaction(()=>{return store.str},(arr)=>{console.log(arr.join('/'));}
)
setTimeout(() => {store.bool = true,store.str = 'world'store.num = 220
}, 5000);

computed

定义方法:

1.computed函数(使用不多)

对观察的结果可以使用observer方法

const rs = computed(()=>{return store.str+store.num
})
console.log(rs.get());
rs.observe((change)=>{console.log(rs.get());
})store.bool = true,
store.str = 'world'
store.num = 220

2.装饰器定义computed

@computedget result(){return this.str+this.num}
//使用reaction检测变化
reaction(()=>{return store.result},(result)=>{console.log(result);}
)

改变observable的状态

action

mobx中引入action对象,通过装饰器装饰函数

@actionbar(){this.str = 'mobx',this.num = '232'}
store.bar()

绑定this

 @action.bound foo(){this.str = 'foo'}

异步操作

npm i @babel/runtime @babel/plugin-transform-runtime

在webpackconfig.js里配置

@actionasync fzz(){console.log('fzz');let obj = await new Promise((reslove)=>{setTimeout(() => {reslove({num:1234,str:'wowo'})}, 4000);})runInAction(()=>{store.num = obj.numstore.str = obj.str})console.log(store.num,store.str);}

在react中使用mobx

npx create-react-app react-mobx-app

create-react-app不支持装饰器

二次配置webpack的方法:cra,rewied,eject

yarn eject
npm i @babel/plugin-proposal-decorators @babel/plugin-proposal-class-properties -D

在package.json里配置babel

"babel": {"presets": ["react-app"],"plugins":[["@babel/plugin-proposal-decorators",{"legacy":true}],["@babel/plugin-proposal-class-properties",{"loose":true}]]}
npm i mobx mobx-react -S
yarn start

注意:vscode编译器中,js文件使用装饰器会报红。解决方式:

在根目录编写写jsconfig.json

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

React + Mobx 案例

创建store/index.js

import {observable, action, computed,runInAction} from 'mobx'
class AppStore{@observabletitle = 'mobx'@observabletodos = []@computedget desc(){return `一共${this.todos.length}条`}@action.boundaddTodo(todo){//可以直接操作数据this.todos.push(todo)}@action.bounddelTodo(){this.todos.pop()}@action.boundresetTodo(){this.todos = []}@action.bound//异步操作方法1// asyncAddTodo(todo){//     this.todos.push(todo)// }//异步操作方法2async asyncAddTodo(todo){await new Promise((resolve)=>{setTimeout(() => {resolve() }, 1000);})runInAction(()=>{this.todos.push(todo)})}}
const store = new AppStore()
//导出类的实例
export default store

创建pages/Home.js,在这里使用store

import React, { Component } from 'react'
import {observer,inject} from 'mobx-react'
import store from '../store'
//观察者observer:类被引用后,属性发生变化,重新渲染类
// inject可以传入参数,
// 类可以响应变化,根据变化做出渲染或修改数据
@inject('store')
@observer
class Home extends Component {addTodo=(item)=>{return()=>{store.addTodo(item)}}delTodo=()=>{store.delTodo()}resetTodo=()=>{store.resetTodo()}asyncAddTodo=(item)=>{return ()=>{setTimeout(() => {store.asyncAddTodo(item)}, 2000);}}render() {return (<><div>{store.title}</div><button onClick = {this.addTodo('这是一条内容')}>add</button><button onClick = {this.delTodo}>delete</button><button onClick = {this.resetTodo}>reset</button><button onClick = {this.asyncAddTodo('这是一条异步添加内容')}>async add</button><h6>{store.todos.length}</h6>{store.todos.map((item,index)=>{return(<div key = {index}>{item}</div>)})}</>)}
}
export default Home
n onClick = {this.resetTodo}>reset</button><button onClick = {this.asyncAddTodo('这是一条异步添加内容')}>async add</button><h6>{store.todos.length}</h6>{store.todos.map((item,index)=>{return(<div key = {index}>{item}</div>)})}</>)}
}
export default Home

前端学习——Mobx相关推荐

  1. 前端共享桌面_2020 前端学习路线总结,哎呦,不错哦!

    2020 前端学习路线总结 在 GitHub 看到一个很不错的前端学习路线图(roadmap),从前端基础到前端工程化,再到跨端,都有知识点的覆盖,非常推荐阅读. 图下面是我翻译的一个文字版,可以先看 ...

  2. 2020 前端学习路线总结,哎呦,不错哦!

    2020 前端学习路线总结 在 GitHub 看到一个很不错的前端学习路线图(roadmap),从前端基础到前端工程化,再到跨端,都有知识点的覆盖,非常推荐阅读. 在前端领域混了这几年,总结了一套前端 ...

  3. 2021 年前端学习路线总结

    下面是我翻译的一个文字版,可以先看图再看文字. ✅ 表示个人推荐学习 ✳️ 表示可选择学习 ❇️ 表示不需要严格按照路线的先后顺序,可在任何时间补充这一块的知识 ❎ 表示个人不再推荐 计算机网络 掌握 ...

  4. 【FE前端学习】第二阶段任务-基础

    技能学习部分: 1.需要熟练掌握HTML标签以及CSS各个常用属性. 2.掌握CSS3 常用属性 3.掌握jquery的基本用法,对于JS基本逻辑语句需要熟练掌握 上文 [FE前端学习]第二阶段任务- ...

  5. Web前端学习有哪些技巧?

    想要学好web前端技术,在学习过程中找到合适的方法和技巧,那么在实际学习过程中会更加的容易和快速掌握知识重点,尤其是对于初学者尤为关键,下面小编就为大家详细的介绍一下Web前端学习有哪些技巧?希望能够 ...

  6. “计算机之子”winter:我的前端学习路线与方法

    你好,我是winter.今天我们一起来聊聊前端的学习路线与方法. 到现在为止,前端工程师已经成为研发体系中的重要岗位之一.可是,与此相对的是,我发现极少或者几乎没有大学的计算机专业愿意开设前端课程,更 ...

  7. python比前端好学吗_前端学习到底难不难?

    难易程度是相对的,不是绝对的. 前端学习相对于java,python等肯定是更为简单的.精通会有难度,而且更新速度很快,需要不断的充实自己,提升自己,这也是一个难点. 前端学习初期,不知道该怎么学,学 ...

  8. hbuilder前端需要的插件_最新web前端学习路线

    随着互联网的深入发展,前端开发工程师已成为市场上极具竞争力的人才.许多学生,包括以前的UI,java,或完全零基础,想学习的前端.下面的思维导图是在互联网上广泛传播的前端学习地图.许多初学者说,当他们 ...

  9. html 表单自动数值,web前端学习技术之对HTML5 智能表单的理解

    原标题:web前端学习技术之对HTML5 智能表单的理解 Html5新增input的form属性,用于指向特定form表单的id,实现input无需放在form标签之中,即可通过表单进行提交. - t ...

最新文章

  1. marquee 滚动字幕
  2. 在PHP当中制作隔行换色的效果以及制作上下翻页的效果!
  3. bash中通过设置PS1变量改变提示符颜色
  4. 对Java Inputstream的一次采访
  5. ASP.NET (C#) 面试笔试题目收集
  6. 捕捉Web页面子类错误堆栈中的信息
  7. An error occured executing the microsoft VC++ runtime installer
  8. Qemu(纯软实现)架构+KVM(基于kernel模拟硬件)原理(一)
  9. 【转载】 C#中decimal.TryParse方法和decimal.Parse方法的异同之处
  10. c#中关于结构体和字节数组转化
  11. Deecamp笔记——点云目标跟踪 Open3D连续可视化
  12. 【Unity3D开发小游戏】Unity3D开发《3D迷宫》小游戏
  13. 尚硅谷kylin单机版之安装Hadoop3.1.3
  14. [转]批处理详细教程
  15. 目标检测之FCOS算法分析
  16. python画气泡图_画气泡图的十二个图表库
  17. 抖音 Android 包体积优化探索:资源二进制格式的极致精简
  18. c++总结(updating)
  19. 玩机搞机----mtk芯片机型 另类制作备份线刷包的方式 读写分区等等
  20. Top 25款3DMAX建筑设计相关插件

热门文章

  1. 首发 | 杭派工程师五年生存现状报告
  2. java中JAO,Java
  3. vscode调出大纲
  4. 如何解决”/”应用程序中的服务器错误
  5. cuda 单block多线程
  6. ios 图标 圆角 大小
  7. 习题 8-28 打结(Knots, ACM/ICPC ACM/ICPC Jakarta 2012, UVa1624)
  8. [二级C]专题习题-二维数组
  9. 计算机之父——约翰·冯·诺依曼(现代计算机之父”、“博弈论之父”)
  10. 前端市场又“饱和”了,还有必要学吗?