vue的watch,computed和methods里面的方法

vue的watch和computed到底哪里不同?这个问题在我看文档的时候没有很懂,以至于我就忘记了computed也会触发更新,结果悲剧了。。。吃一堑长一智,补课走起。

第一步必须是查看文档https://cn.vuejs.org/v2/guide/computed.html

com1.png

明显上面这句话的含义是模版里面展示的数据如果需要复杂的处理后展示我们应该用计算属性(这个和监听更新并无关系),继续往下看,它给出了一个例子

<div id="example">
  <p>Original message: "{{ message }}"</p>
  <p>Computed reversed message: "{{ reversedMessage }}"</p>
</div>
var vm = new Vue({
  el: '#example',
  data: {
    message: 'Hello'
  },
  computed: {
    // 计算属性的 getter
    reversedMessage: function () {
      // `this` 指向 vm 实例
      return this.message.split('').reverse().join('')
    }
  }
})

结果:
Original message: "Hello"
Computed reversed message: "olleH"
然后我们主动修改它的依赖数据message

vm.message = 'Goodbye'
console.log(vm.reversedMessage)

此时的结果是'eybdooG'。也就是说你可以像绑定普通属性一样在模板中绑定计算属性。Vue 知道 vm.reversedMessage 依赖于 vm.message,因此当 vm.message 发生改变时,所有依赖 vm.reversedMessage 的绑定也会更新。

然后我们把上面的效果用methods里面的方法去实现一下

<div id="example">
  <p>Original message: "{{ message }}"</p>
  <p>Computed reversed message: "{{ reversedMessage() }}"</p>
</div>
var vm = new Vue({
  el: '#example',
  data: {
    message: 'Hello'
  },
  methods: {
    reversedMessage () {
      return this.message.split('').reverse().join('')
    }
  }
})

结果依然是:
Original message: "Hello"
Computed reversed message: "olleH"

也就是说我们两种方式结果是一样的(请相信每一个实现都会有差异,作者不会无缘无故实现几个没有差异的东西给你),这个时候去看文档吧~

com3.png

上面清楚的说明了一个问题,computed是缓存的只要依赖的数据不更改他就不会重新计算更新,而methods里面的方法是每次刷新都会去执行的

最后来看看watch。官方给出了一句解释叫做当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。这句话怎么理解?看看它的例子就明白了,watch 选项允许我们执行异步操作 (访问一个 API),限制我们执行该操作的频率,并在我们得到最终结果前,设置中间状态

好了文档上就这么多,我们运用到实践中会是怎么样的呢

示例一:
根据路由的变化获取id去重新请求接口并展示数据(本质上就是watch路由的变化)

watch: {
  $route () {
    this.getList() // 这里为触发请求新列表的函数
  }
}

分析:只监听一个值的变化,然后重新去计算

示例二:
进入页面之后要从store(vuex)里面去获取一个异步请求回来的数据(你不能确认开始获取是存在的)

computed: {
  menu () {
    return this.$store.state.storeMenu
  }
}

分析:this.$store.state.storeMenu这个在进入页面的时候因为需要dispatch去触发一个异步的请求所以当你获取的时候不一定存在,而当store里面存在了因为menu计算依赖的数据变化它会重新计算填充。当然你可能会说如果我直接dispatch那个函数里加一个promise然后就可以保证拿到数据了,这个当然是,例如我在action里面写成下面的方式:

export const getMenuList = ({ commit }) => {
  return new Promise((resolve, reject) => {
    fetch('xxxxxx').then(res => {
      commit(types.GET_MENU_LIST, {
        menuList: res
      })
      resolve()
    })
  })
}

上面的方式确实可以保证你有数据,但是你如果有N处要进入页面就需要展示这个数据呢?不能多次dispatch吧

methods里面的方法就不再举例子了,它的好处绝对是可掌控,你可以主动的调用,而不是主动的去监听某个数据。

根据上面的学习和自己使用的经验做一个总结:

  1. computed是计算属性,是依赖其他属性计算得出的结果;watch是监听某一个值的变化执行对应的方法
  2. computed的值在getter执行后是会缓存的,只有在它依赖的属性值改变之后,下一次获取computed的值时才会重新调用对应的getter来计算;watch在每次监听的值变化时,都会执行回调。如果一个值依赖多个属性(多对一),用computed肯定是更加方便的。如果一个值变化后会引起一系列操作,或者一个值变化会引起一系列值的变化(一对多),用watch更加方便一些
  3. watch的回调里面会传入监听属性的新旧值,通过这两个值可以做一些特定的操作;computed通常就是简单的计算
  4. methods里面的方法不包含主动监听的能力,且相对于computed来讲没有缓存能力,每次会重新执行(在SPA切换的时候比较明显);但比较灵活,可以手动去调取
  5. 它们并没有哪个更底层。watch和computed的共同之处就是每个定义的属性都单独建立了一个Watcher对象,当然这个能力是方法所不具有的
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272