Vue 値転送の 12 の方法の概要

Vue 値転送の 12 の方法の概要

1. 父から息子へ

(1) 親コンポーネントの子コンポーネントタグにプロパティをバインドし、転送する変数をマウントします。 (2) 子コンポーネントで props を通じてデータを受け取ります。 props は配列またはオブジェクトです。受け取ったデータはそのまま使用できます。 props: ["プロパティ名"] props:{プロパティ名: データ型}
コード例:

//親コンポーネント <テンプレート>
  <div>
    <i>親コンポーネント</i>
    <!--ページの使用法-->
    <son :data='名前'></son> 
  </div>
</テンプレート>

<スクリプト>
import son from "./son.vue"; //親コンポーネントをインポート export default {
  components: { son }, //コンポーネントを登録します name: "親コンポーネント",
  データ() {
    戻る {
      name: "Frazier", //親コンポーネントは変数を定義します};
  },
};
</スクリプト>
//サブコンポーネント <テンプレート>
  <div>{{データ}}</div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
コンポーネント: { },
  名前: 'サブコンポーネント',
  プロパティ:["データ"],
};
</スクリプト>

2. 息子から父へ

(1)親コンポーネントの子コンポーネントタグのイベントをカスタマイズし、必要なメソッドを呼び出します。
(2)子コンポーネントメソッドでは、this.$emit("event")を使用して親コンポーネントで定義されたイベントをトリガーし、パラメータの形式でデータを渡します。
コード例:

//親コンポーネント <テンプレート>
  <div>
    <i>親コンポーネント</i>
    <!--ページの使用法-->
    <son @lcclick="lcclick"></son>//イベントをカスタマイズする</div>
</テンプレート>

<スクリプト>
import son from "./son.vue"; //親コンポーネントをインポート export default {
  components: { son }, //コンポーネントを登録します name: "親コンポーネント",
  データ() {
    戻る {};
  },
  メソッド: {
    lcclick(){
      アラート('息子が父親に引き継がれる')
    }
  },
};
</スクリプト>

//サブコンポーネント <テンプレート>
  <div>
    <button @click="lcalter">クリックしてください</button>
  </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
コンポーネント: { },
  名前: 'サブコンポーネント',
  メソッド: {
    呼び出し(){
      this.$emit('lcclick')//emit を通じてイベントをトリガーします}
  },
};
</スクリプト>

3. ブラザーコンポーネント通信(バス)

(1)srcに新しいBus.jsファイルを作成し、空のvueインスタンスをエクスポートします。
(2)データ送信側にBus.jsを導入し、Bus.emit("イベント名", "パラメータ")を通じてイベントをディスパッチします。emit("イベント名", "パラメータ")によってデータがディスパッチされ、emit()のパラメータの形でデータが送信されます。
(3)データを受け取る側にBus.jsを導入し、Bus.$on("イベント名", (data) => {dataは受信したデータ}) を使用する

画像例:

ここに画像の説明を挿入

ここに画像の説明を挿入

ここに画像の説明を挿入

4. ref/refs(親子コンポーネント通信)

(1) refが通常のDOM要素で使用される場合、参照はDOM要素を指します。子コンポーネントで使用される場合、参照はコンポーネントインスタンスを指します。
(2)インスタンスを通じてコン​​ポーネントメソッドを呼び出したり、データに直接アクセスしたりすることができます。これは、子コンポーネントから親コンポーネントへの一種の値の転送とみなすこともできます。
コード例:

//親コンポーネント <テンプレート>
  <div>
    <button @click="sayHello">こんにちはと言う</button>
    <child ref="childForRef"></child>
  </div>
</テンプレート>
<スクリプト>
'./child.vue' から子をインポートします。
  エクスポートデフォルト{
    コンポーネント: { 子 },
    データ () {
      戻る {
        子参照: null、
      }
    },
    マウント() {
      this.childForRef = this.$refs.childForRef;
      コンソールにログ出力します。
    },
    メソッド: {
      こんにちは(){
        this.childForRef.sayHello()
      }
    }
  }
</スクリプト>
//サブコンポーネント <テンプレート>
  <div>お子様向けコンテンツ</div>
</テンプレート>
<スクリプト>
エクスポートデフォルト{
  データ () {
    戻る {
      名前:「私は子供です」
    }
  },
  メソッド: {
    こんにちは(){
      コンソールにログ出力します。
      アラート('hello');
    }
  }
}
</スクリプト>

5. Vuex通信

コンポーネントは、非同期操作であるアクションにディスパッチします。アクションは、論理操作を通じて状態を変更するミューテーションにコミットし、それによってコンポーネントと同期してデータ ステータスを更新します。
コード例:

