vue3 コンポーネントでの v-model の使用と詳細な説明

vue3 コンポーネントでの v-model の使用と詳細な説明

v-model 入力で双方向バインディングデータを使用する

Vue では、入力ボックスの入力値をバインドするために v-model をよく使用します。v-bind を介して値をバインドし、@input 入力イベントと組み合わせてバインドされた値を動的に変更して双方向バインディングを実現するというシンプルな実装原理は、誰もが知っているはずです。以下は、Vue3 の実装コードです。

<テンプレート>
   <input type="text" :value="tryText" @input="handelInput">
   <h2>{{tryText}}</h2>
</テンプレート>

<スクリプト>
「vue」から{ref}をインポートします
    エクスポートデフォルト{
        設定(){
            let tryText = ref("デフォルトの入力値")
            関数handelInput(e) {
                tryText.value = e.target.value; //ref で定義されたデータアクセスと変更は .value を通じて行う必要があります
            }
            戻る {
                テキストを試す、
                ハンドル入力
            }
        }
    }
</スクリプト>

皆さんは ipnut で v-model をよく使用していると思います。では、コンポーネントで v-model を使用する方法とその役割について見ていきましょう。

コンポーネント内の v-model

コンポーネントで v-model を使用するにはどうすればいいですか?簡単に実装してみましょう

親コンポーネント

<テンプレート>
  <!-- コンポーネントバインディング v-model -->
  <hy-input v-model="メッセージ"></hy-input>
  <h2>{{メッセージ}}</h2>
</テンプレート>

<スクリプト>
'@vue/reactivity' から { ref } をインポートします。
HyInput を "../components/HyInput.vue" からインポートします。
エクスポートデフォルト{
  コンポーネント: {HyInput },
    設定(){
        let message = ref("嘿嘿嘿ヽ(*^ー^)(^ー^*)ノ")
        戻る {
            メッセージ、
        }
    }
}
</スクリプト>

サブコンポーネント

<テンプレート>
   <button @click="handelClick">O(∩_∩)O ハハハ〜</button>
   <br>
</テンプレート>

<スクリプト>
    エクスポートデフォルト{
        小道具:{
            モデル値:文字列、
        },
        出力:['update:modelValue'],
        セットアップ(プロパティ、コンテキスト){
            関数handelClick() {
                context.emit("update:modelValue","O(∩_∩)O哈哈~")
            }
        
            戻る {
                ハンドルクリック、
            }
        }
    }
</スクリプト>

これを見ると、なぜイベントを開催する必要があるのか​​疑問に思うかもしれません。デフォルトのプロパティ受信値が存在するのはなぜですか?心配しないでください。実装原理から理解できます。

このように、子コンポーネントのボタンをクリックすることで、親コンポーネントのメッセージ データを変更できます。これは、コンポーネント内の双方向データ バインディング v-model の簡単な実装です。

双方向バインディングなので、入力における実装原理と似ているのではないかと大胆に推測してみましょう。どのように動作するか見てみましょう。

親コンポーネント

<テンプレート>
  <!-- 原則 -->
  <hy-input :modelValue="メッセージ" @update:modelValue="メッセージ = $event"></hy-input>
  <h2>{{メッセージ}}</h2>
</テンプレート>

<スクリプト>
'@vue/reactivity' から { ref } をインポートします。
HyInput を "../components/HyInput.vue" からインポートします。
エクスポートデフォルト{
  コンポーネント: {HyInput },
    設定(){
        let message = ref("嘿嘿嘿ヽ(*^ー^)(^ー^*)ノ")
        戻る {
            メッセージ、
        }
    }
}
</スクリプト>

サブコンポーネントは変更されません

<テンプレート>
   <button @click="handelClick">O(∩_∩)O ハハハ〜</button>
   <br>
</テンプレート>

<スクリプト>
    エクスポートデフォルト{
        小道具:{
            モデル値:文字列、
        },
        出力:['update:modelValue'],
        セットアップ(プロパティ、コンテキスト){
            関数handelClick() {
                context.emit("update:modelValue","O(∩_∩)O哈哈~")
            }
        
            戻る {
                ハンドルクリック、
            }
        }
    }
