watch监听,vuewatch监听

  watch监听,vuewatch监听

  学过vue2的朋友一定学过监听器,监听器主要用来监控页面数据或者路由的变化来执行相应的操作。在vue3中,也有监听器的用法,功能基本相同。这篇文章会详细告诉你。

  

目录

  观察监听器的使用情况。Listener reactive监听多个参数并执行自己的逻辑。Listener Reactive监听多个参数并执行相同的逻辑。在上一节中,我们简要介绍了vue3项目中的计算属性。本节继续讲解vue3的基础知识。

  在本节中,我们将讨论vue3的监听器。

  学过vue2的朋友一定学过监听器,监听器主要是用来监控页面数据或者路由变化来执行相应的操作。在vue3中,也有监听器的用法,功能基本相同。Listener是常用的Vue API之一,用来监听一个数据,并在数据发生变化时做一些自定义逻辑。本文将首先列出监听器在Vue中的使用方式,然后分析源代码解释为什么可以这样使用以及监听器的实现原理。让我们稍微谈一谈听众。

  

watch 侦听器使用。

  要使用watch API,至少需要指定两个参数:source和callback,其中callback被显式地指定为仅函数,所以区别在于它的使用方式实际上只在source中。

  接下来,我们来看看vue3监听器的基本用法:

  模板

  差异

  h1监视侦听器/h1

  El-输入垂直模型=num /

  英国铁路公司

  英国铁路公司

  el按钮type= primary @ click= num num 1/El按钮

  /div

  /模板

  脚本

  从“vue”导入{ watch,ref }

  导出默认值{

  setup() {

  const num=ref(1)

  手表(编号,(新值,旧值)={

  Console.log(新值:,newVal,旧值:,oldVal)

  })

  返回{ num,}

  }

  }

  /脚本

  样式范围。El-输入{

  宽度:100px

  }

  /风格

  上面的代码是页面上有一个数字,点击一次按钮,数字加一,然后监听器监听数字的变化,打印出最新值和旧值。

  好的.以上案例是vue3监听器的一个简单案例。侦听器像计算属性一样,可以创建多个侦听器。这个没问题,案例就不写了,和上一节多重计算属性的说法一致。如果你不明白,请阅读我的上一篇博客。

  我们上面说过,watch API至少需要指定两个参数:source和callback。从上面的案例可以看出,确实有两个。source是被监控的数据,callback是被监控的回调。那么为什么至少是呢?

  是的,因为他有第三个参数,——配置对象。

  在vue2中,我们打开页面就像让监听器立即执行一样,而不是在数据第一次发生变化时才开始执行。这时候有一个参数叫做immediate。该参数已设置,并将在第一次创建时执行。所以,vue3也可以用。

  当刷新并执行上述案例时,发现在点击按钮之前,也就是创建num的时候,并没有执行监听器。因此,添加immediate参数可以让监听器立即执行操作。

  模板

  差异

  h1监视侦听器/h1

  El-输入垂直模型=num /

  英国铁路公司

  英国铁路公司

  el按钮type= primary @ click= num num 1/El按钮

  /div

  /模板

  脚本

  从“vue”导入{ watch,ref }

  导出默认值{

  setup() {

  const num=ref(1)

  手表(编号,(新值,旧值)={

  Console.log(新值:,newVal,旧值:,oldVal)

  }, {

  即时:正确

  })

  返回{ num,}

  }

  }

  /脚本

  样式范围。El-输入{

  宽度:100px

  }

  /风格

  我们可以看到,在刷新页面后,控制台在单击按钮将num加1之前有数据要打印。为什么?因为我们将immediate添加到true,所以让监听器立即执行。控制台输出最新的值,也就是我们初始化的值1。旧值不可用,因此它输出undefined。

  