//親コンポーネントテンプレート>
  <div id="アプリ">
    <子供A/>
    <子供B/>
  </div>
</テンプレート>
<スクリプト>
  import ChildA from './ChildA' // コンポーネントAをインポート import ChildB from './ChildB' // コンポーネントBをインポート export default {
    components: {ChildA, ChildB} // コンポーネントを登録する}
</スクリプト>
//サブコンポーネントA
<テンプレート>
 <div id="childA">
   <h1>私はコンポーネント A です</h1>
   <button @click="transform">クリックするとコンポーネント B がデータを受信できるようになります</button>
   <p>B がクリックされたため、メッセージが変更されました: {{BMessage}}</p>
 </div>
</テンプレート>
<スクリプト>
 エクスポートデフォルト{
   データ() {
     戻る {
       メッセージ: 「こんにちは、コンポーネント B、私はコンポーネント A です」
     }
   },
   計算: {
     Bメッセージ() {
       // ストアから取得したコンポーネント B のデータをここに保存します。 return this.$store.state.BMsg
     }
   },
   メソッド: {
     変身() {
       //receiveAMsgをトリガーし、コンポーネントAのデータをストアに保存します。this.$store.commit('receiveAMsg', {
         AMsg: this.AMessage
       })
     }
   }
 }
</スクリプト>
//サブコンポーネント B
<テンプレート>
 <div id="childB">
   <h1>私はコンポーネント B です</h1>
   <button @click="transform">クリックするとコンポーネント A がデータを受信できるようになります</button>
   <p>A をクリックすると、メッセージが変わります: {{AMessage}}</p>
 </div>
</テンプレート>

<スクリプト>
 エクスポートデフォルト{
   データ() {
     戻る {
       Bメッセージ: 「こんにちは、コンポーネントA、私はコンポーネントBです」
     }
   },
   計算: {
     メッセージ() {
       // ここでストアから取得したコンポーネント A のデータを保存します。 return this.$store.state.AMsg
     }
   },
   メソッド: {
     変身() {
       // 受信BMsgをトリガーし、コンポーネントBのデータをストアに保存します。this.$store.commit('receiveBMsg', {
         BMsg: this.BMessage
       })
     }
   }
 }
</スクリプト>

//ヴュークス
'vue' から Vue をインポートします
 'vuex' から Vuex をインポートします
 Vue.use(Vuex)
 定数状態 = {
   AMsg: ''、
   BMsg: ''
 }
 
 const 変異 = {
   受信AMsg(状態、ペイロード) {
     // コンポーネントAのデータを状態に保存する
     状態.AMsg = ペイロード.AMsg
   },
   受信BMsg(状態、ペイロード) {
     // コンポーネントBのデータを状態に保存する
     状態.BMsg = ペイロード.BMsg
   }
 }
 
 デフォルトの新しいVuex.Storeをエクスポートします({
   州、
   突然変異
 })

6. $親

Parent を使用すると、親コンポーネント インスタンスを取得できます。その後、このインスタンスを介して親コンポーネントのプロパティとメソッドにアクセスできます。また、親コンポーネント インスタンスを取得できる兄弟親もあり、その後、このインスタンスを介して親コンポーネントのプロパティとメソッドにアクセスできます。また、親コンポーネント インスタンスを取得できる兄弟親もあり、その後、このインスタンスを介して親コンポーネントのプロパティとメソッドにアクセスできます。また、ルート コンポーネント インスタンスを取得できる兄弟ルートもあります。
コード例:

// 親コンポーネントのデータを取得する this.$parent.foo

// 親コンポーネントにデータを書き込む this.$parent.foo = 2

// 親コンポーネントの計算プロパティにアクセスします this.$parent.bar

//親コンポーネントメソッド this.$parent.baz() を呼び出す

// 子コンポーネントを親コンポーネントに渡す例では、this.$parent.getNum(100) を使用して値を親コンポーネントに渡すことができます。

7.セッションストレージ値の転送

SessionStorage はブラウザのグローバル オブジェクトであり、ページが閉じられるとそこに保存されたデータはクリアされます。この機能を使用すると、すべてのページでデータのコピーを共有できます。
コード例:

// データをセッションストレージに保存する
sessionStorage.setItem('キー', '値');

// sessionStorage からデータを取得します。let data = sessionStorage.getItem('key');

// sessionStorage から保存されたデータを削除します sessionStorage.removeItem('key');

// sessionStorage から保存されたすべてのデータを削除します。sessionStorage.clear();

注: ここに保管されるのはキーと値のペアであり、文字列型のみになります。オブジェクトを保管する場合は、let objStr = JSON.stringify(obj) を使用して文字列に変換してから保管する必要があります (let obj = JSON.parse(objStr) を使用してオブジェクトに解析する場合)。
私は、sessionStorage をカプセル化し、その API を直接使用してオブジェクトを保存できるようにする good-storage というライブラリをお勧めします。