</スクリプト>

結果はそれが確かに可能であることを示している

このようにして、子コンポーネントでの発行イベントとデフォルトの受信値を理解できます。基本的な実装原則は、親コンポーネントが子コンポーネントに値を渡し、子コンポーネントが props を通じて値を受け取るというものです。ただし、子コンポーネントでデータを変更する必要がある場合は、イベントを発行して親コンポーネントに通知し、親コンポーネントは渡された値を受け取って変更します。実際には、親コンポーネントと子コンポーネント間の通信ですが、Vue は単純なカプセル化を行うのに役立ちます。

ps: デフォルトでは、v-model にバインドされたデータは、エミッション イベントを受け取るために modelValue を使用してサブコンポーネントで読み取る必要があります。デフォルトの名前は update:modelValue です。複数の値をバインドする場合やカスタム名を使用する場合は、以下の他の記述方法を参照してください。

ps: props を変更してもデータを変更することはできません。まず、これは特に悪い開発習慣です。次に、props の特性はデータの転送のみを担当していることがわかります。props を変更しても、目的の効果は得られません。親コンポーネントにデータを更新するように通知する必要があります。これがベストプラクティスです。

他の書き方

子コンポーネントの入力と親コンポーネント間の双方向バインディングをどのように実装すればよいでしょうか?複数の双方向バインディングデータを渡す必要がある場合はどうすればよいでしょうか?カスタム名はどうですか?
親コンポーネント

<テンプレート>
  <!-- コンポーネントバインディング v-model -->
  <hy-input v-model="メッセージ" v-model:text="入力テキスト"></hy-input>
  <h2>{{メッセージ}}</h2>
  <h2>{{入力テキスト}}</h2>
</テンプレート>

<スクリプト>
'@vue/reactivity' から { ref } をインポートします。
HyInput を "../components/HyInput.vue" からインポートします。
エクスポートデフォルト{
  コンポーネント: {HyInput },
    設定(){
        let message = ref("嘿嘿嘿ヽ(*^ー^)(^ー^*)ノ")
        inputText = ref("嘻嘻嘻嘻") とします
  
        戻る {
            メッセージ、
            入力テキスト
        }
    }
}
</スクリプト>

サブコンポーネント

<テンプレート>
   <button @click="handelClick">O(∩_∩)O ハハハ〜</button>
   <br>
   <input type="text" v-model="customText">
   <br>
</テンプレート>

<スクリプト>
「vue」から {computed} をインポートします
    エクスポートデフォルト{
        小道具:{
            モデル値:文字列、
            テキスト:文字列
        },
        出力:['update:modelValue',"update:text"],
        セットアップ(プロパティ、コンテキスト){
            関数handelClick() {
                context.emit("update:modelValue","O(∩_∩)O哈哈~")
            }
            カスタムテキストを計算({
                設定(値){
                    context.emit("更新:テキスト",値)
                },
                得る(){
                    props.textを返す
                }
            })

            戻る {
                ハンドルクリック、
                カスタムテキスト、
            }
        }
    }
</スクリプト>

複数のバインディング値と名前の変更 v-model:text="inputText" サブコンポーネント内のプロパティは直接テキストです 発行イベント名は update:text です
ここで、子コンポーネントの入力ボックス v-model と親コンポーネントの双方向バインディングを実現するには、計算プロパティを使用する必要があることがわかります。生徒の中には、props 内のテキストを直接バインドしたい人もいるかもしれませんね。前述のように、読み取りのみの場合はバインドできますが、変更する場合は、イベントを発行して親コンポーネントにデータの更新を通知する必要があります (props の値を変更することはできません。読み取りのみ可能です!!!)。そのため、計算プロパティでは、セットでイベントを発行して親コンポーネントのデータを更新し、読み取り時には props の値を直接読み取ります。

要約する

