單向資料流 v-bind:屬性
繫結屬性值,簡寫::屬性
單向資料繫結:記憶體改變影響頁面
<body>
<div id="app">
</div>
<script>
new Vue({
el: '#app',
template: `
<div>
<input type="text" v-bind:value='name'><hr/>
</div>
`,
data: function () {
return {
name: '哇哈哈'
}
}
})
</script>
</body>
複製程式碼
輸入框的值隨著name的變化而變化
雙向資料流 v-model
只作用於有value屬性的元素
雙向資料繫結:記憶體改變影響頁面,頁面改變也會影響記憶體
<body>
<div id="app">
</div>
<script>
new Vue({
el: '#app',
template: `
<div>
<input type="text" v-bind:value='name'><hr/>
<input type="text" v-model='name'>
</div>
`,
data: function () {
return {
name: '哇哈哈'
}
}
})
</script>
</body>
複製程式碼
第二個輸入框的值可以影響到第一個輸入框
其原理是:
1、v-model輸入框中的name傳送改變
2、vue物件的name改變
3、v-bind:value輸入框改變
事件繫結 v-on
v-on:事件名="表示式||函式名"
簡寫:@事件名="表示式||函式名"
事件可以是原生的,也可以是自定義的
<script>
new Vue({
el: '#app',
template: `
<div>
<input type="text" v-bind:value='name'><hr/>
<input type="text" v-model='name'><hr/>
<button v-on:click='name="name改變後"'>點選改變name變數</button>
</div>
`,
data: function () {
return {
name: '哇哈哈'
}
}
})
</script>
複製程式碼
- 點選觸發自定義函式
<script>
new Vue({
el: '#app',
template: `
<div>
<input type="text" v-bind:value='name'><hr/>
<input type="text" v-model='name'><hr/>
<button v-on:click='change'>點選改變name變數</button>
</div>
`,
data: function () {
return {
name: '哇哈哈'
}
},
methods:{
change:function(){
this.name = this.name+"哇哈哈=";
}
}
})
</script>
複製程式碼
過濾器 filters
正常情況下,vue資料直接被模板獲取,而filters
,允許在vue資料改變後,再被filters
加工一次,然後再被模板獲取
<body>
<div id="app">
輸入:<input type="text" name="" id="" v-model='instring'><br/>
輸出:{{instring}}<br/>
翻轉輸出:{{instring | reversal}}<br/>
</div>
<script>
new Vue({
el: '#app',
data: function () {
return {
instring: ''
}
},
filters:{
reversal(val){
// 字串翻轉
return val.split('').reverse().join('');
}
}
})
</script>
</body>
複製程式碼
偵聽器 watch
<body>
<div id="app">
監聽器<br />
姓:<input type="text" name="" id="" v-model='firstName'><br/>
名:<input type="text" name="" id="" v-model='lastName'><br/>
{{fullName}}<br/>
</div>
<script>
new Vue({
el: '#app',
data: function () {
return {
firstName: 'Foo',
lastName: 'Bar',
fullName: 'Foo Bar'
}
},
watch: {
firstName: function (val) {
this.fullName = val + ' ' + this.lastName
},
lastName: function (val) {
this.fullName = this.firstName + ' ' + val
}
}
})
</script>
</body>
複製程式碼
這裡的function引數,第一個引數是變更後的值,其實還有第二個引數,就是變更前的值
- 開啟深度監聽
如果我們監聽的不是一個基本型別,而是一個物件,那麼就要開啟深度監聽才能檢測到變化
<body>
<div id="app">
監聽器<br />
姓:<input type="text" name="" id="" v-model='firstName.aa'><br/>
名:<input type="text" name="" id="" v-model='lastName'><br/>
{{fullName}}<br/>
</div>
<script>
new Vue({
el: '#app',
data: function () {
return {
firstName: {aa:'Foo'},
lastName: 'Bar',
fullName: 'Foo Bar'
}
},
watch: {
firstName:{
handler(val){
this.fullName = val.aa + ' ' + this.lastName
},
//開啟深度監聽
deep:true
},
lastName: function (val) {
this.fullName = this.firstName.aa + ' ' + val
}
}
})
</script>
</body>
複製程式碼
計算屬性 computed
<body>
<div id="app">
監聽器<br />
姓:<input type="text" name="" id="" v-model='firstName'><br />
名:<input type="text" name="" id="" v-model='lastName'><br />
{{fullName}}<br />
</div>
<script>
new Vue({
el: '#app',
data: function () {
return {
firstName: 'Foo' ,
lastName: 'Bar'
}
},
computed: {
fullName: function () {
return this.firstName + ' ' + this.lastName
}
}
})
</script>
</body>
複製程式碼