计算属性computed
计算属性,方法名可以直接在对象中使用.这个属性是通过计算得出的。 这个方法中的任意属性改变,都会触发这个方法 使用场景:希望把一些计算的业务逻辑放在方法中,例如:全名计算、地址计算、购物车合计
下面的示例,我们使用了三种方式:
- 使用方法实现
- 使用vue的computed读写方式实现
- 使用vue的computed只读方式实现
注意:推荐使用computed的方式。有缓存机制。在页面重复调用多次的情况下,只执行一次
<body> <div id="app"> 姓:<input type="text" v-model="firstName"> <br> 名:<input type="text" v-model="lastName"> <br> 全名:<input type="text" v-model="getFullName()"><br> 全名:<input type="text" v-model="fullName"><br> 全名:<input type="text" v-model="fullNameReadOnly"><br> </div> </body> <script src="./js/vue2.js"></script> <script> var app = new Vue({ el: '#app', // 用于指定当前vue实例为哪个容器使用,值为css选择器字符串 data() { return { firstName:'张', lastName:'三', } }, methods:{ getFullName(){ return this.firstName+"-"+this.lastName } }, computed:{ fullName:{ // 读 get(){ return this.firstName+"-"+this.lastName }, // 写 set(value){ this.firstName = value.split("-")[0] this.lastName = value.split("-")[1] } }, // 只读方式的简写 fullNameReadOnly(){ return this.firstName+"-"+this.lastName } } }); </script>
侦听属性watch
// 前面在data中要定义好两个属性:plan、isSunny watch:{ // 监听isSunny属性,当isSunny属性改变时,执行对应的代码 isSunny:{ immediate:true, // 开启初始化调用 deep:true, // 开启深度监视 handler(newVal,oldVal){ // 晴天打篮球,否则写代码 this.plan = this.isSunny ? "打篮球" : "写代码" console.log('新的数据:'+newVal); console.log('旧的数据:'+oldVal); } }, // 监听复杂数据的某个属性,这也是一种简写方式 "person.name"(newVal,oldVal){ console.log('新的数据:'+newVal); console.log('旧的数据:'+oldVal); } }
- 被监视的属性发生改变时,调用回调函数,执行相关操作
- 配置
immediate:true
实现初始化调用 - 监视的属性须存在才能进行监视
完整代码
<body> <div id="app"> <div> <input type="text" v-model="firetName"> <input type="text" v-model="lastname"><br> <input type="text" v-model="getFullName()"><br> <input type="text" v-model="fullNameReadonly"><br> <input type="text" v-model="funName"> </div> </div> </body> <script src="../js/vue2.7.js"></script> <script> var app=new Vue({ el:"#app", data(){ return{ firetName:"科比", lastname:"布莱恩特", isSunny:true, person:{ age:18, name:'光头' } } }, methods:{ getFullName(){ return this.firetName+"."+this.lastname } }, computed:{ //只读方式的简写,写到computed,有缓存 fullNameReadonly(){ return this.firetName+"."+this.lastname }, funName:{ get(){ return this.firetName+"."+this.lastname }, set(value){ this.firetName=value.split(".")[0] this.lastname=value.split(".")[1] } } }, watch:{ //表示要对isSunny这个属性进行侦听 isSunny(newVal,oldval){ console.log("改变了",oldval,newVal); }, //深度监听可以用来监听整个随性的改变,但要慎用,因为 person:{ immediate:true, deep:true, handler(newVal,oldval){ console.log("改变了",newVal,oldval); } }, "person.name"(newVal,oldval){ console.log("我也侦听到了"); } } }) </script>