解決すべき問題主にコンポーネント間のクロスレベル通信用 なぜディスパッチとブロードキャストを自分で実装する必要があるのでしょうか?独立したコンポーネントやライブラリを開発する場合、サードパーティのライブラリに依存しないのが最善です。 provide と inject を使用しないのはなぜですか?使用シナリオは主にサブコンポーネントが親コンポーネントのステータスを取得するためであるため、クロスレベルコンポーネント間でアクティブなプロビジョニングと依存性注入の関係が確立されます。 コードは次のとおりです。 エミッター 関数ブロードキャスト(コンポーネント名、イベント名、パラメータ) { this.$children.forEach(child => { 定数名 = 子.$options.name; if (名前 === コンポーネント名) { child.$emit.apply(child, [イベント名].concat(params)); } それ以外 { // todo paramsが空の配列の場合、undefinedが返されます ブロードキャスト.apply(child、[コンポーネント名、イベント名].concat([パラメータ])); } }); } エクスポートデフォルト{ メソッド: { ディスパッチ(コンポーネント名、イベント名、パラメータ) { 親を this.$parent || this.$root とします。 name = parent.$options.name とします。 while (親 && (!名前 || 名前 !== コンポーネント名)) { 親 = 親.$parent; (親)の場合{ 名前 = 親.$options.name; } } (親)の場合{ 親.$emit.apply(親、[イベント名].concat(params)); } }, ブロードキャスト(コンポーネント名、イベント名、パラメータ) { ブロードキャスト.call(this、コンポーネント名、イベント名、パラメーター); } } }; 親.vue <テンプレート> <div> <h1>私は親コンポーネントです</h1> <button @click="handleClick">イベントをトリガー</button> <child /> </div> </テンプレート> <スクリプト> 「@/mixins/emitter.js」からエミッターをインポートします。 「./child」から子をインポートします。 エクスポートデフォルト{ 名前: "コンポーネントA", ミックスイン: [エミッター], 作成された() { this.$on("child-to-p", this.handleChild); }, メソッド: { ハンドルクリック() { this.broadcast("componentB", "on-message", "Hello Vue.js"); }, ハンドルChild(val) { アラート(val); } }, コンポーネント: 子供 } }; </スクリプト> 子.vue <テンプレート> <div>私は子コンポーネントです</div> </テンプレート> <スクリプト> 「@/mixins/emitter.js」からエミッターをインポートします。 エクスポートデフォルト{ 名前: "コンポーネントB", ミックスイン: [エミッター], 作成された() { this.$on("on-message", this.showMessage); this.dispatch("componentA", "child-to-p", "hello parent"); }, メソッド: { メッセージを表示(テキスト) { ウィンドウのアラート(テキスト); } } }; </スクリプト> このようにして、クロスレベル コンポーネントのカスタム通信を実現できます。ただし、1 つ問題があります。サブスクリプションはパブリッシュより前に行う必要があります。つまり、オンはエミットより前に行う必要があります。 親子コンポーネントのレンダリング順序、インスタンスの作成順序子コンポーネントは親コンポーネントの前にレンダリングされるため、子コンポーネントのマウント イベントがディスパッチされても、親コンポーネントのマウントでは聞くことができません。 Vue の独自実装によるディスパッチとブロードキャスト (dispatch and broadcast) に関する記事はこれで終了です。Vue のディスパッチとブロードキャストに関するより関連性の高い内容については、123WORDPRESS.COM の過去記事を検索するか、引き続き以下の関連記事を閲覧してください。皆様、今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: MySQL 5.7 でルートパスワードを変更する方法
>>: Linux で MongoDB のリモート自動バックアップを実装する方法
目次1. ストアド関数を作成する2. ストアド関数の呼び出し3. 保存された関数を削除する4. スト...
縦型テーブル垂直テーブル分割とは、多数の列を持つテーブルを複数のテーブルに分割することを意味します。...
今日、問題が発生しました。ブラウザのアドレスバーにURLアドレスを入力する際、ページを正常にアクセス...
Apollo オープンソース アドレス: https://github.com/ctripcorp/...
目次環境CentOSをインストールするyum 国内ミラーソースを構成するサードパーティの依存関係をイ...
メタ タグは、ファイル情報を定義し、検索エンジンによる検索を容易にするために Web ページ ファイ...
今日は、ネイティブ JS で実装された画像マーキー効果を紹介します。効果は次のとおりです。 実装され...
この実験のテスト環境: Windows 10+cmd+MySQL5.6.36+InnoDB 1. ト...
以下は、純粋な CSS で記述された画像マウスホバーズーム効果です。実際、基本原理は非常に単純です。...
目次データブローカーとイベントObject.defineProperty メソッドのレビューデータブ...
分割線はウェブページでよく使われるデザインです。例えば、Zhihuのその他の回答をご覧ください。 こ...
インストールREADMEに従ってインストールしてくださいドキュメントには、exa は Rust で実...
目次序文1. エンドポイント2. 接続ハンドラ3. コヨーテ4. コンテナ責任チェーンパターン序文T...
UDP の理論については詳しく説明しません。UDP に関する HelloWorld プログラムを紹介...
前回のエピソードレビュー:昨日は、ページがさまざまなデバイス サイズにどのように対応するかについて説...