React では、flux はパブリック状態管理ソリューションであり、クライアント側 Web アプリケーションのアプリケーション アーキテクチャを構築し、データの一方向フローの形式でパブリック状態を管理するために使用されます。
このチュートリアルの動作環境: Windows7 システム、react17.0.1 バージョン、Dell G3 コンピューター。
flux とは
flux は、React の vuex に似たパブリック状態管理ソリューションであり、Facebook によって公式に使用されています アプリケーション アーキテクチャを構築しますクライアント Web アプリケーションの情報を取得し、データの 一方向フロー を使用してパブリック ステータスを管理します。
これは正式なフレームワークというよりパターンに近いもので、開発者は新しいコードをあまり必要とせずにすぐに Flux を使い始めることができます。
cnpm i flux -S
を使用してインストールします。
フラックスの組成
flux のワークフロー
index.jsx を開いてください。コンポーネントが 1 つだけ読み込まれていることがわかります。
// index.jsx var React = require('react'); var ReactDOM = require('react-dom'); var MyButtonController = require('./components/MyButtonController'); ReactDOM.render( <MyButtonController/>, document.querySelector('#example') );
MyButton ではなく
MyButtonController であることにお気付きかもしれません。何故ですか?
MyButtonController のソース コードは非常にシンプルです。
// components/MyButtonController.jsx var React = require('react'); var ButtonActions = require('../actions/ButtonActions'); var MyButton = require('./MyButton'); var MyButtonController = React.createClass({ createNewItem: function (event) { ButtonActions.addNewItem('new item'); }, render: function() { return <MyButton onClick={this.createNewItem} />; } }); module.exports = MyButtonController;
MyButtonController がパラメータをサブコンポーネント
MyButton に渡します。後者のソース コードはさらに単純です。
// components/MyButton.jsx var React = require('react'); var MyButton = function(props) { return <div> <button onClick={props.onClick}>New Item</button> </div>; }; module.exports = MyButton;
MyButton が純粋なコンポーネント (つまり、状態が含まれていない) であることがわかり、テストと再利用が容易になります。これが「コントロールビュー」モードの最大のメリットです。
MyButtonロジックは 1 つだけです。つまり、ユーザーがクリックすると、
this.createNewItem メソッドが呼び出され、アクションがディスパッチャーに送信されます。
// components/MyButtonController.jsx // ... createNewItem: function (event) { ButtonActions.addNewItem('new item'); }
createNewItem メソッドを呼び出すと、
addNewItem という名前のアクションがトリガーされます。
actionType 属性 (アクションのタイプを記述する) とその他の属性 (データを渡すために使用される) を含むオブジェクトです。
ButtonActions オブジェクトを使用してすべてのアクションを保存します。
// actions/ButtonActions.js var AppDispatcher = require('../dispatcher/AppDispatcher'); var ButtonActions = { addNewItem: function (text) { AppDispatcher.dispatch({ actionType: 'ADD_NEW_ITEM', text: text }); }, };
ButtonActions.addNewItem メソッドは
AppDispatcher を使用してアクション
ADD_NEW_ITEM をストアにディスパッチします。
AppDispatcher.js を記述する必要があります。
// dispatcher/AppDispatcher.js var Dispatcher = require('flux').Dispatcher; module.exports = new Dispatcher();
AppDispatcher.register() メソッドは、さまざまなアクション コールバック関数を登録するために使用されます。
// dispatcher/AppDispatcher.js var ListStore = require('../stores/ListStore'); AppDispatcher.register(function (action) { switch(action.actionType) { case 'ADD_NEW_ITEM': ListStore.addNewItemHandler(action.text); ListStore.emitChange(); break; default: // no op } })
ADD_NEW_ITEM アクションを受け取り、コールバック関数を実行して
ListStore を操作します。
ListStore があります。
// stores/ListStore.js var ListStore = { items: [], getAll: function() { return this.items; }, addNewItemHandler: function (text) { this.items.push(text); }, emitChange: function () { this.emit('change'); } }; module.exports = ListStore;
ListStore.items は項目の保存に使用され、
ListStore.getAll() はすべての項目の読み取りに使用されます (
ListStore)。 EmitChange( )「変更」イベントを発行するために使用されます。
// stores/ListStore.js var EventEmitter = require('events').EventEmitter; var assign = require('object-assign'); var ListStore = assign({}, EventEmitter.prototype, { items: [], getAll: function () { return this.items; }, addNewItemHandler: function (text) { this.items.push(text); }, emitChange: function () { this.emit('change'); }, addChangeListener: function(callback) { this.on('change', callback); }, removeChangeListener: function(callback) { this.removeListener('change', callback); } });
上面代码中,ListStore
继承了EventEmitter.prototype
,因此就能使用ListStore.on()
和ListStore.emit()
,来监听和触发事件了。
Store 更新后(this.addNewItemHandler()
)发出事件(this.emitChange()
),表明状态已经改变。 View 监听到这个事件,就可以查询新的状态,更新页面了。
现在,我们再回过头来修改 View ,让它监听 Store 的 change
事件。
// components/MyButtonController.jsx var React = require('react'); var ListStore = require('../stores/ListStore'); var ButtonActions = require('../actions/ButtonActions'); var MyButton = require('./MyButton'); var MyButtonController = React.createClass({ getInitialState: function () { return { items: ListStore.getAll() }; }, componentDidMount: function() { ListStore.addChangeListener(this._onChange); }, componentWillUnmount: function() { ListStore.removeChangeListener(this._onChange); }, _onChange: function () { this.setState({ items: ListStore.getAll() }); }, createNewItem: function (event) { ButtonActions.addNewItem('new item'); }, render: function() { return <MyButton items={this.state.items} onClick={this.createNewItem} />; } });
上面代码中,你可以看到当MyButtonController
发现 Store 发出 change
事件,就会调用 this._onChange
更新组件状态,从而触发重新渲染。
// components/MyButton.jsx var React = require('react'); var MyButton = function(props) { var items = props.items; var itemHtml = items.map(function (listItem, i) { return <li key={i}>{listItem}</li>; }); return <div> <ul>{itemHtml}</ul> <button onClick={props.onClick}>New Item</button> </div>; }; module.exports = MyButton;
推荐学习:《react视频教程》
以上が反応におけるフラックスとは何を意味しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。