这篇文章补充说明 watch、computed 属性。
参考: Vue 官方文档 https://cn.vuejs.org/v2/guide/
上一篇文章的链接:Vue 学习(四)——路由 http://www.honeybee.top/articles/2018/10/10/1539162461246.html
1. watch 属性
~watch 属性可以监视 data 中指定数据的变化, 然后触发这个 watch 中对应的 function 处理函数,下面用一个拼接字符串的例子说明:
<html> <head> <meta charset="utf-8" /> <script src="https://cdn.bootcss.com/vue/2.5.16/vue.js"></script> </head> <body> <div id="app"> <input type="text" v-model="firstname" /> + <input type="text" v-model="lastname" /> = <input type="text" v-model="fullname" /> </div> <script> var vm = new Vue({ el: '#app', data: { firstname: '', lastname: '', fullname: '' }, methods: {}, //watch属性可以监视data中指定数据的变化, 然后触发这个watch中对应的function处理函数 watch: { //函数中有两个形参,第一个为变化后的值,第二个为变化前的旧值 'firstname': function(newVal, oldVal) { this.fullname = newVal + '+' + this.lastname; }, 'lastname': function(newVal) { this.fullname = this.firstname + '+' + newVal; } } }); </script> </body> </html>
运行结果如下,根据前面两个值的变化来拼接输入的字符串:
~watch 属性还可以监听非 DOM 元素的变化,下面的例子来监听路由地址的变化:
<html> <head> <meta charset="utf-8" /> <script src="https://cdn.bootcss.com/vue/2.5.16/vue.js"></script> <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script> </head> <body> <div id="app"> <router-link to="/login">登录</router-link> <router-link to="/register">注册</router-link> <router-view></router-view> </div> <script> var login = { template: '<h2>登录组件</h2>' }; var register = { template: '<h2>注册组件</h2>' }; var routerObj = new VueRouter({ routes: [ {path: '/login', component: login}, {path: '/register', component: register} ] }); var vm = new Vue({ el: '#app', data: {}, methods: {}, router: routerObj, watch: { //监听路由的变化 '$route.path': function(newVal, oldVal) { if(newVal === '/login') { console.log('进入登录页面') } else if(newVal === '/register') { console.log('进入注册页面') } } } }); </script> </body> </html>
运行结果如下,路由的变化会触发 watch 里的监听函数:
2. computed 属性
~computed 中,可以定义一些[计算属性]来返回需要的结果,把上面拼接字符串的例子作下修改:
<html> <head> <meta charset="utf-8" /> <script src="https://cdn.bootcss.com/vue/2.5.16/vue.js"></script> </head> <body> <div id="app"> <input type="text" v-model="firstname" /> + <input type="text" v-model="lastname" /> = <input type="text" v-model="fullname" /> </div> <script> var vm = new Vue({ el: '#app', data: { firstname: '', lastname: '' }, methods: {}, //computed中,可以定义一些[计算属性],计算属性是一个方法,但是在使用的时候,是把这个方法的名称直接当作属性来使用 computed: { //直接用 fullname 来代表这个[计算属性] //注意:[计算属性]function内部中任何data中的数据发生了变化,就会立即重新计算 //注意:[计算属性]方法的求值结果会被缓存起来,如果方法中的数据没有发生任何变化,那么再次引用的时候不会重新计算。 'fullname': function() { return this.firstname + '+' + this.lastname; } } }); </script> </body> </html>
运行结果和上面 watch 属性拼接字符串的例子是一样的:
3. watch、computed 和 methods 之间的对比
computed
属性的结果会被缓存起来,除非依赖的响应式属性变化才会重新计算,主要当作属性来使用;methods
方法表示一个具体的操作,主要用来写业务逻辑;watch
是一个对象,键是需要观察的表达式,值是对应的回调函数。主要用来监听特定数据的变化,从而进行具体的业务逻辑操作,可以看作是computed
和methods
的结合体。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于