vue3 + ts:watch(immediate、deep、$watch)

简介: vue3 + ts:watch(immediate、deep、$watch)

一、项目基础介绍

项目:vue3+ts

vue+ts项目,想要使用watch

需要安装:vue-property-decorator

yarn add vue-property-decorator

二、普通监听:

// 实现基础的监听
<template>
  <div class="home">
    <div>watch</div>
    <div>
      <el-input v-model="data1" placeholder="Please input" />
    </div>
  </div>
</template>
<script lang="ts">
import { Vue } from 'vue-class-component';
import { Watch } from 'vue-property-decorator'
export default class Home extends Vue {
  public data1 = '11'
  @Watch('data1')
  private onData1Change(value: boolean) {
    if (value) {
      console.log('15', value)
    }
  }
}
</script>

效果:

三、immediate(立即执行)

这里 watch 的一个特点是,最初绑定的时候是不会执行的,要等到 firstName 改变时才执行监听计算。如果想要一开始就让他最初绑定的时候就执行:

<template>
  <div class="home">
    <div>watch</div>
    <div>
      <el-input v-model="data1" placeholder="Please input" />
    </div>
  </div>
</template>
<script lang="ts">
import { Vue } from 'vue-class-component';
import { Watch } from 'vue-property-decorator'
export default class Home extends Vue {
  public data1 = '初始值'
  @Watch('data1', { immediate: true, deep: true })
  private onData1Change(value: boolean) {
    if (value) {
      console.log('15', value)
    }
  }
}
</script>

效果:

四、deep(深度监听)

watch 里面还有一个属性 deep,默认值是 false,代表是否深度监听

data1里有一个name属性:

如果deep为false,那么name变化时候,监听data1,监听不到变化

如果deep为false,immediate为true,那么name变化时候,监听data1,可以监听到一次,后续变化监听不到

如果deep为true,那么name变化时候,监听data1,可以监听到变化

deep的意思就是深入观察,监听器会一层层的往下遍历,给对象的所有属性都加上这个监听器,但是这样性能开销就会非常大了,任何修改obj里面任何一个属性都会触发这个监听器里的 handler。

<template>
  <div class="home">
    <div>watch</div>
    <div>
      <el-input v-model="data1.name" placeholder="Please input" />
    </div>
  </div>
</template>
<script lang="ts">
import { Vue } from 'vue-class-component';
import { Watch } from 'vue-property-decorator'
export default class Home extends Vue {
  public data1 = {
    name: '初始值'
  }
  @Watch('data1', { immediate: true, deep: true })
  private onData1Change(value: any) {
    if (value) {
      console.log('15', value)
    }
  }
}
</script>

deep优化:

我们可以是使用字符串形式监听

<template>
  <div class="home">
    <div>watch</div>
    <div>
      <el-input v-model="data1.name" placeholder="Please input" />
    </div>
  </div>
</template>
<script lang="ts">
import { Vue } from 'vue-class-component';
import { Watch } from 'vue-property-decorator'
export default class Home extends Vue {
  public data1 = {
    name: '初始值'
  }
  @Watch('data1.name', { immediate: true })
  private onData1Change(value: any) {
    if (value) {
      console.log('15', value)
    }
  }
}
</script>

效果:

五、$watch(随时监听)

<template>
  <div class="home">
    <div>watch</div>
    <div>
      <el-button @click="watchStart">watchStart</el-button>
      <el-input v-model="data1.name" placeholder="Please input" />
    </div>
  </div>
</template>
<script lang="ts">
import { Vue } from 'vue-class-component';
import { Watch } from 'vue-property-decorator'
export default class Home extends Vue {
  public data1 = {
    name: '初始值'
  }
  private watchStart(){
    this.$watch('data1', (value: any) => {
      console.log('20', value);
    },
    {
      deep: true
    })
  }
}
</script>

效果:

六、监听路由

<template>
  <div class="home">
    <div>watch</div>
    <div>
      <el-button @click="changeRouter">改变路由</el-button>
    </div>
  </div>
</template>
<script lang="ts">
import { Vue } from 'vue-class-component';
import { Watch } from 'vue-property-decorator'
import { Router } from 'vue-router'
export default class Home extends Vue {
  public data1 = {
    name: '初始值'
  }
  @Watch('$route')
  private onRouteChange(route: Router) {
    console.log('21', route)
  }
  private changeRouter(){
    this.$router.push('/watch?id=1')
  }
}
</script>

效果:

七、欢迎交流指正

相关文章
|
3天前
|
缓存 JavaScript 前端开发
Vue 3的响应式系统
【5月更文挑战第31天】Vue 3的响应式系统
8 1
|
3天前
|
JavaScript 前端开发 API
vue2 /vue3【nextTick】的使用方法及实现原理,一文全搞懂!
vue2 /vue3【nextTick】的使用方法及实现原理,一文全搞懂!
|
3天前
|
JavaScript 开发者
[vue2/vue3] -- 深入剖析v-model的原理、父子组件双向绑定的多种写法
[vue2/vue3] -- 深入剖析v-model的原理、父子组件双向绑定的多种写法
[vue2/vue3] -- 深入剖析v-model的原理、父子组件双向绑定的多种写法
|
3天前
|
JavaScript API
vue3父子组件相互调用方法详解
vue3父子组件相互调用方法详解
|
10天前
|
JavaScript API
Vue3 基础语法
该内容介绍了Vue项目的创建和Vue3的语法、响应式API、生命周期、组件通信及跨组件通信方法。包括使用`npm init vue@latest`创建项目,`npm install`初始化,Vue3的`setup`语法,`reactive`、`ref`、`computed`和`watch`的用法,生命周期图解,以及父子组件间的数据传递。此外,还提到了Vue3中使用`provide`和`inject`进行跨层数据传递,以及通过Pinia库进行状态管理。
36 0
Vue3 基础语法
|
4天前
|
JavaScript 前端开发 安全
Vue响应式设计
【5月更文挑战第30天】Vue响应式设计
24 1
|
3天前
|
JavaScript 程序员 网络架构
vue路由从入门到进阶 --- 声明式导航详细教程
vue路由从入门到进阶 --- 声明式导航详细教程
vue路由从入门到进阶 --- 声明式导航详细教程
|
3天前
|
资源调度 JavaScript UED
vue路由的基础知识总结,vueRouter插件的安装与使用
vue路由的基础知识总结,vueRouter插件的安装与使用
|
3天前
|
JavaScript
|
4天前
|
编解码 JavaScript API
Vue在移动端的表现如何?
【5月更文挑战第30天】Vue在移动端的表现如何?
11 2