computed

computed是计算属性,根据依赖的数据动态显示新的计算结果,计算的结果会被缓存,除非依赖的属性值变化才会重新计算。computed里面的属性虽然是函数,但是也可以不加括号,直接当属性来用。

  1. var vm = new Vue({
  2. data: { a: 1 },
  3. computed: {
  4. // 仅读取
  5. aDouble: function () {
  6. return this.a * 2
  7. },
  8. // 读取和设置
  9. aPlus: {
  10. get: function () {
  11. return this.a + 1
  12. },
  13. set: function (v) {
  14. this.a = v - 1
  15. }
  16. }
  17. }
  18. })
  19. vm.aPlus // => 2
  20. vm.aPlus = 3
  21. vm.a // => 2
  22. vm.aDouble // => 4

实现性别筛选

  1. Vue.config.productionTip = false;
  2. let id = 0;
  3. const createUser = (name, gender) => {
  4. id += 1;
  5. return { id, name, gender };
  6. };
  7. new Vue({
  8. data() {
  9. return {
  10. users: [
  11. createUser("方方", "男"),
  12. createUser("圆圆", "女"),
  13. createUser("小新", "男"),
  14. createUser("小葵", "女")
  15. ],
  16. gender:""
  17. };
  18. },
  19. computed:{
  20. displayusers(){
  21. const {users, gender} = this
  22. if(gender===""){
  23. return users
  24. }else if(typeof gender==="string"){
  25. return users.filter(item => item.gender===gender)
  26. }else {
  27. throw new Error("gender 是意外值")
  28. }
  29. }
  30. },
  31. // 如何给三个按钮加事件处理函数
  32. // 思路一:点击之后改 users
  33. // 思路二:使用 computed
  34. template: `
  35. <div>
  36. <div>
  37. <button @click="gender=''">全部</button>
  38. <button @click="gender='男'">男</button>
  39. <button @click="gender='女'">女</button></div>
  40. <ul>
  41. <li v-for="u in displayusers" :key="u.id">
  42. {{u.name}} - {{u.gender}}
  43. </li>
  44. </ul>
  45. </div>
  46. `
  47. }).$mount("#app");

watch

watch是侦听,当数据变化时,执行一个函数,方法中可传入新值(val)和旧值(oldVal),还可以定义handler方法,同时设置deep和immediate属性;还可以当Vue实例化后调用$watch;
语法如下

  1. var vm = new Vue({
  2. data: {
  3. a: 1,
  4. b: 2,
  5. c: 3,
  6. d: 4,
  7. e: {
  8. f: {
  9. g: 5
  10. }
  11. }
  12. },
  13. watch: {
  14. // 函数,可传入新值和旧值
  15. // 不要用箭头函数,没有this
  16. a: function (val, oldVal) {
  17. console.log('new: %s, old: %s', val, oldVal)
  18. },
  19. // 方法名
  20. b: 'someMethod',
  21. // 该回调会在任何被侦听的对象的 property 改变时被调用,不论其被嵌套多深
  22. c: {
  23. handler: function (val, oldVal) { /* ... */ },
  24. deep: true
  25. },
  26. // 该回调将会在侦听开始之后被立即调用
  27. d: {
  28. handler: 'someMethod',
  29. immediate: true
  30. },
  31. // 你可以传入回调数组,它们会被逐一调用
  32. e: [
  33. 'handle1',
  34. function handle2 (val, oldVal) { /* ... */ },
  35. {
  36. handler: function handle3 (val, oldVal) { /* ... */ },
  37. /* ... */
  38. }
  39. ],
  40. // watch vm.e.f's value: {g: 5}
  41. 'e.f': function (val, oldVal) { /* ... */ }
  42. }
  43. })
  44. vm.a = 2 // => new: 2, old: 1
  45. // 还可以使用$watch
  46. vm.$watch('xxx', fn, {deep:..., immediate:...})
  47. // 'xxx'可以改为一个返回字符串的函数

总结

1.如果一个数据依赖于其他数据,那么使用computed
2.如果你需要在某个数据变化时做一些事情,那么使用watch