首页 > 其他分享 >Vue watch的immediate和deep

Vue watch的immediate和deep

时间:2023-05-19 15:33:38浏览次数:44  
标签:Vue obj watch deep 输入框 value getData email


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,obj,watch,deep,输入框,value,getData,email
From: https://blog.51cto.com/u_16120408/6312761

相关文章

  • 使用Vue脚手架工具快速搭建vue项目
    全局安装webpack使用npm(需要安装node环境)全局安装webpack,打开命令行工具输入:npminstallwebpack-g或者(npminstall-gwebpack),安装完成之后输入webpack-v,如下图,如果出现相应的版本号,则说明安装成功。全局安装vue-cli,在cmd中输入命令:(cnpminstall-g@vue/cli)用vue-cli来构建......
  • Vue生命周期钩子函数
    每个Vue实例创建时,都会经历一系列的初始化过程,同时也会调用相应的生命周期钩子,我们利用这些钩子,可以在合适的时机执行我们的业务逻辑。vue生命周期共分为四个阶段,八个基本钩子函数<script>exportdefault{data(){return{filter:"all",};},beforeCre......
  • less在vue项目中的全局变量设置
    1,使用全局变量的目的:sass或者less都提供变量设置,在需求切换主题的项目中使用less或者sass变量,只要修改变量值,编译后所有用到该变量的样式都会被修改为你想要的效果2,安装sass-resources-loadernpminstallsass-resources-loader--save-dev3,找到build文件夹下面的utils.jsreturn{......
  • Vue.js学习记录之在元素与template中使用v-if指令实例(转贴)
    语法比较简单,直接上代码:<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head> <title></title> <scriptsrc="https://cdn.bootcss.com/vue/2.2.2/vue.......
  • Vue路由router
    1、总体结构2、路由说明 ......
  • vue component:is 组件切换
    <template><Child1/><Child2/><component:is="currentComp"></component><el-button@click="compChange">切换组件</el-button></template><scriptsetup>import{shallo......
  • 【小小demo】Springboot + Vue 增删改查
    vue-table-ui该工程提供的是一个简单的Vue+Element-UI的表格,增删改查操作。工程代码在最下面。环境jdk1.8ideamavenspringboot2.1.1.RELEASE示例首页查询新增修改删除官方文档Element-Ui:https://element.eleme.cn/#/zh-CN/component/installationV......
  • 在 Vue 中使用 iframe 嵌套页面
    1.在Vue中引入iframe在Vue中使用iframe技术需要在组件中引入iframe标签,代码如下:<template><div><iframesrc="https://www.baidu.com"></iframe></div></template>2.设置iframe的样式在Vue中使用iframe技术需要设置iframe的样式,包括宽度、......
  • Vue 自定义指令实践
    Vue自定义指令一个自定义指令由一个包含类似组件生命周期钩子的对象来定义。钩子函数会接收到指令所绑定元素作为其参数。在 <scriptsetup> 中,任何以 v 开头的驼峰式命名的变量都可以被用作一个自定义指令。eg: 在上面的例子中,vFocus 即可以在模板中以 v-focus 的形......
  • Vue Ant Design Pro 中定制主题
    VueAntDesignPro中定制主题需求定制主题去除“正在切换主题”过渡效果 需求项目要求使用草绿色的主题色并且去除如下的loading效果定制主题这里可以参照AntDesignProofVue官方文档哦定制方式是使用 less 的modifyVars的方式进行覆盖变量官方文档......