iT邦幫忙

0

Vue心得筆記(1) -- array的響應

  • 分享至 

  • xImage
  •  

版本: Vue.js v2.6.10
使用方式:

<html>
<head>
  <script src="https://unpkg.com/vue/dist/vue.js"></script>
</head>
<body>
  <!-- your HTML code with Vue-->
</body>
</html>

你發現了嗎? Vue對 array成員內容的異動是無響應的:

  <div id="app">
    array內容 -- {{ myArray }}
    <br>
    <input type="button" @click="myClick()">Click and view console</input>
  </div>

  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        myArray: [1, 2, 3, 4, 5]
      },
      methods: {
        myClick() {
          this.myArray[1] += 100
          console.log(this.myArray, 'array內容改變了,但畫面沒有響應')
        },
      }
    });
  </script>

加個watch觀察一下...確定靜悄悄:

      watch: {
        myArray: {
          handler: function (vnew, vold) {
            console.log(vnew, 'watch it!');
          },
          deep: true //drill down sensor
        }
      },

開始解釋了...
這是JS的特性嘛~array參照沒變,還是原來那個...

不然改成 object試看看:

      ...
      object內容 -- {{ myObj }}
      ...
      
      data: {
        myObj: { id: 10, age: 20, year: 150, qty: 0 }
      },
      //....
      methods: {
        myClick() {
          this.myObj.qty += 100
          console.log(this.myObj, 'object內容改變了,響應正常')
        },
      }

人家對 object有響應哩!
/images/emoticon/emoticon09.gif

怎解?
簡單,動一下本尊就行:

      methods: {
        myClick() {
          this.myArray[1] += 100
          //--------------
          let tmp = this.myArray
          this.myArray = [];
          this.myArray = tmp;
          //--------------
          console.log(this.myArray, 'array內容改變了,畫面響應了')
        },
      }

好像有點遜...
/images/emoticon/emoticon28.gif
不然就抓個有響應的伴下水,看你要不要渲染
...暴力/images/emoticon/emoticon05.gif

      ...
      array內容 -- {{ myArray }} {{ cnt }}  <!--(3)-->
      ...
      
      data: {
        myArray: [1, 2, 3, 4, 5],
        cnt: 0  //(1)
      },
      //....
      methods: {
        myClick() {
          this.cnt++  //(2)
          this.myArray[1] += 100
          console.log(this.myArray, 'array內容改變了,畫面響應了')
        },
      }

原來這也是我到今天才發現 array不會響應的原因 (因為跟著其它的一起渲染了)

還有這個原因

      data: {
        myArray: [1, 2, 3, 4, {id: 5} ],   //(1)
      },
      //....
      methods: {
        myClick() {
          this.myArray[4].id += 100   //(2)
          console.log(this.myArray, 'array內容改變了,畫面響應了')
        },
      }

Vue對 Object真的比較有感覺.../images/emoticon/emoticon51.gif

網路上有更多解法:

https://pjchender.blogspot.com/2017/05/vue-vue-reactivity.html


解法整理:

  1. 改變 array參照
  2. 隨附其它會響應的 data一起渲染
  3. 修改 array成員內容時改用 this.$set
  4. 這些在 array上的 function能促使 Vue重新渲染畫面:
    push()、pop()、shift()、unshift()、splice()、sort()、reverse()。

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言