iT邦幫忙

0

Vue的data是不是有BUG

  • 分享至 

  • xImage

各位Vue大佬身體健康

小弟最近利用動態class渲染資料的時候發現 data或props上沒有事先綁定也可以達到效果

不知道是什麼問題

https://codepen.io/ofcourse448/pen/yLYNeMy

data() { return { table: [ { name: "Tomas", moeny: "50" }, { name: "Helen", moeny: "100" }, { name: "John", moeny: "150" } ], beChooseItem: '' }; },
在codepen上 我是故意少綁定這個 beChooseItem: ''
原因是在我目前的專案之中 我忘記事先綁定 但在點擊按鈕卻有CSS效果讓我很納悶
不過我在codepen上重新測試這段程式碼卻發現不起效果 然而有一個地方可以佐證我的說法就是在codepen上打開devtool工具並點擊click會看到並沒有報錯 而且還會顯示出我的動態class確實有吃到html餵給它的資料

我懷疑created生命週期時候做的this.beChooseItem = '' ,就算是宣告這個變數了,那如果是,為何又無法渲染

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
3
EN
iT邦好手 1 級 ‧ 2020-04-12 22:15:21
最佳解答

如果我沒有理解錯,你可以去了解一下Vue.js是如何做到資料驅動的。
你這項bug在Vue3.0中應該是不會遇到的!
當然,如果你不想在Vue2遇到這個問題可以使用Vue.set就好,詳見官方api
資料驅動的關鍵字:defineProperty,Proxy
你也可以參考:點我點我!

0
小碼農米爾
iT邦高手 1 級 ‧ 2020-04-13 15:31:11

codepen 上的程式看起來沒有 bug
可以把 this 印出來看看

click(item) {
    this.beChooseItem = item.name;
    console.log(this)
}

綁定成功的屬性必須要有 getter/setter
如下圖第二個框框內的 table
而 beChooseItem 只有一般的屬性,並沒有 getter/setter

https://ithelp.ithome.com.tw/upload/images/20200413/20106865il7sSGjIcT.jpg

created 其實只是設定了一般屬性
想要在 data 以外綁定屬性
需要使用 Peter學程式 大提到的 Vue.set

可以參考文件: https://cn.vuejs.org/v2/guide/reactivity.html#%E5%AF%B9%E4%BA%8E%E5%AF%B9%E8%B1%A1

EN iT邦好手 1 級 ‧ 2020-04-13 15:39:35 檢舉

補充一下:
應該是說在created宣告的話並不會被Vue的觀察機制注意到,這就是利用defineProperty做到資料驅動所帶來的痛點,所以Vue 3才會用Proxy將其取代掉/images/emoticon/emoticon02.gif
最後的最後:我才不是什麼大大,我只是廢物大學生XD

peter哥 我已是前端工程師 我慚愧/images/emoticon/emoticon02.gif

peter 哥用詞比較準確,Vue3 改觀察機制這個我倒是沒有 follow 到。

0
albert41
iT邦新手 3 級 ‧ 2020-04-13 18:24:37

大大的問題應該是 v-for 的問題。

當 button clicked 的時候,每個 v-for 裡面的資料沒被修改,因此不會觸發 Vue re-render 畫面 (點我看更多 XD)。

驗證如下:

  // 略
  methods: {
    click(item) {
      this.beChooseItem = item.name;
      
      // item 的資料有變動,Vue 才會 re-render,class property 也才會重新被計算
      item.name = undefined;
      item.name = this.beChooseItem;
    }
  }

我要發表回答

立即登入回答