在vue中,使用watch来响应数据的变化。
1:普通的使用方式
<input type="text" v-model="cityName"/>
new Vue({
el: '#root',
data: {
cityName: 'shanghai'
},
watch: {
cityName(newName, oldName) {
// ...
}
}
})
这样使用watch时有一个特点,就是当值第一次绑定的时候,不会执行监听函数,只有值发生改变才会执行。如果我们需要在最初绑定值的时候也执行函数,则就需要用到immediate属性。
比如当父组件向子组件动态传值时,子组件props首次获取到父组件传来的默认值时,也需要执行函数,此时就需要将immediate设为true。immediate表示在watch中首次绑定的时候,是否执行handler,值为true则表示在watch中声明的时候,就立即执行handler方法,值为false,则和一般使用watch一样,在数据发生变化的时候才执行handler。
new Vue({
el: '#root',
data: {
cityName: ''
},
watch: {
cityName: {
handler(newName, oldName) {
// ...
},
immediate: true
}
}
})
当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的改变,只有data中的数据才能够监听到变化,此时就需要deep属性对对象进行深度监听。
<input type="text" v-model=""/>
new Vue({
el: '#root',
data: {
cityName: {id: 1, name: 'shanghai'}
},
watch: {
cityName: {
handler(newName, oldName) {
// ...
},
deep: true,
immediate: true
}
}
})
设置deep: true 则可以监听到的变化,此时会给cityName的所有属性都加上这个监听器,当对象属性较多时,每个属性值的变化都会执行handler。如果只需要监听对象中的一个属性值,则可以做以下优化:使用字符串的形式监听对象属性:
watch: {
'': {
handler(newName, oldName) {
// ...
},
deep: true,
immediate: true
}
}
nextTick 用法 :在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。
Vue 在修改数据后,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之后,再统一进行视图更新。
应用场景:需要在视图更新之后,基于新的视图进行操作。
需要注意的是,在 created 和 mounted 阶段,如果需要操作渲染后的试图,也要使用 nextTick 方法。
mounted: function () {
this.$nextTick(function () {
// Code that will run only after the
// entire view has been rendered
})
}
其他应用场景
1.、点击按钮显示原本以 v-show = false 隐藏起来的输入框,并获取焦点。
showsou(){
= true //修改 v-show
("keywords").focus() //在第一个 tick 里,获取不到输入框,自然也获取不到焦点
}
修改为:
showsou(){
= true
this.$nextTick(function () {
// DOM 更新了
("keywords").focus()
})
}
2点击获取元素宽度。
<div >
<p ref="myWidth" v-if="showMe">{{ message }}</p>
<button @click="getMyWidth">获取p元素宽度</button>
</div>
getMyWidth() {
= true;
// = this.$;
//报错 TypeError: this.$ is undefined
this.$nextTick(()=>{
//dom元素更新后执行,此时能拿到p元素的属性
= this.$;
})
}
3:使用 swiper 插件通过 ajax 请求图片后的滑动问题。
Vue获取参数 获取当前路由信息
echoMsg(){
(this.$router)
(this.$route);
= this.$;
= this.$;
}
// 1.页面中的代码
this.$({
name: 'generalAdminOrderFlowAdd',
params: {
type: 'add',
templateType:
}
})
// 2.路由中的代码
{
path: ':type/:templateType',
name: 'generalAdminOrderFlowAdd',
component: require('@/components/generalAdmin/order/orderFlow')
}
// 3.获取页面中的参数值
let type = this.$