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>
>
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中文網其他相關文章!