>
钥匙要点动作:新数据通过操作流入商店。商店收听操作并在调用操作时执行某些任务(例如修改数据)。这使数据流程单向保持。
索式台球时,每当其数据更改时会触发事件。您的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中文网其他相关文章!