之前所讲的都是view层语法,今天所讲为model层语法!
1、计算属性
computed:{
计算属性: function(){return 返回值}
}
{{计算属性}} | v-指令="计算属性"

2、属性检测(侦听属性)
2.1、倾听属性
需要在数据变化时执行异步或开销较大的操作时,这个时候需要属性检测watch。而不要使用计算属性,因为计算属性是同步的(需要立即返回结果)
watch:{
被侦听的属性名:'methods的里函数名'
被侦听的属性名:函数体(new,old){}
被侦听的属性名:{
handler:function(new,old){},
deep: true
immediate: true
}
}
<div class="box">
<input type="text" v-model="val">
<p>{{meg.age}}</p>
<input type="button" value="点击年龄加1" @click="adda">
</div>
let vm = new Vue({
el: '.box',
data: {
val: "",
meg: {
age: 17,
}
},
methods: {
adda() {
this.meg.age++;
}
},
watch: {
val: function () {
console.log('我被侦听了');
},
meg: {
handler: function () {
console.log('我是对象,被侦听了');
},
deep:true,
immediate:true
}
}
})
2.2、计算属性 VS 函数 VS 属性检测

3、自定义指令
系统指令在不够用的情况下,考虑自定义,指令是个函数|对象,用来操作dom的, 里面的this 返回window
3.1、全局定义
注意:指令名:定义指令时,不用加 v- , 使用指令时,加 v-
Vue.directive('指令名',{
bind:function(el,binding){
}
inserted:function(el,binding){}
update:function(el,binding){}
componentUpdated:function(el,binding){}
})
钩子函数的几种参数请参考钩子函数参数
?name: 指令名(不带v-)
?arg:写在指令名后面的参数,如:v-myfocus:id , arg就是id 。 v-bind:value; arg就是value;
?expression: 等号后面的表达式,如:v-myfocus:id=“msg+‘1’” expression就是msg+‘1’。
?value:绑定数据的值,如:v-myfocus:id=“msg+‘1’” , value就是msg的值和1拼接的结果。
<div class="box">
<input type="text" v-myblur>
</div>
Vue.directive('myblur', {
bind: function (el, binding) {
},
inserted: function (el, binding) {
console.log(el);
console.log(binding);
},
update: function (el, binding) {
},
componentUpdated: function (el, binding) {
}
})
let vm = new Vue({
el: '.box',
data: {
}
})
3.2、局部定义
new Vue({
directives:{
指令名 : function(el,binding){},
指令名(el,binding){},
指令名:{
inserted:fn(el,binding){}
bind:fn
update:fn
componentUpdated:fn
}
}
})
let vm = new Vue({
el:'.box',
data:{
},
directives:{
myfocus:{
bind:function(el){
el.focus();
},
inserted:function(el,binding){
el.focus();
}
}
}
})
4、过滤器
对数据在模板中的表现过滤,比如数据是0和1,想要表现成对错、需要过滤器来格式化,vue1.x版本有系统自带过滤器,vue2.x之后完全需要自定义,没有自带过滤器
4.1、全局定义
Vue.filter('过滤器名称',函数(要过滤的元数据,参数1,参数n){
过滤器的功能
return 过滤的结果
})
{{数据名 | 过滤器名(参数1,参数2)}}
v-bind:属性="数据| 过滤器名(参数1,参数2)"
<div class="box">
<input type="button" value="点击涨一岁" @click="add">
<p v-cloak>{{num}}</p>
<p v-cloak>{{num | toage}}</p>
</div>
Vue.filter('toage',function(val){
if(val>=0&&val<=13){
return '少年';
}else if(val>13&&val<18){
return '青少年';
}else if(val>=18){
return '成年人';
}else{
return '';
}
})
let vm = new Vue({
el:'.box',
data:{
num:1
},
methods:{
add(){
this.num++;
}
}
})
4.2、局部定义
let vm = new Vue({
el:'.box',
data:{
num:56,
},
methods:{
add(){
this.num++;
}
},
filters:{
weight:function(val){
if(val<=45){
return '你是个瘦子';
}else if(val>45&&val<=65){
return '有点胖了';
}else{
return '该减肥了';
}
}
}
})
5、混入
分发 Vue 组件(对象)中的可复用功能,混入对象就是一个json对象,json对象的属性就是 Vue对象的配置项(data,methods等等,但是没有el)
5.1、局部定义
let mixin1 = {
data: ...
methods: ...
}
let mixin2 = {
data: ...
methods: ...
}
mixins: [mixin1,mixin2]
new Vue({
el:"#app",
data:{
msg:"hello"
}
mixins: [mixin1,mixin2]
})
let vm = new Vue({
el:'.box',
data:{
num:12
},
methods:{
add(){
this.num++;
}
},
mixins:[mixin1]
})
let mixin1 = {
data:{
num:12
},
methods:{
add(){
this.num++;
}
}
}
5.2、全局混入(极力不推荐)
Vue.mixin(mixin1)
注意:
混入普通选项与组件(vue对象)选项合并,遇冲突,以组件(Vue对象)为主,即:就近原则。
如果是生命周期钩子函数,那么都会调用(混入的钩子先调用)
|