redux crud示例
mobx crud示例
如果您喜欢这篇文章,您可能还希望注册SitePoint Premium,并观看我们使用React和Redux的表格工作的课程。
>是开源库
提供客户端状态管理
不绑在特定框架
>对于初学者,您可以在短短30分钟内学习如何使用MOBX。一旦学习了基础知识,就是这样。您无需学习新的东西。使用Redux,基本知识也很容易。但是,一旦您开始构建更复杂的应用程序,就必须处理:
>
2。更少的代码写3。全面支持面向对象的编程
4。处理嵌套数据很容易
> 在大多数JavaScript应用程序中,您会发现自己使用关系或嵌套数据。要能够在Redux商店中使用它,您必须先将其标准化。接下来,您必须编写更多代码来管理归一化数据中参考的跟踪。的理由
1。太多的自由Redux是一个框架,可提供有关您如何编写状态代码的严格指南。这意味着您可以轻松编写测试并开发可维护的代码。 MOBX是一个库,没有关于如何实施它的规则。这样做的危险是,捷径很容易进行快速修复,这可能导致无法实现的代码。
>
3。可能有更好的替代品与mobx代码比较:redux vs mobx
>引导
mobx版本: 在MOBX中,我们需要设置多个商店。在这种情况下,我只使用一家商店,我将其放在一个名为AllStores的集合中。然后使用提供商将商店集合传递到应用程序。 如前所述,MOBX不需要外部库来处理异步操作,因此行较少。但是,我们确实需要MOBX-REMOTEDEV才能连接到Redux-Devtools-扩展调试工具。
<span>// src/store.js </span><span>import <span>{ applyMiddleware, createStore }</span> from "redux"; </span><span>import thunk from "redux-thunk"; </span><span>import promise from "redux-promise-middleware"; </span><span>import <span>{ composeWithDevTools }</span> from 'redux-devtools-extension'; </span><span>import rootReducer from "./reducers"; </span> <span>const middleware = composeWithDevTools(applyMiddleware(promise(), thunk)); </span> <span>export default createStore(rootReducer, middleware); </span> <span>------------------------------------------------------------------------------- </span> <span>// src/index.js </span>… <span>ReactDOM.render( </span> <span><span><span><BrowserRouter</span>></span> </span><span> <span><span><Provider</span> store<span>={store}</span>></span> </span><span> <span><span><App</span> /></span> </span><span> <span><span></Provider</span>></span> </span><span> <span><span></BrowserRouter</span>></span>, </span> <span>document.getElementById('root') </span><span>); </span>
在两个版本中,这里的代码量大致相同。 MOBX的导入语句较少。
props注入
<span>// src/stores/index.js </span><span>import remotedev from 'mobx-remotedev'; </span><span>import <span>Store</span> from './store'; </span> <span>const contactConfig = { </span> <span>name:'Contact Store', </span> <span>global: true, </span> <span>onlyActions:true, </span> <span>filters: { </span> <span>whitelist: <span>/fetch<span>|update|create|Event|entity|entities|handleErrors</span>/</span> </span> <span>} </span><span>}; </span> <span>const contactStore = new Store('api/contacts'); </span> <span>const allStores = { </span> <span>contactStore: remotedev(contactStore, contactConfig) </span><span>}; </span> <span>export default allStores; </span> <span>------------------------------------------------------------------------------- </span> <span>// src/index.js </span>… <span>ReactDOM.render( </span> <span><span><span><BrowserRouter</span>></span> </span><span> <span><span><Provider</span> stores<span>={allStores}</span>></span> </span><span> <span><span><App</span> /></span> </span><span> <span><span></Provider</span>></span> </span><span> <span><span></BrowserRouter</span>></span>, </span> <span>document.getElementById('root') </span><span>); </span>redux版本: 在Redux中,使用React-Redux的Connect()函数将状态和动作传递给道具。
>
MOBX版本似乎更容易阅读。但是,我们可以使用Redux-Connect-Decorator来简化Redux代码。在这种情况下,不会有明确的赢家。
<span>// src/pages/contact-form-page.js </span>… <span>// accessing props </span> <span><span><span><ContactForm</span> </span></span><span> <span>contact<span>={this.props.contact}</span> </span></span><span> <span>loading<span>={this.props.loading}</span> </span></span><span> <span>onSubmit<span>={this.submit}</span> </span></span><span> <span>/></span> </span>… <span>// function for injecting state into props </span><span>function mapStateToProps(state) { </span> <span>return { </span> <span>contact: state.contactStore.contact, </span> <span>errors: state.contactStore.errors </span> <span>} </span><span>} </span> <span>// injecting both state and actions into props </span><span>export default connect(mapStateToProps, { newContact, </span> saveContact<span>, </span> fetchContact<span>, </span> updateContact <span>})(ContactFormPage); </span>
定义商店,动作和还原器
<span>// src/pages/contact-form-page.js </span> … @<span>inject("stores") @observer // injecting store into props </span><span>class ContactFormPage extends Component { </span>… <span>// accessing store via props </span> <span>const { contactStore:store } = this.props.stores; </span> <span>return ( </span> <span><span><span><ContactForm</span> </span></span><span> <span>store<span>={store}</span> </span></span><span> <span>form<span>={this.form}</span> </span></span><span> <span>contact<span>={store.entity}</span> </span></span><span> <span>/></span> </span> <span>) </span>… <span>} </span>要保持这篇文章的精益,我将向您展示一个只有一个动作的代码样本。
redux版本: 在redux中,我们需要定义动作和还原器。
<span>// src/store.js </span><span>import <span>{ applyMiddleware, createStore }</span> from "redux"; </span><span>import thunk from "redux-thunk"; </span><span>import promise from "redux-promise-middleware"; </span><span>import <span>{ composeWithDevTools }</span> from 'redux-devtools-extension'; </span><span>import rootReducer from "./reducers"; </span> <span>const middleware = composeWithDevTools(applyMiddleware(promise(), thunk)); </span> <span>export default createStore(rootReducer, middleware); </span> <span>------------------------------------------------------------------------------- </span> <span>// src/index.js </span>… <span>ReactDOM.render( </span> <span><span><span><BrowserRouter</span>></span> </span><span> <span><span><Provider</span> store<span>={store}</span>></span> </span><span> <span><span><App</span> /></span> </span><span> <span><span></Provider</span>></span> </span><span> <span><span></BrowserRouter</span>></span>, </span> <span>document.getElementById('root') </span><span>); </span>
mobx版本: 在MOBX中,动作和还原器的逻辑是在一个类中完成的。我定义了一个异步操作,该操作称收到响应后获取的另一个动作实体。
>>由于MOBX使用OOP样式,因此对此处定义的商店类进行了重构,以便于使用类构造函数轻松创建多个商店。因此,这里演示的代码是基本代码,该代码与特定域名商店没有绑定。
<span>// src/stores/index.js </span><span>import remotedev from 'mobx-remotedev'; </span><span>import <span>Store</span> from './store'; </span> <span>const contactConfig = { </span> <span>name:'Contact Store', </span> <span>global: true, </span> <span>onlyActions:true, </span> <span>filters: { </span> <span>whitelist: <span>/fetch<span>|update|create|Event|entity|entities|handleErrors</span>/</span> </span> <span>} </span><span>}; </span> <span>const contactStore = new Store('api/contacts'); </span> <span>const allStores = { </span> <span>contactStore: remotedev(contactStore, contactConfig) </span><span>}; </span> <span>export default allStores; </span> <span>------------------------------------------------------------------------------- </span> <span>// src/index.js </span>… <span>ReactDOM.render( </span> <span><span><span><BrowserRouter</span>></span> </span><span> <span><span><Provider</span> stores<span>={allStores}</span>></span> </span><span> <span><span><App</span> /></span> </span><span> <span><span></Provider</span>></span> </span><span> <span><span></BrowserRouter</span>></span>, </span> <span>document.getElementById('root') </span><span>); </span>信不信由你,两个版本中定义的逻辑执行相同的任务,这是:
更新UI加载状态
要在Redux中创建表单,我使用了Redux-Form。在MOBX中,我使用了MOBX反应形式。这两个库都是成熟的,可以帮助您轻松处理逻辑。就个人而言,我更喜欢MOBX反应形式,因为它允许您通过插件验证字段。使用Redux-form,您要么编写自己的验证代码,要么可以导入验证软件包来处理您的验证。
>很明显,您可以看到MOBX的代码库要瘦得多。使用OOP样式和良好的开发实践,您可以快速构建应用程序。主要缺点是编写糟糕的,无与伦比的代码非常容易。
> 另一方面,Redux更受欢迎,非常适合构建大型和复杂的项目。这是一个严格的框架,并确保每个开发人员都撰写易于测试和维护的代码。但是,它不太适合小型项目。 尽管MOBX的缺点,但如果您遵循良好的做法,您仍然可以构建大型项目。用阿尔伯特·爱因斯坦(Albert Einstein)的话说:“尽可能简单,但不是更简单”。
>我希望我提供了足够的信息,以说明是迁移到MOBX还是坚持使用Redux的情况。最终,决定取决于您正在从事的项目类型以及可用的资源。 加载玩家…>
的学习曲线更陡峭。它需要理解动作,还原器和商店的概念,以及它们如何相互作用。另一方面,通常认为MOBX使用更熟悉的编程概念(例如可观察和动作),并且需要更少的样板代码。
>社区支持和生态系统如何比较Redux和Mobx之间?有更多用于学习Redux的资源,还有更多旨在与之合作的第三方库。但是,MOBX一直在越来越受欢迎。更喜欢更直接,更少的样板编码样式,或者当项目需要对状态更新进行细粒度控制时。当团队对面向对象的编程概念更舒适时,这也是一个不错的选择,因为MOBX强烈利用了这些概念。
>以上是Redux vs mobx:哪个最适合您的项目?的详细内容。更多信息请关注PHP中文网其他相关文章!