在 Vue.js 中,watch 是一个非常有用的选项,用于观察 Vue 实例上的数据变动并执行相应的回调函数。watch 主要用于对 Vue 实例中数据的变化进行响应性处理,适合于需要执行异步操作或开销较大的计算的情况。下面是 watch 的详细介绍和用法:

基本用法

在 Vue 组件中,watch 是一个对象,键是你想观察的 data 或 props 的名字,值是一个函数,这个函数会在对应的数据变化时被调用。例如:

export default {
  data() {
    return {
      message: 'Hello, Vue!'
    };
  },
  watch: {
    // 当 message 变化时,这个函数会被调用
    message(newValue, oldValue) {
      console.log(`Message changed from ${oldValue} to ${newValue}`);
    }
  }
};

深度监听

有时你需要观察一个对象或数组内部的变化,而不仅仅是对象的引用变化。可以使用 deep 选项来进行深度监听:

export default {
  data() {
    return {
      user: {
        name: 'John',
        age: 30
      }
    };
  },
  watch: {
    user: {
      handler(newValue, oldValue) {
        console.log('User object changed:', newValue);
      },
      deep: true // 深度监听
    }
  }
};

监听多个数据属性

你可以同时监听多个数据属性,通过将 watch 设置为一个对象,其中每个属性都是要监听的数据属性:

export default {
  data() {
    return {
      firstName: 'John',
      lastName: 'Doe'
    };
  },
  watch: {
    firstName(newValue, oldValue) {
      console.log(`First name changed from ${oldValue} to ${newValue}`);
    },
    lastName(newValue, oldValue) {
      console.log(`Last name changed from ${oldValue} to ${newValue}`);
    }
  }
};

立即触发

默认情况下,watch 回调只在数据变化时触发。如果你希望在组件创建时立即执行 watch 回调,可以设置 immediate 选项:

export default {
  data() {
    return {
      count: 0
    };
  },
  watch: {
    count: {
      handler(newValue) {
        console.log(`Count changed to ${newValue}`);
      },
      immediate: true // 组件创建时立即执行
    }
  }
};

使用 watch 处理异步操作

watch 回调函数可以处理异步操作,例如进行 API 请求:

export default {
  data() {
    return {
      searchQuery: ''
    };
  },
  watch: {
    async searchQuery(newQuery) {
      if (newQuery) {
        try {
          const response = await fetch(`https://api.example.com/search?q=${newQuery}`);
          const data = await response.json();
          console.log('Search results:', data);
        } catch (error) {
          console.error('Error fetching search results:', error);
        }
      }
    }
  }
};

监听计算属性

如果需要监听计算属性的变化,也可以通过 watch 实现:

export default {
  data() {
    return {
      baseValue: 10
    };
  },
  computed: {
    computedValue() {
      return this.baseValue * 2;
    }
  },
  watch: {
    computedValue(newValue) {
      console.log(`Computed value changed to ${newValue}`);
    }
  }
};

结论

watch 在 Vue.js 中是一个强大的工具,特别适用于处理需要对数据变化做出反应的场景。通过配置 watch 选项,你可以深入控制数据变化时的行为,包括异步操作、深度监听等。