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>

效果:

七、欢迎交流指正

目录
打赏
0
0
0
0
8
分享
相关文章
|
4月前
|
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
157 58
创建vue3项目步骤以及安装第三方插件步骤【保姆级教程】
这是一篇关于创建Vue项目的详细指南,涵盖从环境搭建到项目部署的全过程。
256 1
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
131 56
vue3使用pinia中的actions,需要调用接口的话
通过上述步骤,您可以在Vue 3中使用Pinia和actions来管理状态并调用API接口。Pinia的简洁设计使得状态管理和异步操作更加直观和易于维护。无论是安装配置、创建Store还是在组件中使用Store,都能轻松实现高效的状态管理和数据处理。
169 3
|
3月前
|
vue使用iconfont图标
vue使用iconfont图标
163 1
Vue Router 核心原理
Vue Router 是 Vue.js 的官方路由管理器,用于实现单页面应用(SPA)的路由功能。其核心原理包括路由配置、监听浏览器事件和组件渲染等。通过定义路径与组件的映射关系,Vue Router 将用户访问的路径与对应的组件关联,支持哈希和历史模式监听 URL 变化,确保页面导航时正确渲染组件。
ry-vue-flowable-xg:震撼来袭!这款基于 Vue 和 Flowable 的企业级工程项目管理项目,你绝不能错过
基于 Vue 和 Flowable 的企业级工程项目管理平台,免费开源且高度定制化。它覆盖投标管理、进度控制、财务核算等全流程需求,提供流程设计、部署、监控和任务管理等功能,适用于企业办公、生产制造、金融服务等多个场景,助力企业提升效率与竞争力。
84 12
Vue中的class和style绑定
在 Vue 中,class 和 style 绑定是基于数据驱动视图的强大功能。通过 class 绑定,可以动态更新元素的 class 属性,支持对象和数组语法,适用于普通元素和组件。style 绑定则允许以对象或数组形式动态设置内联样式,Vue 会根据数据变化自动更新 DOM。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等