//ローカルストレージ
 ストレージ.set(キー,値) 
 ストレージ.get(キー、定義)
//セッションストレージ
 storage.session.set(キー、値)
 storage.session.get(キー、値)

8. ルーティング値

疑問符を使用して値を渡す
ページ A がページ B にジャンプする場合、 this. router .push ( ' / B ? name = danseek ' ) を使用します。ページ B は this. router.push('/B?name=danseek') を使用できます。ページ B は this.route.query.name を使用して、ページ A から渡された値を取得できます。上記の router と route の違いに注意してください。
コロンを使用して値を渡します<br /> 次のルートを構成します。

{
    パス: '/b/:name',
    名前: 'b',
    コンポーネント: () => import( '../views/B.vue')
 },

ページBでは、this.$route.params.nameを使用して、ルートによって渡された名前の値を取得できます。

親子コンポーネントを使用して値を渡す router-view自体もコンポーネントなので、親子コンポーネントを使用して値を渡し、対応する子ページにpropsを追加することもできます。タイプが更新されてもルートは更新されないため、子ページのマウントされたフックで最新のタイプ値を直接取得することはできませんが、watchが使用されます。

<ルータービュー:type="type"></ルータービュー>

// サブページのプロパティ: ['type']
時計:
       タイプ(){
           // console.log("この方法では、常に最新のデータを取得できます: type=", this.type)
       },
},

9. 祖先の孫 $attrs

通常の状況では、中間遷移として父の props を使用する必要がありますが、この方法では、父コンポーネントに親コンポーネントの業務に関係のない属性が多くなり、結合度が高くなります。$attrs の助けを借りて、簡素化することができ、祖父母も孫も変更する必要がありません。
祖先コンポーネント:

<テンプレート>
    <セクション>
        <parent name="grandParent" sex="男" age="88" hobby="code" @sayKnow="sayKnow"></parent>
    </セクション>
</テンプレート>

<スクリプト>
    './Parent' から Parent をインポートします
    エクスポートデフォルト{
        名前:「祖父母」
        コンポーネント:
          親
        },
        データ() {
            戻る {}
        },
        メソッド: {
          知っていると言う(val){
            コンソール.log(値)
          }
        },
        マウント() {
        }
    }
</スクリプト>

親コンポーネント

<テンプレート>
  <セクション>
    <p>親コンポーネントは</p>を受け取ります。
    <p>祖父の名前: {{name}}</p>
    <children v-bind="$attrs" v-on="$listeners"></children>
  </セクション>
</テンプレート>

<スクリプト>
  './Children' から Children をインポートします。

  エクスポートデフォルト{
    名前:「親」、
    コンポーネント:
      子供たち
    },
    // 親コンポーネントは名前を受け取るので、名前の値は子コンポーネントの props:['name'] には渡されません。
    データ() {
      戻る {}
    },
    メソッド: {},
    マウント() {
    }
  }
</スクリプト>

サブコンポーネント

<テンプレート>
  <セクション>
    <p>サブコンポーネントを受信しました</p>
    <p>祖父の名前: {{name}}</p>
    <p>祖父の性別: {{sex}}</p>
    <p>祖父の年齢: {{age}}</p>
    <p>祖父の趣味: {{hobby}}</p>

    <button @click="sayKnow">わかっています</button>
  </セクション>
</テンプレート>

<スクリプト>
  エクスポートデフォルト{
    名前:「子供」、
    コンポーネント: {},
    // 親コンポーネントは name 属性を受け取っているため、子コンポーネントには name は渡されません props:['sex','age','hobby','name'],
    データ() {
      戻る {}
    },
    メソッド: {
      知っている(){
        this.$emit('sayKnow','私は知っている')
      }
    },
    マウント() {
    }
  }
</スクリプト>

10. Sun Chuanzuは$listenersを使用する

9番目と同じ

祖先コンポーネント

<テンプレート>
  <div id="アプリ">
    <children-one @eventOne="eventOne"></children-one>
    {{メッセージ}}
  </div>
</テンプレート>
<スクリプト>
'../src/components/children.vue' から ChildrenOne をインポートします。
エクスポートデフォルト{
  名前: 'アプリ'、
  コンポーネント:
    チルドレンワン、
  },
  データ() {
    戻る {
      メッセージ: ''
    }
  },
  メソッド: {
    イベントOne(値) {
      this.msg = 値
    }
  }
}
</スクリプト>

親コンポーネント

<テンプレート>
  <div>
    <children-two v-on="$listeners"></children-two>
  </div>
