Vue における属性とプロパティの具体的な使用法と違い

Vue における属性とプロパティの具体的な使用法と違い

Vue.jsにおける属性とプロパティ値および関連する処理として

属性とプロパティは、Web開発において混同されやすい概念です。値に関しては、その特殊性からさらに混同されやすいです。この記事では、それらを整理して説明しようとします。

属性とプロパティの概念

簡単に言うと、属性は要素タグの属性であり、プロパティは要素オブジェクトの属性です。次に例を示します。

<input id="入力" value="テスト値">
<スクリプト>
入力を document.getElementById('input') にします。
console.log(input.getAttribute('value')); // テスト値
console.log(input.value); // テスト値
</スクリプト>
  • 入力の値属性はタグ内の value="test value" で定義され、input.getAttribute('value') で取得し、input.setAttribute('value', 'New Value') で更新できます。
  • input の value プロパティは、input.value を通じて取得および更新できます。初期値は、属性に割り当てられた値と一致します。

属性とプロパティのバインディング

最初に属性値を更新すると、プロパティ値も変更されます。

ただし、プロパティ値を更新した場合 (テキスト ボックスに入力するか、input.value に新しい値を割り当てた場合)、属性の値は変更されません。さらに、このアニメーションに示すように、属性の値を再度更新しても、プロパティの値は変更されません。このページにアクセスして操作を試すこともできます。

これは、実際にはダーティ値フラグが機能している状態です。ダーティ値フラグの初期値は false です。つまり、属性値を更新すると、対応するプロパティ値がデフォルトで変更されます。ただし、ユーザーがプロパティ値を操作すると、ダーティ値フラグの値は true になり、属性値を更新しても対応するプロパティ値は変更されません。

したがって、実際のプロジェクトでは、通常、プロパティの価値を扱います。

Vue.js の値の処理

一般的に使用される値:

Vue.jsのv-bindは通常、属性を処理します。プロパティとして処理したい場合は、.propを追加する必要があります。

ただし、v-bind:value は通常、プロパティ値が強制的に変換されるため、デフォルトで処理されます。例:

<input id="入力" :value="'テスト値'" >
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<スクリプト>
入力 = new Vue({
  el: '#入力',
  マウントされた(){
    console.log(this.$el.getAttribute('value')); // null
    console.log(this.$el.value); // テスト値
    console.log(this._vnode.data) // {attrs: {id: "input"}, domProps: {value: "テスト値"}}
  }
});
</スクリプト>

Vue.js は、attrs の属性ではなく、VNode のデータ内の domProps の属性として value を使用しているため、マウント後はプロパティの値になることがわかります。

Vue.js のソースコードでは、強制変換プロパティは次のように処理されます。