侦听器监听 reactive

  上面说了监听器监听单个数据,也可以用来监听对象的变化。

  模板

  差异

  h1监视侦听器/h1

  el-input v-model=num.age /

  英国铁路公司

  英国铁路公司

  el按钮type= primary @ click= num . age num 1/El按钮

  /div

  /模板

  脚本

  从“vue”导入{观察、参考、反应}

  导出默认值{

  setup() {

  常数=反应性({

  姓名:“我是。”,

  年龄:10岁

  })

  手表(编号,(新值,旧值)={

  console.log(newVal,oldVal)

  })

  返回{ num }

  }

  }

  /脚本

  样式范围。El-输入{

  宽度:100px

  }

  /风格

  例如,在上面的代码中,我们监听对象num的变化。

  看效果。监听整个reactive对象时,里面的属性值发生变化时确实可以被监听器检测到,但是newVal和oldVal的值是新的,默认值是10。点击后新值是11很正常,但旧值不应该是10吗?为什么这里旧值11像新值?

  这是毫无疑问的。如果监控整个无功数据,只能回调到最新值,不能得到旧值。

  那么问题来了,我会修改年龄属性,我会得到年龄的旧值。我该怎么办?其实我们只需要监测num下的年龄就可以了。先看下面的代码。

  模板

  差异

  h1监视侦听器/h1

  el-input v-model=num.age /

  英国铁路公司

  英国铁路公司

  el按钮type= primary @ click= num . age num 1/El按钮

  /div

  /模板

  脚本

  从“vue”导入{观察、参考、反应}

  导出默认值{

  setup() {

  常数=反应性({

  姓名:“我是。”,

  年龄:10岁

  })

  watch(数字年龄,(新值,旧值)={

  console.log(newVal,oldVal)

  })

  返回{ num }

  }

  }

  /脚本

  样式范围。El-输入{

  宽度:100px

  }

  /风格

  我们的监控对象直接是num.age,监控age属性值,保存看看效果。

  结果可以看到我们什么都没做,监听者直接给我们报了警告。你什么意思?其实我们不能这样直接监控。

  当我们需要监控一个对象属性时,不能直接通过object point属性来监控,而是需要传入一个getter方法,也就是arrow函数。下面的代码才是正确的做法。

  模板

  差异

  h1监视侦听器/h1

  el-input v-model=num.age /

  英国铁路公司

  英国铁路公司

  el按钮type= primary @ click= num . age num 1/El按钮

  /div

  /模板

  脚本

  从“vue”导入{观察、参考、反应}

  导出默认值{

  setup() {

  常数=反应性({

  姓名:“我是。”,

  年龄:10岁

  })

  watch(()=num.age,(newVal,oldVal)={

  console.log(newVal,oldVal)

  })

  返回{ num }

  }

  }

  /脚本

  样式范围。El-输入{

  宽度:100px

  }

  /风格

  好了,保存刷新,我们发现监听器已经停止报错了,当我们点击按钮把年龄加1的时候,就可以平滑的监控年龄的变化,回调最新的值和最后的值。

  通过箭头功能,我们可以监控对象属性。

  很多人说vue2在听对象的时候需要设置深度听听者。vue3为什么不需要这个?因为他听的是有反应的对象,默认是深度倾听。但是,如果您正在监听数组中深度嵌套的对象或属性更改,您仍然需要将deep选项设置为true。

  看看下面的例子,我们监视深度嵌套的时间属性值。其实我觉得没必要。实际上不使用箭头函数也是可以的。但是让我们把它写下来。

  模板

  差异

  h1监视侦听器/h1

  El-input v-model= num . todo . time /

  英国铁路公司

  英国铁路公司

  El-button type=" primary " @ click= num . todo . time num . todo . time 1/El-button

  /div

  /模板

  脚本

  从“vue”导入{观察值、参考值、反应值、计算值}

  导出默认值{

  setup() {

  常数=反应性({

  姓名:“我是。”,

  年龄:10岁,

  待办事项:{

  姓名:“弹吉他”,

  时间:1

  }

  })

  watch(()=num,(newVal,oldVal)={

  console.log(newVal.todo.time,oldVal.todo.time)

  })

  返回{ num }

  }

  }

  /脚本

  样式范围。El-输入{

  宽度:100px

  }

  /风格

  保存代码并刷新。我发现点了之后就不听了。

  这时候可以添加深度监控。

  模板

  差异

  h1监视侦听器/h1

  El-input v-model= num . todo . time /

  英国铁路公司

  英国铁路公司

  El-button type=" primary " @ click= num . todo . time num . todo . time 1/El-button

  /div

  /模板

  脚本

  从“vue”导入{观察值、参考值、反应值、计算值}

  导出默认值{

  setup() {

  常数=反应性({

  姓名:“我是。”,

  年龄:10岁,

  待办事项:{

  姓名:“弹吉他”,

  时间:1

  }

  })

  watch(()=num,(newVal,oldVal)={

  console.log(newVal.todo.time,oldVal.todo.time)

  },{ deep: true })

  返回{ num }

  }

  }

  /脚本

  样式范围。El-输入{

  宽度:100px

  }

  /风格

  加上深度倾听{deep:true}

  我们可以看到信息被打印出来了。其实我觉得这个方法有点多余,但是如果用了呢?哈哈哈哈,根据情况选择使用。

  但是有一点要注意!深度监听需要遍历被监听对象中的所有嵌套属性,这在大型数据结构中使用时开销很大。所以请只在必要的时候使用,并注意性能。

  

