前端Vue日常工作中--Watch数据监听

Watch数据监听

普通应用

在Vue.js中,watch 选项用于监视Vue实例的数据变化,并在数据变化时执行相应的操作。watch 可以用于监听单个数据属性的变化,也可以用于监听嵌套对象或数组的变化。

1.1监听单个属性的变化:

xml 复制代码
<template>
  <div>
    <p>{{ message }}</p>
    <input v-model="messageInput" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: 'Hello, Vue!',
      messageInput: '',
    };
  },
  watch: {
    // 监听 message 属性的变化
    message(newValue, oldValue) {
      console.log('message 发生变化:', newValue, oldValue);
    },
  },
};
</script>

使用 watch 选项监听 message 属性的变化。每当 message 发生变化时,watch 中的回调函数将被调用,可以获取新值 newValue 和旧值 oldValue

1.2监听嵌套对象的变化:

xml 复制代码
<template>
  <div>
    <p>{{ user.name }}</p>
    <input v-model="user.name" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      user: {
        name: 'John Doe',
        age: 25,
      },
    };
  },
  watch: {
    // 监听 user 对象的变化
    'user.name'(newValue, oldValue) {
      console.log('user.name 发生变化:', newValue, oldValue);
    },
  },
};
</script>

监听user.name 属性的变化。注意,如果要监听嵌套属性,可以使用字符串形式的属性路径。

1.3深度监听整个对象或数组:

xml 复制代码
<template>
  <div>
    <p>{{ items.join(', ') }}</p>
    <button @click="addItem">添加项</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: ['Item 1', 'Item 2', 'Item 3'],
    };
  },
  watch: {
    // 深度监听整个 items 数组的变化
    items: {
      handler(newValue, oldValue) {
        console.log('items 数组发生变化:', newValue, oldValue);
      },
      deep: true,
    },
  },
  methods: {
    addItem() {
      this.items.push('New Item');
    },
  },
};
</script>

使用 deep: true 选项,以便深度监听整个 items 数组的变化。当数组中的项发生变化时,watch 中的回调函数将被调用。可用于响应式地处理数据的变化,执行一些逻辑或者触发其他操作。

组件中应用(父子组件)

在Vue.js中,使用watch选项可以方便地在父组件中监听子组件的数据变化,或者在子组件中监听父组件传递的props的变化。

2.1在父组件中监听子组件的数据变化:

子组件 Child.vue:

xml 复制代码
<template>
  <div>
    <p>{{ message }}</p>
    <button @click="updateMessage">更新消息</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: 'Hello from Child!',
    };
  },
  methods: {
    updateMessage() {
      this.message = 'Updated message from Child!';
    },
  },
};
</script>

父组件 Parent.vue:

xml 复制代码
<template>
  <div>
    <child-component :child-message="childMessage" @child-message-changed="handleChildMessageChange" />
    <p>父组件收到子组件消息:{{ childMessage }}</p>
  </div>
</template>

<script>
import ChildComponent from './Child.vue';

export default {
  components: {
    ChildComponent,
  },
  data() {
    return {
      childMessage: '',
    };
  },
  methods: {
    handleChildMessageChange(newMessage) {
      console.log('父组件收到子组件消息变化:', newMessage);
      this.childMessage = newMessage;
    },
  },
  watch: {
    childMessage(newChildMessage, oldChildMessage) {
      console.log('父组件监听到子组件消息变化:', newChildMessage, oldChildMessage);
    },
  },
};
</script>

父组件通过在模板中使用子组件 <child-component>,并传递 child-message 属性,来与子组件进行通信。子组件中通过点击按钮更新 message 数据,并通过 $emit 方法触发 child-message-changed 事件,将新的消息传递给父组件。

父组件中,通过监听 childMessage 属性的变化,可以在 watch 中捕获到子组件数据的变化。在 handleChildMessageChange 方法中,父组件也通过事件监听方式处理了子组件数据变化。

2.2在子组件中监听父组件传递的props的变化:

子组件 Child.vue:

xml 复制代码
<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  props: ['parentMessage'],
  watch: {
    parentMessage(newParentMessage, oldParentMessage) {
      console.log('子组件监听到父组件传递的props变化:', newParentMessage, oldParentMessage);
    },
  },
};
</script>

父组件 Parent.vue:

xml 复制代码
<template>
  <div>
    <child-component :parent-message="parentMessage" />
    <button @click="updateParentMessage">更新父组件消息</button>
  </div>
</template>

<script>
import ChildComponent from './Child.vue';

export default {
  components: {
    ChildComponent,
  },
  data() {
    return {
      parentMessage: 'Hello from Parent!',
    };
  },
  methods: {
    updateParentMessage() {
      this.parentMessage = 'Updated message from Parent!';
    },
  },
};
</script>

父组件通过使用子组件 <child-component> 并传递 parent-message 属性,将数据传递给子组件。在子组件中,通过 watch 监听 parentMessage 属性的变化,可以捕获到父组件传递的props的变化。

无论是在父组件中监听子组件的数据变化,还是在子组件中监听父组件传递的props的变化,watch 都是一个有用的工具,可以用于在Vue.js应用中响应式地处理数据的变化。

相关推荐
Mr Xu_10 小时前
告别冗长 switch-case:Vue 项目中基于映射表的优雅路由数据匹配方案
前端·javascript·vue.js
前端摸鱼匠10 小时前
Vue 3 的toRefs保持响应性:讲解toRefs在解构响应式对象时的作用
前端·javascript·vue.js·前端框架·ecmascript
未来之窗软件服务12 小时前
未来之窗昭和仙君(六十五)Vue与跨地区多部门开发—东方仙盟练气
前端·javascript·vue.js·仙盟创梦ide·东方仙盟·昭和仙君
phltxy13 小时前
Vue 核心特性实战指南:指令、样式绑定、计算属性与侦听器
前端·javascript·vue.js
Byron070714 小时前
Vue 中使用 Tiptap 富文本编辑器的完整指南
前端·javascript·vue.js
Byron070716 小时前
从 0 到 1 搭建 Vue 前端工程化体系:提效、提质、降本实战落地
前端·javascript·vue.js
zhengfei61116 小时前
【AI平台】- 基于大模型的知识库与知识图谱智能体开发平台
vue.js·语言模型·langchain·知识图谱·多分类
徐小夕@趣谈前端16 小时前
Web文档的“Office时刻“:jitword共建版2.0发布!让浏览器变成本地生产力
前端·数据结构·vue.js·算法·开源·编辑器·es6
董世昌4117 小时前
深度解析浅拷贝与深拷贝:底层逻辑、实现方式及实战避坑
前端·javascript·vue.js
扶苏100217 小时前
vue使用event.dataTransfer实现A容器数据拖拽复制到到B容器
前端·vue.js·chrome