@Bios
2018-12-10T08:46:52.000000Z
字数 4047
阅读 1033
react mobx
yarn add mobx mobx-reactyarn add babel-plugin-transform-decorators-legacy
// webpack.config.dev.js webpack.congif.prod.js{test: /\.(js|jsx|mjs)$/,include: paths.appSrc,loader: require.resolve('babel-loader'),options: {plugins: [ // 就加上这个plugins['transform-decorators-legacy']],// This is a feature of `babel-loader` for webpack (not Babel itself).// It enables caching results in ./node_modules/.cache/babel-loader/// directory for faster rebuilds.cacheDirectory: true,},},
在 src 文件夹下 新建一个store文件夹
// index.jsimport homeStore from './home_store.js';import otherStore from './others.js';export {homeStore, otherStore}// home_store.jsimport {observable, action, computed} from 'mobx';class HomeStore {@observable text;@observable num;constructor() {this.num = 0this.text = 'Hello Word!'}@actionplus = () => {this.num = ++this.num}minus = () => {this.num = --this.num}change = (str) => {this.text = str}@computedget plusNum (){return this.num + 5}}const homeStore = new HomeStore()//通过new 创建一个homeStore对象实例通过export导出export default homeStore// others.jsimport {observable, action} from 'mobx';class OthersStore {@observable str;constructor() {this.str = '这个值来自其他模块'}@actiongetdata = () => {fetch('api/comments/show?id=4199740256395164&page=1').then(res => {res.json().then(action((data) => {// console.log(data);this.str = data.msg;}))})}}const otherStore = new OthersStore()//通过new 创建一个homeStore对象实例通过export导出export default otherStore
在action 中请求数据,用action进行数据绑定
全局注册
// app.jsimport React, { Component } from 'react';import logo from '../../assets/img/logo.svg';import './index.css';import {Provider} from "mobx-react";import * as store from '../../store/index.js'//将所有方法给预一个store的别名方面在不同组件中调用import Mobx from '../../views/mobx_test.js';import Mobx2 from '../../views/mobx2.js';class App extends Component {render() {return (<Provider store={store}><div className="App"><header className="App-header"><img src={logo} className="App-logo" alt="logo" /><h1 className="App-title">Welcome to React</h1></header><p className="App-intro">To get started, edit <code>src/App.js</code> and save to reload.</p><Mobx></Mobx><Mobx2></Mobx2></div></Provider>);}}export default App;
组件中使用
// mobx2.jsimport React, {Component} from "react";import {observer,inject} from 'mobx-react';@inject('store') // 将store注入到当前组件中@observer // 将该组件变成响应式组件class Mobx2 extends Component {handleClick = () => {this.props.store.otherStore.getdata()}render() {return (<div><h1>体现mobx的响应式</h1><h2>homeStore.text: {this.props.store.homeStore.text}</h2><h2>homeStore.num: {this.props.store.homeStore.num}</h2><button onClick={this.handleClick}> 点击获取数据修改str</button></div>)}}export default Mobx2;
// mobx_test.jsimport React, {Component} from "react";import {observer,inject} from 'mobx-react';@inject('store') // 将store注入到当前组件中@observer // 将该组件变成响应式组件class Mobx extends Component {handelPlus =() => {this.props.store.homeStore.plus()}handelMinus =() => {this.props.store.homeStore.minus()}handleChange = () => {this.props.store.homeStore.change('哈哈哈哈,成功!')}render() {return (<div><h1>Mobx Test</h1><h2>homeStore.text: {this.props.store.homeStore.text}</h2><h2>homeStore.num: {this.props.store.homeStore.num}</h2><h3>otherStore.str: {this.props.store.otherStore.str}</h3><h3>homeStore.computed: {this.props.store.homeStore.plusNum}</h3>调用action:<br/><button onClick={this.handelMinus}>减</button><button onClick={this.handelPlus}>加</button><button onClick={this.handleChange}>改变 homeStore.text</button></div>)}}export default Mobx;
组件中使用时要注意 this 的问题,推荐使用箭头函数
不做全局绑定 也没有响应
// store/good.jsimport { observable, action } from 'mobx';import { httpReq } from '../api/httpReq.js';export default class GoodsModel {@observable goodsList = [];@actiongetGoodsList = async (id) => {const url = 'http://dev.xyf.78dk.com/v5/firstproductlists';const method = 'post';const params = {merchantId: id || 1005}const responseData = await httpReq({url, method, params}).then(res => res.json());this.goodsList = [].concat(responseData.data.productList);}}// view/good.jsimport React, { Component } from 'react';import {observer} from 'mobx-react';@observerexport default class Goods extends Component{// new数据实例goodsModel = new GoodsModel();getProductList(){// 调用实例方法this.goodsModel.getGoodsList();}render() {// 拿取数据const { goodsList } = this.goodsModel;return (<div>{goodsList}</div>);}}