React使用Mobx管理数据
React 和 Vue一样都属于单向数据流,为了更好的进行状态和数据管理官方和第三方也有配套的Redux等插件,本文介绍一个个人觉得更易用使用的组件 Mobx 核心概念MobX 处理你的应用程序状态如下图所示 常用的几个装饰器 (装饰器解释
React项目中Mobx的安装npm或yarn安装插件
装饰器的启用,装饰器目前仍处于提案阶段因此需要做特殊处理修改package.json添加如下引用,这个和npm手动安装一个道理 "@babel/core": "^7.1.0","@babel/plugin-proposal-class-properties": "^7.1.0","@babel/plugin-proposal-decorators": "^7.1.0","@babel/preset-env": "^7.1.0" 使用npm run eject确认显示所有隐藏的配置文件注意此步骤不可逆 在根目录创建.babelrc文件,添加如下内容{ "presets": [ "@babel/preset-env","@babel/preset-react" ],"plugins": [ ["@babel/plugin-proposal-decorators",{ "legacy": true }],["@babel/plugin-proposal-class-properties",{ "loose": true }] ] } 删除package.json中babel配置几个核心装饰器的解释@observable 创建需要被监听的应用状态通过对Class的属性简单的使用@observable修饰符,就定义了一个需要被监听的应用状态变量;然后直接在类中定义对应用状态变量的操作;我们就实现了一个灵活的Store层 import React from ‘react‘; import ReactDOM from ‘react-dom‘; import ‘./index.css‘; import * as serviceWorker from ‘./serviceWorker‘; import TodoBox from ‘./Welcome‘; import {observable,action} from ‘mobx‘; class Store{ @observable todos=[{ key:1,title: "todo标题",done: false,},{ key:2,title: "todo-2",}]; } 如上面代码所示,Store是一个store层的类,用来对状态进行管理 @observer 创建应用状态的监听者有多种方式可以创建应用状态的监听者(Reactions),包括autorun、reaction、@observer等 此处示例显示如何用@observer来监听 import React,{Component} from ‘react‘; import {observer} from "mobx-react"; import {action} from "mobx"; @observer class TodoBox extends Component { /** * * @param props */ constructor(props) { super(props); } render() { const store=this.props.store; return ( <div> <ul> {store.todos.map((todo,_) => <li>{todo.title}</li>)} </ul> </div> ) } } export default TodoBox; @action可以看到之前的监听模式下,其实完全可以直接通过store层对数据进行读取和写入,虽然很便捷但却打破了单向数据流向的原则,Mobx也考虑到这点所以特意设计了action,并且要求用户尽可能的使用action来设定更改状态和数据的方法 class Store{ @observable todos=[{ key:1,}]; @action changeTitle(){ // 直接修改仓库中的状态值 this.todos[0].title = "修改后的todo标题" } } 完整Demoimport React from ‘react‘; import ReactDOM from ‘react-dom‘; import ‘./index.css‘; import * as serviceWorker from ‘./serviceWorker‘; import TodoBox from ‘./Welcome‘; import {observable,action} from ‘mobx‘; class Store{ @observable todos=[{ key:1,}]; @action changeTitle(){ // 直接修改仓库中的状态值 this.todos[0].title = "修改后的todo标题" } } const store1=new Store(); ReactDOM.render(<TodoBox store={store1} />,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: http://bit.ly/CRA-PWA serviceWorker.unregister(); import React,{Component} from ‘react‘; import {observer} from "mobx-react"; import {action} from "mobx"; @observer class TodoBox extends Component { /** * * @param props */ constructor(props) { super(props); } render() { const store=this.props.store; return ( <div> <ul> {store.todos.map((todo,_) => <li>{todo.title}</li>)} </ul> <div> <input type="button" onClick={() => { this.props.store.changeTitle(); // // 直接修改仓库中的状态值 // this.props.store.todos[0].title = "修改后的todo标题" }} value="点我"/> </div> </div> ) } } export default TodoBox; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |