HTML属性とDOMプロパティの違い
Vueのv-bind:valueとv-bind:value.propの違いが分からず、 それを理解するのにHTML属性とDOMプロパティの違いを理解する必要があったので備忘録として、記載します。
[v-bind:value]
HTML属性のバインドを行う
[v-bind:value.prop]
HTML属性ではなくDOMプロパティのバインディングを行う
ここで、HTML属性とDOMプロパティは、何が違うのかと疑問に思った。 具体的なイメージで理解するために以下にサンプルコードを記載する。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>HTML Attributes vs DOM Properties</title> </head> <body> <input type="text" id="myInput" value="Hello"> <button onclick="changeValue()">Change Value</button> <script> function changeValue() { var input = document.getElementById('myInput'); // DOMプロパティを変更 input.value = "Changed via DOM Property"; // HTML属性を取得 console.log(input.getAttribute('value')); // 出力: Hello // DOMプロパティを取得 console.log(input.value); // 出力: Changed via DOM Property // HTML属性を変更 input.setAttribute('value', 'Changed via HTML Attribute'); // HTML属性を取得 console.log(input.getAttribute('value')); // 出力: Changed via HTML Attribute } </script> </body> </html>
最初の表示では、以下のようになっている。(value="Hello"になっている)
gyazo.com
[Change Value]ボタンをクリックすると以下のようになる。(value="Changed via HTML Attribute"になっている) これは、
input.setAttribute('value', 'Changed via HTML Attribute');
でHTML属性を変更しているため。 上記のようにHTML属性を変更する処理を記載しないと、画面表示は切り替わるがHTML属性は、切り替わらない。 DOMを変更するだけだと画面表示は切り替わるが、HTML属性は切り替わらない。
[v-bind:value]と[v-bind:value.prop]の違いがこれで分かったが、 以下の流れになるので結果としてVueでは、同じ挙動となる。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>v-bind:value vs v-bind:value.prop Example</title> <script src="https://cdn.jsdelivr.net/npm/vue@2.7.11/dist/vue.js"></script> </head> <body> <div id="app"> <input type="text" v-bind:value="message"> <input type="text" v-bind:value.prop="message"> <p>{{ message }}</p> <button @click="updateMessage">Update Message</button> </div> <script> var app = new Vue({ el: '#app', data: { message: 'Hello, Vue.js!' }, methods: { updateMessage: function() { this.message = 'Updated message!'; } } }); </script> </body> </html>
①ページが読み込まれると、input要素のvalue属性は"Hello"に設定される。
②[Update Message]ボタンをクリックすると、updateMessageメソッドが呼び出され、messageデータプロパティが"Updated message!"に更新される。
③プロパティが更新されたことで、再レンダリングされる。 再レンダリングされる時に、HTML属性は、value="Changed via HTML Attribute"になっているので、DOMプロパティもvalue="Changed via HTML Attribute"になる。
ポイント
- ページが表示される際に、HTML文書を読み込みHTMLの属性値に対応するDOMプロパティに初期値として設定される。
- JavaScriptを使用してDOMプロパティを変更すると、その変更は即座にUIに反映されるが、HTML属性は更新されない。
