[译] Flux 入门
本文将概括性的介绍如何使用 Flux 架构开发 JavaScript 应用,用尽可能少的篇幅带你熟悉 Flux 的核心概念。你也可以结合 starter kit 一起学习。你最好先对 React 有基本的了解,并且有一些开发 React 组件的经验。如果不熟悉也没关系,可以先读一读这篇文章 The React Quick Start Guide (译注:中文版本 React 入门)。 概念Flux 是用来构建用户端 Web 应用的架构,它包含三个核心概念:Views,Stores 和 Dispatcher,还有一些次级概念:Actions,Action Types,Action Creators 和 Web Utils。 请耐心学习以下概念定义然后再看后面的教程。当你准备开始开发 Flux 应用之前,建议你再回过头来看一遍基本概念。 核心概念
次级概念
是不是一次给的信息量太多啦?强烈建议你们结合 starter kit 边看文章边敲代码,可以达到更好的学习效果。 提示:这里省略了 constants 和 Web Utils,是为了更快速简单地理解 Flux。更深入阅读 官方示例 能很好地补充这些知识。 Views部署好 starter kit 后,你会看到在 var React = require('react'); var Comments = require('./views/comments'); var CommentForm = require('./views/comment-form'); var App = React.createClass({ render: function() { return ( <div> <Comments /> <CommentForm /> </div> ); } }); React.render(<App />,document.getElementById('app')); 上面代码把 Views 渲染到 DOM 中。先忽略 var React = require('react'); var CommentActionCreators = require('../actions/comment-action-creators'); var CommentForm = React.creatClass({ onSubmit: function(e) { var textNode = this.refs.text.getDOMNode(); var text = textNode.value; textNode.value = ''; CommentActionCreators.createComment({ text: text }); },render: function() { return ( <div className='comment-form'> <textarea ref='text' /> <button onClick={this.onSubmit}>Submit</button> </div> ); } }); module.exports = CommentForm;
当表单提交时 Actions在 var AppDispatcher = require('../dispatcher/app-dispatcher'); module.exports = { createComment: function(comment) { var action= { actionType: "CREATE_COMMENT",comment: comment }; AppDispatcher.dispatch(action); } };
接下来编写 Dispatcher 用于接收 Actions。 提示:也可以把这些逻辑写在 View 里面 - 直接跟 Dispatcher 通信,但最佳实践是用 Action Creator。它能降低代码的耦合度并给 Dispatcher 提供一个单独的接口。 Dispatcher在 var Dispatcher = require('flux').Dispatcher; module.exports = new Dispatcher(); Flux 库的 Dispatcher 提供了一个 提示:这里没有 Dispatcher 的具体实现,源码在这里。 Stores在 var AppDispatcher = require('../dispatcher/app-dispatcher'); var EventEmitter = require('events').EventEmitter; var assign = require('object-assign'); var comments = []; var CommentStore = assign({},EventEmitter.prototype,{ emitChange: function() { this.emit('change'); },addChangeListener: function(callback) { this.on('change',callback); },removeChangeListener: function(callback) { this.removeListener('change',getAll: function() { return comments; } }); AppDispatcher.register(function(action) { switch(action.actionType) { case "CREAT_COMMENT": comments.push(action.comment); CommentStore.emitChange(); break; default: } }); module.exports = CommentStore; 这段代码分为两部分:创建 Store 和 注册 Store。 Store 由 自定义对象定义了订阅和取消订阅事件的函数,同时定义了 然后,通过 Dispatcher 注册了一个回调函数。当 Dispatcher 调用 现在我们需要一个 View 来展示 Store 的数据,并订阅数据的变化。 在 var React = require('react'); var CommentStore = require('../stores/comment-store'); function getStateFromStore() { return { comments: CommentStore.getAll() } } var Comments = React.createClass({ onChange: function() { this.setState(getStateFromStore()); },getInitialState: function() { return getStateFromStore(); },componentDidMount: function() { CommentStore.addChangeListener(this.onChange); },componentWillUnmount: function() { CommentStore.removeChangeListener(this.onChange); },render: function() { var comments = this.state.comments.map(function(comment,index) { return ( <div className='comment' key={'comment-' + index}> {comment.text} </div> ); }); return ( <div className='comments'> {comments} </div> ) } }); module.exports = Comments;
在 最后 结语现在这个 Flux 应用可以运行起来了,同时我们也学习了 Flux 架构的核心概念:Views,Stores 和 Dispatcher。
这就是 Flux 的本质,Dispatcher 发送数据给所有 Stores,后者通知 Views 进行更新。 要想更深入理解 Flux 架构,我建议阅读 官方文档,或者看看这个 视频教程,还有 官方示例。 如果本文有什么错误之处,欢迎在 twitter 上联系我,或者给我提 pull request。欢迎大家给我提建议改善这边文章。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |