computed

computed 计算属性,产生一个值,此值根据多个已有数据计算产生,并会缓存产生的值

假设当前要反转一个字符串,可以直接在模板中使用表达式,也可以使用函数,无论是直接写,还是使用函数 性能和复用性都没有计算属性好

  1. <div class="test">
  2. {{msg.split('').reverse().join('') +' ' +name}}
  3. </div>
  4. <script>
  5. const vm = new Vue({
  6. el:'#app',
  7. data:{
  8. msg:'droW-olleH',
  9. name:'生此不负'
  10. },
  11. })
  12. </script>
  • 类似于用存取描述getter 定义的对象属性,读取就会调用回调,并把返回值作为属性的值,
  • 计算属性存在缓存,多次使用也只执行一次函数,除非依赖数据发生变化,并重写执行get并缓存最新的值
  1. <div id="app">
  2. <div class="test">
  3. <button @click="update">点我一下</button> <br/>
  4. <p>{{hello}}</p><p>{{hello}}</p>
  5. </div>
  6. </div>
  7. <script>
  8. const vm = new Vue({
  9. computed: {
  10. hello() {
  11. // 初始化调用一次
  12. // 依赖数据发生变化重新调用,缓存 存储结构是对象 key-value
  13. return this.msg.split('').reverse().join('') + ' ' + name
  14. }
  15. },
  16. ----------
  17. computed: {
  18. hello: {
  19. get() {
  20. return this.msg.split('').reverse().join('') + ' ' + name
  21. },
  22. set(val) {
  23. console.log(val, '当前计算属性修改之后最新的值');
  24. }
  25. }
  26. },
  27. methods: {
  28. update() {
  29. this.hello = '速成绝无可能'
  30. }
  31. },

计算属性还可以使用set(),来监视 this.hello='peiqi'的变化,虽然赋值了 ,但只要依赖数据没有变化get没有执行,this.hello的值还是原来的

watch

watch 用来监视一个值的变化,并执行异步相应的回调

  1. watch:{
  2. name(newV,old){
  3. //新旧 值
  4. console.log(newV,old);
  5. }
  6. },
  7. methods: {
  8. update() {
  9. this.name = '速成绝无可能'
  10. console.log('异步执行');
  11. }
  12. },

数据类型分为基本数据类型,和引用数据类型,watch要检测引用数据类型,必须地址值发生变化

watch可以使用对象模式来深度检测,里面任意一个值发生变化 即可调用回调

  1. watch:{
  2. name:{
  3. deep:true,
  4. handler(val){
  5. console.log('我变化了',val);
  6. }
  7. }
  8. },

watch和computed的区别

watch:回调是异步调用,可以执行异步操作,computed是同步,不能执行异步操作

watch:适用于数据发生变化时执行异步发请求,和开销比较大的操作

computed:适用于需要一个经过复杂计算的数据,便于复用和灵活性高