</テンプレート>

<スクリプト>
'./childrenTwo.vue' から ChildrenTwo をインポートします。

エクスポートデフォルト{
  名前: 'childrenOne',
  コンポーネント:
    子供2人
  }
}
</スクリプト>

サブコンポーネント

<テンプレート>
  <div>
    <button @click="setMsg">クリックして祖父に渡す</button>
  </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
  名前: 「子供」
  メソッド: {
    setMsg() {
      this.$emit('eventOne', '123')
    }
  }
}
</スクリプト>

11. Promiseパラメータの受け渡し

プロミス解決で複数のパラメータを渡す方法

//この使用法と似ていますが、実際には最後の2つのパラメータは取得できません。promise = new Promise((resolve,reject)=>{
    a = 1とする
    b = 2とする
    c = 3とする
    解決(a,b,c) 
})
promise.then((a,b,c)=>{
    コンソールログ(a,b,c)
})

resolve() は 1 つのパラメータのみを受け入れて処理することができ、余分なパラメータは無視されます。
複数必要な場合は、配列またはオブジェクトを使用します。 。
配列

プロミス = 新しいプロミス((解決、拒否)=>{
    解決([1,2,3]) 
})
promise.then((arr)=>{
    コンソールログ(arr[0],arr[1],arr[2])
})

物体

プロミス = 新しいプロミス((解決、拒否)=>{
    解決({a:1,b:2,c:3}) 
})
promise.then(obj=>{
    コンソールログ(obj.a、obj.b、obj.c)
})

12. グローバル変数

グローバル変数を定義し、値を持つコンポーネントに直接値を代入し、必要なコンポーネントで直接使用します。詳細については私のブログを参照してください。
ブログリンクのグローバル変数をクリックするだけです

これで、Vue 値転送の 12 の方法についての記事は終了です。Vue 値転送の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue におけるいくつかの値転送方法 (3 種類)
  • Vueコンポーネントが相互に値を転送する方法の詳細な説明
  • Vueデータ割り当て問題の解決
  • Vue における値の受け渡しと割り当ての問題

<<:  Linux におけるシステム入出力管理の詳細な説明

>>:  RedHat 6.5/CentOS 6.5 に MySQL 5.7.20 をインストールするための詳細なチュートリアル

推薦する

JavaScript のよりエレガントなエラー処理方法 async await

目次背景なぜエラー処理が必要なのでしょうか? async await より適切なエラー処理まとめ要約...

shtmlとhtmlの違い

Shtml と asp は似ています。shtml という名前のファイルでは、asp の命令と同様に、...

jQuery を使用してカルーセル効果を実装する

本日ご紹介するのは、jQuery を使用してシンプルなカルーセルを実装する方法です。実装の原則は次の...

HTMLでvueとel​​ement-uiを直接参照する方法

コードは次のようになります。 <!DOCTYPE html> <html> ...

MySQLは2つの日付間の日数、月数、年数を計算します

MySQL 組み込みの日付関数 TIMESTAMPDIFF は、2 つの日付間の秒数、分数、時間数、...

Vue開発の一般的な手法の詳細な説明

目次$nextTick() $forceUpdate() $セット() .sync——2.3.0 以...

vue3ソースコード解析の簡単な実装方法

目次序文🍹準備🍲vue3 の使い方🍖 実装要約する序文最近、私の最初の公式 vue3 + ts プロ...

Dockerコンテナを停止および削除できない問題の解決策

実行中のコンテナIDを見つける ドッカーps上記のコンテナの物理的な場所を見つける /var/lib...

Nginx のパフォーマンスを向上させるための提案

Web アプリケーションが 1 台のマシンでのみ実行される場合、パフォーマンスを向上させるのは非常に...

MySQL インデックスクエリ最適化スキルを習得するための記事

序文この記事では、DBA がいないチームが参考にできるように、MySQL の一般的な使用に関するヒン...

体験をデザインする: ボタンには何があるか

<br />最近、UCDChina は「インターフェース上のテキストに注意を払う」という...

Ubuntu 向け VMware Tools のインストールと構成のチュートリアル

以前、ブロガーは VMware 仮想マシンに Ubuntu システムをインストールしました。まだイン...

Tomcat 初回展開 Web プロジェクト プロセス図

独自のWebプロジェクトをtomcatディレクトリの下のwebappsディレクトリに配置します。 R...

圧縮パッケージを使用して Linux 環境に JDK 13 をインストールする方法

JDK とは何ですか?まあ、この質問がわからないのであれば、なぜこれをインストールするのか本当にわか...

HTMLページの読み込み速度を上げる方法

(1)HTTPリクエストを減らす。 (リソース ファイルをマージし、イメージ スプライトを使用します...