本文我们通过案例来介绍下 watch
和 computed
的使用,案例效果如下:
如上,该案例就是实现一个简单的名称拼接处理。实现的方式也比较多,本文我们会分别采用三种方式来实现。
基础页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="./lib/vue-2.4.0.js"></script>
</head>
<body>
<div id="app">
<input type="text" > +
<input type="text" > =
<input type="text" >
</div>
<script>
var vm = new Vue({
el: "#app",
data: {},
methods: {}
})
</script>
</body>
</html>
看到上面的效果,相信大家通过普通的dom对象操作都能够实现这个效果,我们也来实现下,如下:
首先我们给三个 input
输入框和 vm实例
做双向绑定
然后我们给 firstname
和 lastname
的输入框分别绑定 keyup
事件,然后在 vm 实例的 methods
中定义拼接名称的方法
搞定! 效果如下:
接下来我们再来看下通过watch
来实现上面的效果.
watch
会监视 data
中指定的数据,当这些数据发生变动的时候会触发对应的 function来处理相关的业务。
此处可能大家会比较疑惑,watch
需要监视 firstname
和 lastname
这两个信息,而 我们通过 keyup
只需要在 methods
中定义一个方法就可以了,感觉watch
反而没有前面例子中来的方便,那么 watch
的作用还有什么呢?前面的事件监听只能处理DOM元素而针对 路由
的变化就无能为力了,所以我们来看下下面这个案例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="./lib/vue-2.4.0.js"></script>
<script src="./lib/vue-router-3.0.1.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: "<h1>这是个登录组件</h1>"
}
var register = {
template: "<h1>这是个注册组件</h1>"
}
var routerObj = new VueRouter({
routes:[
{ path : "/login" , component : login },
{ path : "/register" , component : register }
]
})
var vm = new Vue({
el: "#app",
data: {},
methods: {},
router: routerObj
})
</script>
</body>
</html>
效果
现在我们希望能够在路由变化的时候来捕获到这个行为,并给出对应的响应。这时我们可以监视 vm.$route.path
来处理
所以可以如下方式实现
watch
监视路由变化的效果搞定~
最后我们来看下 computed
怎么来实现上面案例的效果的。
在 computed
中,可以定义一些 属性,这些属性,叫做 计算属性
, 计算属性的本质,就是 一个方法,只不过,我们在使用 这些计算属性的时候,是把 它们的 名称,直接当作 属性来使用的;并不会把计算属性,当作方法去调用;
缓存
起来,方便下次直接使用; 如果 计算属性方法中,所以来的任何数据,都没有发生过变化,则不会重新对 计算属性求值;完整代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="./lib/vue-2.4.0.js"></script>
<script src="./lib/vue-router-3.0.1.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: {
'fullname' : function(){
return this.firstname + '-' + this.lastname
}
}
})
</script>
</body>
</html>
最后来看下这三者的区别,具体如下:
元素 | 描述 |
---|---|
computed | 属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算。主要当作属性来使用 |
methods | 方法表示一个具体的操作,主要书写业务逻辑 |
watch | 一个对象,键是需要观察的表达式,值是对应回调函数。主要用来监听某些特定数据的变化,从而进行某些具体的业务逻辑操作;可以看作是computed和methods的结合体 |
好了本文就介绍到此~有问题的小伙伴欢迎留言交流哦