>
鑰匙要點動作:新數據通過操作流入商店。商店收聽操作並在調用操作時執行某些任務(例如修改數據)。這使數據流程單向保持。
索式台球時,每當其數據更改時會觸發事件。您的React組件(例如NoteListComponent)會聆聽此事件,並更新視圖中列出的註釋列表。這就是數據流出商店的方式。
>通量模式的最大優點是它使您的應用程序數據保持平整。由於只能通過動作進行突變,因此更容易理解數據變化如何影響整個應用程序。
>注意:
>如果您已經瀏覽了Facebook的通量指南,則可能已經註意到了調度員的概念。調度員是回到商店的回調註冊表。調用操作後,調度員會響應它,並將關聯的數據發送給所有註冊商店。然後,商店檢查操作類型並相應地執行任務。
>上述過程已被稱為reflux的庫大大簡化。它通過使動作可聽來消除調度員的概念。因此,在反流中,商店可以直接聽取動作並響應其調用。
完全了解通量模式,讓我們構建一個簡單的音符,以reflux,react和node.js.s.
進行應用程序。>我們將使用React和Reflux用作節點模塊,並使用瀏覽器也可以在客戶端提供它們。因此,這是我們建立環境的方式:
grunt watch grunt nodemon該應用程序可在https:// localhost:8000上訪問,如下所示:
在應用程序上工作
>
>
grunt watch grunt nodemonreflux.createactions用於創建動作。我們導出這些動作以便在我們的組件中使用它們。
>
創建商店
如您所見,我們在INIT方法內收聽了兩個動作,CreateNote和Editnote。我們還註冊了調用操作時執行的回調。添加/更新註釋的代碼非常簡單。我們還揭露Getters以檢索筆記列表。最後,該商店被導出,以便可以在我們的組件中使用。
組件安裝時,我們開始收聽索引的更改事件。每當筆記列表中有突變時,這都是廣播。我們的組件會傾聽此事件,以便在任何更改的情況下重新渲染註釋。以下行註冊了一個聽眾:
>因此,這就是Notelist總是通過收聽商店的變更活動來保持最新狀態的方式。現在,讓我們看看如何創建/編輯註釋。 notecreationbox: 可以看一下notecreationbox的以下方法: 這是數據流入系統的方式並隨後在基於通量的應用程序中輸出。
>
創建筆記應用程序的問題
> >我如何處理我的用戶交互使用React和Flux? >如何測試使用React和Flux構建的筆記應用程序? - 可以使用各種測試庫和框架來完成用React和Flux構建的應用應用程序。對於單位測試反應組件,可以使用開玩笑或酶等文庫。為了測試通量操作和商店,您可以將Jest與Redux Mock商店或Flux Mock商店等庫一起使用。可以使用柏樹或木偶等工具進行端到端的測試。 >是的,您可以在構建筆記應用應用程序時使用其他庫或框架。例如,您可能會使用諸如React路由器之類的路由庫進行導航,諸如JEST的測試庫進行測試,或者像材料UI這樣的UI庫來造型。庫或框架的選擇將取決於您的特定需求和偏好。 <span>var Reflux = require('reflux');
</span>
<span>var NoteActions = Reflux.createActions([
</span> <span>'createNote',
</span> <span>'editNote'
</span><span>]);
</span>
module<span>.exports = NoteActions;</span>
我們所有的反應組件都位於React/組件目錄中。我已經顯示了UI的整體結構。您可以查看下載的源代碼,以了解有關每個組件的更多信息。在這裡,我將向您展示關鍵的事情(即我們的組件如何調用動作並與商店互動)。
此組件從諾森特獲取了筆記列表,並將其饋送到Notelist組件中,然後將筆記呈現。這是組件的外觀:<span>var Reflux = require('reflux');
</span><span>var NoteActions = require('../actions/NoteActions');
</span>
<span>var _notes = []; //This is private notes array
</span>
<span>var NoteStore = Reflux.createStore({
</span> <span>init: function() {
</span> <span>// Here we listen to actions and register callbacks
</span> <span>this.listenTo(NoteActions.createNote, this.onCreate);
</span> <span>this.listenTo(NoteActions.editNote, this.onEdit);
</span> <span>},
</span> <span>onCreate: function(note) {
</span> _notes<span>.push(note); //create a new note
</span>
<span>// Trigger an event once done so that our components can update. Also pass the modified list of notes.
</span> <span>this.trigger(_notes);
</span> <span>},
</span> <span>onEdit: function(note) {
</span> <span>// Update the particular note item with new text.
</span> <span>for (var i = 0; i < _notes.length; i++) {
</span> <span>if(_notes[i]._id === note._id) {
</span> _notes<span>[i].text = note.text;
</span> <span>this.trigger(_notes);
</span> <span>break;
</span> <span>}
</span> <span>}
</span> <span>},
</span>
<span>//getter for notes
</span> <span>getNotes: function() {
</span> <span>return _notes;
</span> <span>},
</span>
<span>//getter for finding a single note by id
</span> <span>getNote: function(id) {
</span> <span>for (var i = 0; i < _notes.length; i++) {
</span> <span>if(_notes[i]._id === id) {
</span> <span>return _notes[i];
</span> <span>}
</span> <span>}
</span> <span>}
</span><span>});
</span>
module<span>.exports = NoteStore; //Finally, export the Store</span>
<span>var React = require('react');
</span><span>var NoteList = require('./NoteList.jsx');
</span><span>var NoteStore = require('../../stores/NoteStore');
</span>
<span>var NoteListBox = React.createClass({
</span> <span>getInitialState: function() {
</span> <span>return { notes: NoteStore.getNotes() };
</span> <span>},
</span> <span>onChange: function(notes) {
</span> <span>this.setState({
</span> <span>notes: notes
</span> <span>});
</span> <span>},
</span> <span>componentDidMount: function() {
</span> <span>this.unsubscribe = NoteStore.listen(this.onChange);
</span> <span>},
</span> <span>componentWillUnmount: function() {
</span> <span>this.unsubscribe();
</span> <span>},
</span> <span>render: function() {
</span> <span>return (
</span> <span><div className="col-md-4">
</span> <span><div className="centered"><a href="" onClick={this.onAdd}>Add New</a></div>
</span> <span><NoteList ref="noteList" notes={this.state.notes} onEdit={this.props.onEdit} />
</span> <span></div>
</span> <span>);
</span> <span>}
</span><span>});
</span>
module<span>.exports = NoteListBox;</span>
>最後,我們在componentWillunMount中編寫this.unsubscribe()以刪除偵聽器。
grunt watch
grunt nodemon
>
>
>我鼓勵您瀏覽源代碼並進一步改進,因為有很大的改進空間。如果您有任何疑問,請在評論中告訴我。 >如何與Flux一起在構建筆記應用程序中與Flux一起工作?
反應和通量共同使用,通過分配職責來構建筆記應用程序。 React負責渲染視圖並響應用戶輸入,而Flux管理應用程序的數據流。當用戶與React組件進行交互(例如添加新音符)時,它會觸發操作。此操作通過調度程序更新商店(應用程序的中央數據)。然後,商店發出更改事件,導致React組件在必要時進行更新和重新渲染。
>通量體系結構的關鍵組成部分是什麼?
磁通結構由四個主要組件組成:操作,調度程序,商店和視圖(React組件)。操作是將數據從應用程序發送到調度程序的信息的有效載荷。調度程序是一種管理應用程序中所有數據流的中央集線器。商店包含應用程序狀態和邏輯,並且由調度員更新。最後,視圖(React組件)在發生這些更改時聆聽商店的更改並重新渲染自己。 flux如何幫助維持筆記應用應用程序的可擴展性?
通量體系結構有助於保持筆記應用程序的可擴展性。這使應用程序隨著複雜性的增長而易於理解和修改。單向數據流可確保應用程序的一個部分的變化不會出乎意料地影響其他部分,從而降低了錯誤的可能性並使應用程序更易於測試和調試。 >使用React和Flux構建的筆記應用程序中的用戶互動通常通過操作來處理。當用戶與React組件進行交互時(例如,單擊按鈕添加新註釋),它會觸發操作。此操作將數據發送給調度員,該調度員更新了相關商店。然後,商店發出更改事件,導致任何聆聽的反應組件更新和重新渲染。
>如何調試使用React和Flux構建的筆記應用應用程序?
>在構建筆記應用程序時,我可以使用其他庫或框架,並使用React和Flux?
如何優化使用React和Flux構建的筆記應用程序的性能?使用React和Flux構建的注意應用程序可能涉及各種策略。一種常見的策略是通過仔細管理狀態和道具,並在適當的情況下使用React的Purecomponent或shopscomponentupate確保組件僅在必要時重新渲染。其他策略可能包括通過使用代碼分組來優化應用程序的初始加載時間,或通過使用諸如Relay或Apollo之類的庫來優化數據獲取。
>
以上是創建一個使用React和Flux的Note採用應用程序的詳細內容。更多資訊請關注PHP中文網其他相關文章!