欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

vue watch的immediate和deep

程序员文章站 2022-03-29 13:56:28
...

1. immediate

  • immediate表示立即执行的意思,这样就是说不用等到value变化才会执行,默认的时候就会立刻执行一次。
    假设我们页面上有一个搜索框,每次输入内容的时候去请求一个接口,同时一进页面的时候需要调一下这个接口,我们可能一般这样写:
<!--作者:zhangfan
页面名称:watch的immediate和deep--> 
<template>
  <div id="product-list-one">
    <label>
      这是一个输入框:
      <input type="text" v-model="value" />
    </label>
  </div>
</template>

<script>
export default {
  data() {
    return {
      value: "zhangfan"
    };
  },
  watch: {
    value: "getData"
  },
  mounted: function() {
    this.getData();
  },
  methods: {
    getData: function() {
      console.log(this.value);
    }
  }
};
</script>

<style scoped>
</style>

我们将这个输入框的内容绑定一个变量value,同时利用watch去监视value有没有发生变化,如果变化了就是调用getData,然后在mounted里面调用getData,因为已进入的时候需要调用一次。

其实上面的第一次调用getData可以在watch中配置一个immediate,就像这样:

<!--作者:zhangfan
页面名称:watch的immediate和deep--> 
<template>
  <div id="product-list-one">
    <label>
      这是一个输入框:
      <input type="text" v-model="value" />
    </label>
  </div>
</template>

<script>
export default {
  data() {
    return {
      value: "zhangfan"
    };
  },
  watch: {
    value: {
      handler: "getData",
      immediate: true
    }
  },
  methods: {
    getData: function() {
      console.log(this.value);
    }
  }
};
</script>

<style scoped>
</style>
  • immediate表示立即执行的意思,这样就是说不用等到value变化才会执行,默认的时候就会立刻执行一次。handler表示需要调用的方法。

2. deep

  • 如果我们用watch监视一个对象的时候,往往得不到正确的结果,例如:
<!--作者:zhangfan
页面名称:watch的immediate和deep--> 
<template>
  <div id="product-list-one">
    <label>
      这是一个输入框:
      <input type="text" v-model="obj.email" />
    </label>
  </div>
</template>

<script>
export default {
  data() {
    return {
      obj: {
        email: "[email protected]"
      }
    };
  },
  watch: {
    obj: {
      handler: "getData"
    }
  },
  methods: {
    getData: function() {
      console.log(this.obj.email);
    }
  }
};
</script>

<style scoped>
</style>
  • 我们定义了一个对象obj,将输入框和obj.email进行绑定,那么我们利用watch去监测obj,那么当输入框输入内容的时候,watch的obj是不会触发的。
  • 此时可以用deep,因为用watch去监测obj,只有obj发生变化才会触发,如果是obj.email变化则没反应,如果用deep的话,表示可以监测到obj的下层变动:
<!--作者:zhangfan
页面名称:watch的immediate和deep--> 
<template>
  <div id="product-list-one">
    <label>
      这是一个输入框:
      <input type="text" v-model="obj.email" />
    </label>
  </div>
</template>

<script>
export default {
  data() {
    return {
      obj: {
        email: "[email protected]"
      }
    };
  },
  watch: {
    obj: {
      handler: "getData",
      deep: true
    }
  },
  methods: {
    getData: function() {
      console.log(this.obj.email);
    }
  }
};
</script>

<style scoped>
</style>
  • 但是如果用deep的话,还会有一些副作用,假如obj还有一个age的属性,那么age属性的变动也会被监测到。如果只是想单纯的监测obj.email的变动,直接监测’obj.email’可能会更好:
<!--作者:zhangfan
页面名称:watch的immediate和deep--> 
<template>
  <div id="product-list-one">
    <label>
      这是一个输入框:
      <input type="text" v-model="obj.email" />
    </label>
  </div>
</template>

<script>
export default {
  data() {
    return {
      obj: {
        email: "[email protected]"
      }
    };
  },
  watch: {
    "obj.email": {
      handler: "getData"
    }
  },
  methods: {
    getData: function() {
      console.log(this.obj.email);
    }
  }
};
</script>

<style scoped>
</style>

注意,watch中不要用箭头函数,watch观察的对象不能用箭头方法,否则this是undefined。

相关标签: vue vue