watch的详细用法:
watch:常规用法1
<input type="text" v-model="uerName"/> data(){ return { userName:'qdleader' } }, watch:{ userName(newName, oldName) { //... } }
也可以写一个监听处理函数, 当每次监听到 cityName 值发生改变时,执行函数。也可以在所监听的数据后面直接加字符串形式的方法名:
watch: {
userName: 'nameChange' } }
这样使用watch时有一个特点,就是当值第一次绑定的时候,不会执行监听函数,只有值发生改变才会执行。如果我们需要在最初绑定值的时候也执行函数,则就需要用到immediate属性。
因此当我门在子组件props首次获取父组件传过来的默认值时候,需要立即执行一次函数,这就引出第二种immediate
2.immediate和handler
data(){ return { userName:'qdleader' } }, watch: { userName:{ handler(newName, oldName) { //.. }, immediate:true,//immediate表示在watch中首次绑定的时候,是否执行handler,值为true则表示在watch中声明的时候,就立即执行handler方法,值为false,则和一般使用watch一样,在数据发生变化的时候才执行handler。 } }
3.deep
还有很多时候,我们是要监听对象某一属性变化的,这时候就可以用deep
data(){ return { userInfo:{ id:1, name:'qdleader' } } }, watch:{ userInfo: { handler (newName, oldName) { //... }, deep:true, immediate:true } }
这里有个不太好的地方。虽然设置了deep:true,我们可以坚挺到userInfo.name的变化。但是此时会给userinfo的所有属性都加上这个监听器,当对象属性较多时,每个属性值的变化都会执行handler。如果只需要监听对象中的一个属性值,则可以做以下优化:使用字符串的形式监听对象属性:
watch:{
'userInfo.name': { handler (newName, oldName) { //... }, deep:true, immediate:true } }
同学问了,监听对象属性还有没有别的方法呢?
别着急呀!
监听对象属性computed也可以帮帮忙的。
computed: {
getName: function() { return this.userInfo.name } }, watch:{ getName:{ handler:function(){ //do something } } }
//延伸。。 监听路由变化:
watch:{
'$route.path':function(newVal,oldVal){ //console.log(newVal+"---"+oldVal); if(newVal === '/login'){ console.log('欢迎进入登录页面'); } else if(newVal === '/register'){ console.log('欢迎进入注册页面'); } } } 或者: watch:{ $route(to,from){ console.log(to.path); } },
即使道路坎坷不平,车轮也要前进;即使江河波涛汹涌,船只也航行。 最后,前端有兴趣的可以关注下,也可以加群,一起成长。还有https://github.com/qdleader/qdleader[https://github.com/qdleader/qdleader]