vue-watch 基本使用以及高价使用以及回调函数的详细

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue-watch 基本使用以及高价使用以及回调函数的详细相关的知识,希望对你有一定的参考价值。

参考技术A Watch的使用场景

1,主要任务就是监控变量的变化,一个数据影响多个数据

watch的特点:

1.当变量变化时调用函数

2.如果不设置immediate则在初始绑定值时不会执行

watch有两个选项:

1.deep选项:表示深层遍历,当需要监控对象内部值的变化时,可以在选项参数中指定 deep: true。注意监听数组的变动不需要这么做

2.immediate选项:如果在选项参数中指定 immediate: true,将立即触发监控中变量的函数(如果我们需要在最初绑定值的时候也执行监控函数,就需要用到immediate属性)

一,在vue中基本用法

<p>FirstName: <input type="text" v-model="firstName"></p>

data()

            return

              firstName: 'Dawei',

           

        ,

Watch:

//firstName是data的return返回对象中的数组变量,newName是属性变化后的值,oldName是属性变化前的值

firstName(newName, oldName)

          // this.fullName = newName + ' ' + this.lastName;

          console.log(newName)

          console.log(oldName)

        ,



二,使用 immediate和handler

使用场景:

当值第一次绑定的时候,不会执行监听函数,只有值发生改变才会执行

当父组件向子组件动态传值时,子组件props首次获取到父组件传来的默认值时,也需要执行函数,此时就需要将immediate设为true

firstName:

          handler(newName, oldName)

            console.log(newName)

            console.log(oldName)

          ,

          immediate: true

       

监听的数据后面写成对象形式,包含handler方法和immediate,之前我们写的函数其实就是在写这个handler方法;

immediate表示在watch中首次绑定的时候,是否执行handler,值为true则表示在watch中声明的时候,就立即执行handler方法,值为false,则和一般使用watch一样,在数据发生变化的时候才执行handler。

三,deep

当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的改变,只有data中的数据才能够监听到变化,此时就需要deep属性对对象进行深度监听。

  firstName:

          handler(newName, oldName)

            console.log(newName)

            console.log(oldName)

          ,

          deep: true,

          immediate: true

       

在使用 Vue-watch 监视的对象数组中,如何获取已更改对象的索引?

【中文标题】在使用 Vue-watch 监视的对象数组中,如何获取已更改对象的索引?【英文标题】:In an array of obects watched with Vue-watch, how to get index of object that was changed? 【发布时间】:2019-04-27 11:03:24 【问题描述】:

我有一个对象数组,如下所示:

 myArray: [
 name: "First",
 price: 10,
 rebate: 5,
 listPrice: 15,
 outcome: 0
 ,
 name: "Second",
 price: 11,
 rebate: 5,
 listPrice: 16,
 outcome: 0

每当同一对象中的任何其他值发生变化时,我都想重新计算outcome-值。

我已经有这样的设置,但它会查找任何对象中的更改,然后重新计算整个数组。我已经设法通过使用computedwatch 函数的组合来设置它。然而,他们观察整个数组的变化,然后重新计算数组中所有对象的结果值。

我怎样才能观察变化然后重新计算只改变了的对象

以下是我当前用于重新计算整个数组的函数(查看另一个属性),但我正在寻找的可能完全不同。

计算:

myArrayWasChanged() 
return [this.myArray.reduce((a, vendors) => a + vendors, 0), this.myArray.filter(item => item.discounted == false).length] 

观看:

myArrayWasChanged: 
handler: function (val, oldVal) 
this.recalculateIsVendor();

【问题讨论】:

【参考方案1】:

鉴于outcome 完全依赖于其他属性,它实际上并不是组件状态的一部分。因此,在组件的data 中,您可以存储没有outcome 的数组,然后计算新版本的数组将结果 作为计算属性。

data: function () 
  return 
    myArrayWithoutOutcome: [
    
      name: "First",
      price: 10,
      rebate: 5,
      listPrice: 15
    ,
    
      name: "Second",
      price: 11,
      rebate: 5,
      listPrice: 16
    ]
  
,
computed: 
  myArrayWithOutcome: function () 
    return this.myArrayWithoutOutcome.map(x => 
      return ...x, outcome: this.calculateOutcome(x)
    )
  
,
methods: 
  calculateOutcome(item) 
    // Logic to calculate outcome from item goes here
    return 0
  

【讨论】:

感谢您的建议,它确实有效。这不是我想象的解决方案,但我想我需要学习:-) 如果我想将outcome 添加到原始数组,而不是创建一个新数组。我还能以某种方式使用这种方法吗? 计算属性不应修改数据,因此您可能必须使用手表来实现这一点。这个解决方案听起来很冒险——如果可能的话,我会尽量避免将计算值放入组件数据中,因为它们太容易不同步了。 感谢您的评论,是的,这是我最初向观察者提出的问题 :-)

以上是关于vue-watch 基本使用以及高价使用以及回调函数的详细的主要内容,如果未能解决你的问题,请参考以下文章

硬盘缓存使用类SHDiskCache,缓存的基本操作时长管理以及数据回调

Vue-watch 中的 deep 和 immediate 的理解

promise和async的区别

js异步回调Async/Await与Promise区别

4000+股票从上市到现在的数据(最高价最低价换手率等)以及其他大量的金融数据

39.JavaScript中Promise的基本概念使用方法,回调地狱规避链式编程