vue3 コンポーネントにおける v-model の使用と説明に関するこの記事はこれで終わりです。より関連性の高い vue3 コンポーネントの v-model 使用コンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • v-model 双方向バインディングデータを実装する vue カスタム コンポーネントのサンプル コード
  • Vue の v-model ディレクティブと .sync 修飾子の違いの詳細な説明
  • Vue の双方向イベントバインディング v-model の原理についての簡単な説明
  • Vueはv-modelを使用してel-paginationコンポーネントのプロセス全体をカプセル化します。
  • Vue における v-model を使用したクロスコンポーネントバインディングの基本的な実装方法
  • Vue で親子コンポーネントの値を双方向バインドするために v-model を使用するときに発生する問題と解決策
  • Vue フォーム入力ボックスがフォーカスおよびぼかしイベントをサポートしていない問題の解決策
  • カスタムイベントを使用した Vue のフォーム入力コンポーネントの詳細な使用方法 [日付コンポーネントと通貨コンポーネント]
  • Vue フォーム入力バインディングのサンプルコード
  • Vue フォームの入力フォーマットの中国語入力方法の異常
  • Vue フォーム入力バインディング v-model

<<:  ServerManager の起動時にデータベースに接続できないエラーを解決する方法

>>:  CentOS IP接続ネットワーク実装プロセス図

推薦する

Linuxファイルコマンドの使用

1. コマンドの紹介ファイル コマンドは、ファイルの種類を識別するために使用されます。ファイル チェ...

React Nativeでaxiosを使用してネットワークリクエストを行う方法

フロントエンド開発では、Ajax、jQuery ajax、axios、fetch など、データ要求を...

Dockerfile を使用して Docker イメージをカスタマイズする方法

Dockerfile を使用したイメージのカスタマイズイメージのカスタマイズとは、実際には各レイヤー...

フロントエンドのパフォーマンス最適化を学ぶ準備として、HTMLページのレンダリングプロセスを理解する

現在、フロントエンドのパフォーマンス最適化について学んでいます。適切な解決策を見つけ、パフォーマンス...

MySQL での数値のフォーマットの詳細な説明

最近、仕事の都合で、MySQL で数字をフォーマットする必要がありましたが、インターネット上にはほと...

Dockerfile ビルド中に発生する「/bin/sh: pip: コマンドが見つかりません」という問題の解決方法

記述した Dockerfile の内容は次のとおりです。 Python:3.6.8 から pip i...

Tomcat の構成と最適化ソリューションの詳細な説明

サービス.xml Server.xml 構成ファイルは、コンテナー全体を構成するために使用されます。...

Dockerコンテナを更新、パッケージ化、Alibaba Cloudにアップロードする方法

今回は、実行中のコンテナをイメージにパッケージ化して Alibaba Cloud にアップロードし、...

MYSQL ロック解除とロックテーブルの紹介

MySQL ロックの概要他のデータベースと比較すると、MySQL のロック メカニズムは比較的単純で...

mysql8.0.11をインストールしてrootパスワードを変更し、navicat for mysqlに接続するアイデアの詳細な説明

1.1. ダウンロード:公式ウェブサイトから zip パッケージをダウンロードします。私は 64 ビ...

MySQL テーブル結合クエリでグループ化と重複排除を実装する例

目次ビジネスロジックデータテーブル構造クエリロジックSQL スクリプトスクリプトの説明ビジネスロジッ...

Dockerを使用してブログサイトを素早く構築する方法の詳細な説明

目次1. 準備2. 展開プロセス3. アクセステストHalo は、ブログに慣れている学生に追加のオプ...

Expressを使用してプロジェクトを自動的にビルドするNode.jsのプロセス全体

1. Expressライブラリとジェネレータをインストールするcmdを開いて、次のコマンドを入力しま...

Vueはページの部分的なリフレッシュを実装します(ルータビューのページリフレッシュ)

Vue でprovide+inject組み合わせを使用するまず、App.vue を変更する必要があ...

Vue で PC アドレスをモバイル アドレスにリダイレクトする方法

要件:PC側とモバイル側は2つの独立したプロジェクトです。2つのプロジェクトの内容は基本的に同じで、...