// src/compiler/parser/index.js
関数 processAttrs(el) {
...
        if ((修飾子 && modifiers.prop) || (
          !el.component && platformMustUseProp(el.tag, el.attrsMap.type, name)
        )) {
          addProp(el, 名前, 値, リスト[i], isDynamic)
        } それ以外 {
          addAttr(el, 名前, 値, リスト[i], isDynamic)
        }

Web プラットフォームにおける platformMustUseProp の定義は次のとおりです。

// src/platforms/web/util/attrs.js
const acceptValue = makeMap('入力,テキストエリア,オプション,選択,進行状況')
エクスポート const mustUseProp = (タグ: 文字列、型: ?文字列、属性: 文字列): boolean => {
  戻る (
    (attr === 'value' && acceptValue(tag)) && type !== 'button' ||
    (属性 === '選択' && タグ === 'オプション') ||
    (属性 === 'チェック済み' && タグ === '入力') ||
    (属性 === 'ミュート' && タグ === 'ビデオ')
  )
}

上記のように、ボタンではない input、textarea、option、select、progress の値は強制的にプロパティになり、value.prop に設定する必要はありません。

たとえば、textareaタグ自体はvalue属性をサポートしていないため、次のコードの値は複数行テキストボックスには表示されません。

<textarea value="テスト値"></textarea>

しかし、Vue.js では、次のコードを value プロパティに正常にバインドし、複数行のテキスト ボックス内に表示できます。

<textarea :value="'テスト値'"></textarea>

特殊なケースの使用: value.prop

上記のVue.jsソースコードについて注意すべきもう1つの点は、プロパティとして強制される場合は、!el.componentも満たす必要があるということです。つまり、動的コンポーネントではないということです。動的コンポーネントのel.componentの値は、そのis属性の値であるためです。

つまり、動的コンポーネントの v-bind はデフォルトで属性として使用されます。プロパティとして使用したい場合は、次のように .prop を使用する必要があります。

<div id="アプリ">
  <component :is="要素" :value.prop="'テスト値'"></component>
  <button @click="change">変更</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<スクリプト>
アプリを新しいVue({
  el: '#app',
  データ: {
    要素: '入力'
  },
  メソッド: {
    変化 () {
      this.element = 'input' === this.element ? 'textarea' : 'input';
    }
  }
});
</スクリプト>

上記コンポーネントの :value.prop の .prop を削除して textarea に切り替えると、その値は複数行テキスト ボックスに表示されなくなります。このページのスイッチ ラベルをクリックすると表示できます。

要約する

  • ユーザーが操作して値を更新すると、属性とプロパティ値間のバインディング関係は無効になります。
  • Vue.jsは一般的に、値をプロパティにするためにvalueを使用します。
  • Vue.jsの動的テンプレートでは、value.propを使用して値をプロパティにする必要があります。

Vue における属性とプロパティの具体的な使い方と違いについての記事はこれで終わりです。Vue の属性プロパティに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • vue-property-decoratorマニュアルの詳細な説明
  • VueはObject.definePropertyを使用して簡単な双方向バインディングの例を記述します。
  • vue-property-decorator の使い方の詳細な説明
  • Vue.jsはObject.definePropertyを使用して双方向バインディングを実装します。
  • Vue ソースコード学習 Object.defineProperty 配列監視
  • Vue の defineProperty と Proxy の違いの詳細な説明
  • Vue ソースコード学習 Object.defineProperty オブジェクトプロパティ監視
  • Vue.jsはdefinePropertyを使用してデータの双方向バインディングを実装します

<<:  2 つの MySQL ユーザー削除ステートメント (delete user と drop user) の違い

>>:  SNMP4J サーバー接続タイムアウト問題の解決策

推薦する

Vue+ElementUI で超大規模なフォーム例を処理する方法

最近、社内の業務調整により、以前の超長文のロジックが大幅に変更されたため、リファクタリングする予定で...

Spring Boot 2.4 の新機能、ワンクリックビルド、Docker イメージプロセスの詳細説明

背景開発プロセス中に Docker コンテナ化をサポートするために、通常は Maven を使用してコ...

MySQL 独立インデックスと共同インデックスの選択

複数列のインデックスについては、理解が不足していることがよくあります。よくある間違いは、多数の列に独...

Vueはechartsを使用して組織図を描画します

昨日、円形のプログレスバー (Vue 円形プログレスバーを参照してください) についてブログを書きま...

Linux で最も頻繁に使用されるターミナル コマンドのトップ 10 のリストを取得します。

私が最も頻繁に使用するコマンドは次の通りです:選択肢CDギットls ssh須藤数週間前、私はこの R...

CSS 要素を表示および非表示にする 9 つの方法

Web ページの制作では、要素の表示と非表示は非常に一般的な要件です。この記事では、要素を表示したり...

MySQLユーザー権限テーブルについての簡単な説明

MySQL はインストール時に自動的に mysql という名前のデータベースを作成します。mysql...

Dockerコンテナを介してランプアーキテクチャを構築するプロセス

目次1. Centosイメージを取得する2. nginxイメージをビルドする3. MySQLイメージ...

linuxdeployqt を使用して Ubuntu で Qt プログラムをパッケージ化する問題を解決する

いくつかの Qt インターフェース プログラムを作成しましたが、Qt 環境がインストールされていない...

1つのコマンドで、シェルの読み取りコマンドの共通パラメータを理解できます。

Shell で受信パラメータを受信する方法は 2 つあることがわかっています。 1 つはスクリプト...

ウェブデザインと制作に関する科学的原則と提案の要約

<br />ネットワーク設計の分野では、アイトラッキングに関する研究が非常に盛んに行われ...

Nginx で複数のドメイン名がドメインをまたいでアクセスできるようにマップを使用する方法

一般的なNginx構成ではクロスドメインが可能 サーバー{ 11111 を聞いてください。 serv...

WeChat アプレットのシンプルなログイン ページの実装 (ソース コード付き)

目次1. 上の写真2. ユーザーが存在しない3. コードをアップロードする1. 上の写真 2. ユー...

Vue ページでよりエレガントに画像を紹介する方法

目次エラーのデモンストレーション計算により画像が変わらない場合は直接インポートするCSS変数による画...

JSは文字列内の指定された文字列のn番目の出現位置を取得します

文字の位置を取得するための同様の方法について学習します。 charAt() 文字列内の指定された位置...