文字列の画面表示:v-text =”msg” 又は {{msg}}、効果は同じ
<div id="app01">
<div v-text="msg"></div>
<div>{{ msg}}></div>
</div>
<script>
var app = new Vue({
el: '#app01',
data: { msg: 'Hello!' }
})
</script>
表示
Hello!
Hello!
HTMLをそのまま表示:v-html=""
<div id="app02">
<div v-text="message"></div>
<div v-html="message"></div>
</div>
<script>
var app = new Vue({
el: '#app-102',
data: { message: '<b>Hello!</b>' }
})
</script>
表示
Hello!<b>Hello!</b>
display属性の条件表示制御: v-show="true": display
<div id="app03">
<input type="checkbox" @click="change" checked>
<span v-show="seen">Hello!</span>
</div>
<script>
var app = new Vue({
el: '#app03',
data: { seen: true },
methods: {
change: function(e) {
this.seen = e.target.checked
}
}
})
</script>
要素有無の条件制御する:v-if="true": <div>hello</div>出力
<div id="app03">
<input type="checkbox" @click="change" checked>
<span v-if="seen">Hello!</span>
</div>
<script>
var app = new Vue({
el: '#app03',
data: { seen: true },
methods: {
change: function(e) {
this.seen = e.target.checked
}
}
})
</script>
条件表示制御: v-else-if, v-else前にv-ifが必須
<div id="app01"> <input type="radio" name="app106-type" onclick="app106.type='A'" checked> <input type="radio" name="app106-type" onclick="app106.type='B'"> <input type="radio" name="app106-type" onclick="app106.type='C'"> <span v-if="type=='A'">Good morning.</span> <span v-else-if="type=='B'">Hello!</span> <span v-else>Bye!</span> </div> <script> var app01 = new Vue({ el: '#app01', data: { type: 'A' } }) </script>
for loop : v-for="item in items", v-for="(item, i) in items"
<div id="app01"> <ul> <li v-for="color in colorList"> {{ color }} </li> </ul> <ul> <li v-for="(color,i) in colorList"> {{i}}.{{ color }} </li> </ul> </div> <script> var app = new Vue({ el: '#app01', data: { colorList: [ 'Red', 'Green', 'Blue' ] } }) </script>
event binding: v-on 又は @
<div id="app01"> <button v-on:click="hello">Hello</button> <button @click="hello">Hello</button> </div> <script> var app = new Vue({ el: '#app01', methods: { hello: function() { alert("Hello!"); } } }) </script>
v-on:click.once / @click.once の様に、修飾可
修飾子 | 説明 |
---|---|
.stop | call event.stopPropagation()、イベントが親要素に伝播抑止 |
.prevent | call event.preventDefault() 、デフォルト動作抑止 |
.capture | イベントリスナをキャプチャモードで追加します。 |
.self | イベントがディスパッチ場合のみハンドラを呼びます。 |
.{keyCode | keyAlias} | 指定キーが押下時、ハンドラを呼びます。 |
.native | コンポーネントのルート要素にネイティブイベントを監視。 |
.once | 一度だけ呼びます。 |
.left | (2.2.0+) マウスの左ボタン押下処理 |
.right | (2.2.0+) マウスの右ボタン押下処理 |
.middle | (2.2.0+) マウスの中ボタン押下処理 |
.passive | (2.3.0+) { passive: true ] で DOM イベントをアタッチ |
属性bind: v-bind 又は :
<div id="app01"> <input type="button" v-bind:value="message"> <input type="button" :value="message"> </div> <script> var app = new Vue({ el: '#app01', data: { message: 'Hello!' } }) </script>
v-bind:value.camel や :value.camel の様に、修飾可能
修飾子 | 説明 |
---|---|
.prop | 属性の代わりに DOM プロパティをバインドします。 |
.camel | (2.1.0+) ケバブケース(例:color-name)の属性名を、 キャメルケース(例:ColorName)の属性名に変換します。 |
.sync | バインドされた値を更新する v-on ハンドラに展開されるのと同じ構文となります。 |
値変更可能要素にI・Oバインド:v-model="message"
<div id="app01">
<input v-model="message"> <!--inputの値が変わったら--------->
<div>Message: {{ message }}</div> <!--このDIVの表現内容が変わる------>
</div>
<script>
var app = new Vue({
el: '#app01',
data: { message: 'Hello!' }
})
</script>
修飾子 | 説明 |
---|---|
.lazy | input の代わりに change イベントを監視します。 |
.number | データを数値に変換します |
.trim | データ前後の空白を取り去る |
data変数をそのまま出力: v-pre
<div id="app01">
<div v-pre>Message: {{ message }}</div>
<div>Message: {{ message }}</div>
</div>
<script>
var app01= new Vue({
el: '#app01',
data: { message: 'Hello' }
})
</script>
表示
Message: {{ message }}
Message: Hello
一回だけ動作:v-once
<div id="app">
<input type="text" name="text1" v-model:value="message">
<div>Message: <span v-once>{{ message }}</span></div>
<div>Message: <span>{{ message }}</span></div>
</div>
<script>
var app= new Vue({
el: '#app',
data: { message: 'Hello' }
})
</script>
v-bind:[eventname]="dosomething"
返信削除[eventname]はdata.eventnameにより動的に変更が可能。注意:小文字にしてください、属性が自動的に小文字変更される。
v-bind:href="url" と :href="url" 一致。
返信削除v-on:click="dosomthing" と@click="dosomething", @[event]="dosomething" 一致
複雑な計算処理はテンプレートに書かず、computed:{}に追加
返信削除例:
var vm = new Vue({
el: '#example',
data: {
message: 'Hello'
},
computed: {
// 计算属性的 getter
reversedMessage: function () {
// `this` 指向 vm 实例
return this.message.split('').reverse().join('')
}
}
computed属性はdata属性の補足として、画面に直接利用ができる。
返信削除Original message: "{{ message }}"
Computed reversed message: "{{ reversedMessage }}"
computed:{ isCachedProp:function(){return value;} }
返信削除methods:{ isNotPropButMethodsWithNoCache:function(){return value;} }
isCachedCPropが依頼されたdata.valueが変更された場合のみ、再度計算する、
isNotPropButMethodsWithNoCacheは毎回CALLされた時に計算する。
watch:{}監視属性より、computed:{}計算属性のほうがおすすめ、CACHEがあるから。
返信削除
返信削除computed:{fullname:
{get:function(){return this.firstname + ' ' + this.lastname;}
set:function(newValue){
var names=newValue.split(" ");
this.firstname=names[0];
this.lastname=names[1];
}
}
}
//computed属性は通常getterだけ、必要によりsetterも可
watch監視属性は非同期処理等重い処理の場合、データの監視用
返信削除v-for の中にv-ifを使うのがやめてください。悪い使い方です。
返信削除v-forには暗黙パラメータindexの利用ができる、indexはdataに明示的に宣言が不要、利用箇所だけ明示すればOK.
返信削除例:v-for="(item, index) in items"
{{ parentMessage }} - {{ index }} - {{ item.message }}
name:valueのMAPであれば、v-for="(value, name) in map"の利用ができる、
返信削除更に、、v-for="(value, name, index) in map"の利用も可能
v-forにLOOPされたitemを明確化するため、:keyの指定が必要。例:
返信削除<div v-for="item in items" v-bind:key="item.id">
<!-- 内容 -->
</div>