Vue.jsにおける属性とプロパティ値および関連する処理として属性とプロパティは、Web開発において混同されやすい概念です。値に関しては、その特殊性からさらに混同されやすいです。この記事では、それらを整理して説明しようとします。 属性とプロパティの概念簡単に言うと、属性は要素タグの属性であり、プロパティは要素オブジェクトの属性です。次に例を示します。 <input id="入力" value="テスト値"> <スクリプト> 入力を document.getElementById('input') にします。 console.log(input.getAttribute('value')); // テスト値 console.log(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 における属性とプロパティの具体的な使い方と違いについての記事はこれで終わりです。Vue の属性プロパティに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: 2 つの MySQL ユーザー削除ステートメント (delete user と drop user) の違い
最近、社内の業務調整により、以前の超長文のロジックが大幅に変更されたため、リファクタリングする予定で...
背景開発プロセス中に Docker コンテナ化をサポートするために、通常は Maven を使用してコ...
複数列のインデックスについては、理解が不足していることがよくあります。よくある間違いは、多数の列に独...
昨日、円形のプログレスバー (Vue 円形プログレスバーを参照してください) についてブログを書きま...
私が最も頻繁に使用するコマンドは次の通りです:選択肢CDギットls ssh須藤数週間前、私はこの R...
Web ページの制作では、要素の表示と非表示は非常に一般的な要件です。この記事では、要素を表示したり...
MySQL はインストール時に自動的に mysql という名前のデータベースを作成します。mysql...
目次1. Centosイメージを取得する2. nginxイメージをビルドする3. MySQLイメージ...
いくつかの Qt インターフェース プログラムを作成しましたが、Qt 環境がインストールされていない...
Shell で受信パラメータを受信する方法は 2 つあることがわかっています。 1 つはスクリプト...
<br />ネットワーク設計の分野では、アイトラッキングに関する研究が非常に盛んに行われ...
一般的なNginx構成ではクロスドメインが可能 サーバー{ 11111 を聞いてください。 serv...
目次1. 上の写真2. ユーザーが存在しない3. コードをアップロードする1. 上の写真 2. ユー...
目次エラーのデモンストレーション計算により画像が変わらない場合は直接インポートするCSS変数による画...
文字の位置を取得するための同様の方法について学習します。 charAt() 文字列内の指定された位置...