监听多个参数执行各自逻辑

  一开始我不想说,但是我已经被迫依赖莱莱很久了。我简单提一下。

  比如我们需要听多个参数,就说两个参数吧。然后,每个参数听完之后,执行逻辑就不一样了。我们可以创建多个监听器分别监听,不用写所有代码,只写关键代码。

  //第一个

  手表(编号,(新值,旧值)={

  console.log(newVal,oldVal)

  })

  //第二个

  手表(()=boy.age,(newVal,oldVal)={

  console.log(newVal,oldVal)

  })

  

监听多个参数执行相同逻辑

  这意味着无论num改变还是boy.age改变,我执行的代码都是相同的。看下面这个案例:

  模板

  差异

  h1监视侦听器/h1

  el-input v-model=num.name /

  el-input v-model=num.age /

  英国铁路公司

  英国铁路公司

  El-button type=" primary " @ click= num . todo . time num . todo . time 1/El-button

  /div

  /模板

  脚本

  从“vue”导入{观察值、参考值、反应值、计算值}

  导出默认值{

  setup() {

  常数=反应性({

  姓名:“我是。”,

  年龄:10岁,

  待办事项:{

  姓名:“弹吉他”,

  时间:1

  }

  })

  手表([()=编号名称,()=编号年龄],(新值,旧值)={

  console.log(newVal,oldVal)

  })

  返回{ num }

  }

  }

  /脚本

  样式范围。El-输入{

  宽度:100px

  }

  /风格

  保存页面并修改名称和年龄的值。

  上面我们以数组的形式传入数据源,返回的回调参数、新值、旧值都以数组的形式返回。新值和旧值数组中的顺序就是我们数据源传入的顺序,可以看出来。

  如果不想让他返回数组,可以这样改。其实也差不多。了解一下,根据实际情况有选择地使用就可以了。

  模板

  差异

  h1监视侦听器/h1

  el-input v-model=num.name /

  el-input v-model=num.age /

  英国铁路公司

  英国铁路公司

  El-button type=" primary " @ click= num . todo . time num . todo . time 1/El-button

  /div

  /模板

  脚本

  从“vue”导入{观察值、参考值、反应值、计算值}

  导出默认值{

  setup() {

  常数=反应性({

  姓名:“我是。”,

  年龄:10岁,

  待办事项:{

  姓名:“弹吉他”,

  时间:1

  }

  })

  手表([()=编号名称,()=编号年龄],([新名称,新年龄],[旧名称,旧年龄])={

  console.log(新名称、新年龄、旧名称、旧年龄)

  })

  返回{ num }

  }

  }

  /脚本

  样式范围。El-输入{

  宽度:100px

  }

  /风格

  保存看看效果。

  以上是Vue3中监听器手表的使用教程的详细讲解。更多关于Vue3中监听器观察的信息,请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: