前提複雑なシナリオでは、複数の異なるページ間で大量のデータを使用したり変更したりする必要があります。しかし、ミニプログラムページの直接データ通信方法は非常にシンプルです。通常、共通データを保存するにはグローバル オブジェクトを維持する必要があります。ただし、ビジネス ロジックが複雑になるにつれて、共有データ エンティティを単純に維持するだけでは規模が大きくなりすぎ、データの変更を適切に追跡できなくなることがよくあります。さらに、パブリック データ エンティティのデータの変更とページの UI の間には適切な同期方法がありません。ページと対応するデータ エンティティの両方で同じデータを維持する必要があることが多く、非常に不便です。 Taroは、これまでreact+reduxの構造を持つWeChatアプレットの開発に使用されていました。reduxに頼ることで、上記の問題を全体的に解決できます。しかし、太郎自体にも、受け入れがたい潜在的な問題がいくつかあります。ネイティブのライブラリを使用できる場合は、サードパーティの再パッケージ化されたライブラリを決して使用しないという原則に従います。私はずっと、ネイティブ WeChat アプレットの開発に redux を統合したいと思っていました。 解決すべき問題1. reduxライブラリへのアクセス reduxライブラリの紹介1. redux をインストールするには、npm または yarn を使用できます。 3. エラー ReferenceError の解決方法: プロセスが redux ライブラリで定義されていません。 WeChat アプレットは npm ツールで構築されるため、構築中に nodeprocess 環境変数は導入されませんが、redux はさまざまな環境に対応する最適化を行っています。その結果、ビルドされたパッケージにはプロセス変数が不足しています。最も便利な解決策は、ビルドされたパッケージに必要なプロセスを自分で挿入することです。 これにより、基本的に、すべてのサードパーティ ライブラリで発生するプロセス パラメータの欠落の問題を解決できます。 Build npm ツールを実行するたびに手動で変更する必要がある場合。手動で変更する必要があるサードパーティライブラリが複数ある場合は面倒です。そのため、動的な変更を完了し、人件費を節約するためには、スクリプトやASTツリーなどのツールを使用する必要があります(これについては後で紹介します) まとめると、redux の導入は完了です。 プロジェクトにreduxを追加する1. ストアの作成 異なるエンティティをマージするには combineReducers を使用し、ストア エンティティを作成するには createStore を使用し、エクスポートします。データの統一性を保つために、Redux の原則では、プロジェクトは 1 つのストアのみを初期化し、後続の操作は現在生成されているストアで実行されます。 データ エンティティをマージします。 const { combineReducers } = require('redux'); const testItem = require('./testItem/index'); const testItem2 = require('./testItem2/index'); 定数user = require('./user/index'); 定数リデューサー = 結合リデューサー({ テスト項目: テスト項目.テスト項目、 テスト項目2、 ユーザー }); モジュール.エクスポート = { 減速機 } ストアをエクスポートします: const { createStore、applyMiddleware } = require('redux'); const { リデューサー } = require('./reducers'); const { logger } = require('redux-logger'); const ストア = createStore( 減速機、 ミドルウェアを適用(ロガー) ) モジュール.エクスポート = { 店 } 2. グローバルメンテナンスストア ここでの使用法は react の場合とは異なります。 WeChatアプレットにはストアをグローバルに維持するための対応するコントロールがないため、私のアプローチはapp.jsのglobalDataで直接維持し、各ページが直接ストアを取得できるようにすることです。 const { store } = require('./redux/index'); //アプリ.js アプリ({ グローバルデータ: { $store: ストア、 getState: ()=> store.getState(), } }) 接続方法をシミュレートするReactでは、connectメソッドは高階コンポーネントを通じて実装されますが、このメソッドはWeChatアプレットには適用できません。幸いなことに、redux はストア内のデータの変更を監視するための subscribe メソッドを提供します。最初の設計は次のようになります。 ページW.js: const { store } = require('../redux/index'); const initPage = (params = {}, connect = []) => { 定数{ onLoad = ()=>{}, onShow = ()=>{}, 非表示 = ()=>{}, onUnload = ()=>{}, データ = {} } = パラメータ; 定数newPage = { ...パラメータ、 //---------------- OnLoad(...p) { onLoad.bind(this)(...p); }, OnShow(...p) { onShow.bind(this)(...p); }, OnHide(...p) { onHide.bind(this)(...p); }, アンロード時(...p) { onUnload.bind(this)(...p); }, //---------------- // リスナーをクリアする clearStoreSubscribe() { (this.storeSubscribe)の場合{ this.storeSubscribe(); this.storeSubscribe = 未定義; } }, // reduxでデータを取得する 新しいデータを取得する() { 定数 newItems = {}; 定数状態 = this.$store.getState(); (接続) の場合 Array.isArray(connect) の場合 { connect.forEach((キー) => { 定数値 = 状態[キー]; if (値 && this.data[キー] !== 値) { newItems[キー] = 値 } }) } そうでない場合 (typeof connect === 'function') { const リスト = connect(状態) || {}; Object.keys(リスト).forEach((キー) => { const 値 = リスト[キー]; if (値 && this.data[キー] !== 値) { newItems[キー] = 値 } }) } } 新しいアイテムを返します。 }, // Reduxの変更をリッスンする handleReduxChange() { this.setData({ ...this.getNewData()、 }); }, //---------------- データ: { ...データ }, onLoad(...p) { const アプリ = getApp() this.$store = app.globalData.$store; this.setData({ ...this.getNewData()、 }); this.OnLoad(...p); this._isOnLoad = true; }, onShow (...p) { (!this.storeSubscribe)の場合{ this.storeSubscribe = this.$store.subscribe(()=>this.handleReduxChange()); } (!this._isOnLoad)の場合{ this.setData({ ...this.getNewData()、 }); } this.OnShow(...p); this._isOnLoad = false; }, onHide(...p) { this.OnHide(...p); this.clearStoreSubscribe(); }, onUnload(...p) { this.OnUnload(...p); this.clearStoreSubscribe(); }, //---------------- ディスパッチ(...p) { もし(this.$store){ this.$store.dispatch(...p) を返します。 } } } 新しいページを返します。 } const PageW = (params = {}, mapState = [], mapDispatch = ()=>{}) => { const ページ = initPage({...params}, mapState); ディスパッチリストをマップストアに格納します。 page.mapDispatch = { ...ディスパッチリスト }; Page(ページ)を返します。 } モジュールをエクスポートします。 PageW の主な考慮事項と欠陥は次のとおりです。 テストページ: 2つのデータ項目testItemとtestItem2をインポートし、add2というメソッドをインポートしました。 PageW は '../../pageW/index' を必要とします。 const { ActionsFun } = require('../../redux/testItem/actions'); 定数ページ = { データ: { 4 : 4月 }, オンロード() { console.log('sub onLoad'); }, オンショー() { }, トテスト() { コンソールにログ出力します。 wx.navigateTo({ URL: '/pages/test/index' }) }, ボタン1() { コンソールにログ出力します。 this.mapDispatch.add2(); }, ボタン2() { 定数 wwj は this.data です。 this.setData({ wwj: wwj + 2 }); }, } const mapState = [ 'testItem', 'testItem2' ]; const mapDispatch = ({dispatch}) => { 戻る { add2: (params) => ディスパッチ(ActionsFun.add(params)) } } PageW(ページ、マップ状態、マップディスパッチ); ネイティブ WeChat アプレットの開発における redux の詳細な使用に関するこの記事はこれで終わりです。アプレットでの redux の使用に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。皆様が今後も 123WORDPRESS.COM を応援してくれることを願っています。 以下もご興味があるかもしれません:
|
<<: Ubuntu 16.04 にソースコードから Mininet をインストールする
>>: WindowsでMysql5.7.17のインストールと起動に失敗する問題を解決する
MySQL でサポートされている浮動小数点型は、 FLOAT 、 DOUBLE 、およびDECIMA...
1 Dockerサービスを開始するまず、docker サービスを開始する方法を知っておく必要がありま...
目次1. テレポートの使用2. モーダルダイアログコンポーネントを完成させる3. コンポーネントのレ...
Samba サービスでも NFS サービスでも、サーバーの起動時にリモート共有リソースが自動的にマ...
質問から始めましょう5 年前、私が Tencent にいたとき、ページング シナリオでは MySQL...
MultiTail は、tail コマンド機能と同様に、複数のドキュメントを同時に監視するために使用...
注1: MySQLデータベースへの接続が遅い問題を解決するvim /etc/my.cnfコンテン...
Vue ルーター トランジションは、Vue プログラムにパーソナライズされたエフェクトをすばやく簡単...
ユーザーが初めて MySQL データベースをインストールするとき、初期のルート パスワードを変更する...
1. これは理解するのが少し複雑なので、原理を注意深く読んで自分で入力していただければ幸いです。 &...
質問: div+css と配置を使用して角丸四角形を実現するにはどうすればよいですか?ソリューション...
目次1. 解体のヒント2. デジタルセパレーター3. try...catch...finally が...
序文Linux グループは、Linux でユーザー アカウントを管理するために使用される組織単位です...
序文ブラウザをどのようにズームしても、ボックス コンテナーの高さを常に 100% に保つ必要がある場...
Centos8仮想マシンを起動し、上下キーを押して図1のインターフェースの最初の行を選択します。図1...