Vue3 不會像 Vue2 那樣對類別字段內部更新做出反應
P粉274161593
P粉274161593 2024-01-29 12:45:06
0
1
374

我注意到,在Vue2 中,您可以將元素綁定到類別的屬性,並且當此類屬性從Vue 世界之外的某個位置更改時,該元素將會更新,但這在Vue3 中似乎不可能。

我在這裡創建了兩個簡單的範例來說明我的意思:

Vue2:https://codesandbox.io/s/vue2-6hztv

Vue3:https://codesandbox.io/s/vue3-o2rfn

有一個類別有一個內部計時器,它將增加類別欄位。在 Vue2 中,綁定到 myClass.field 的元素已正確更新,但在 Vue3 中沒有任何反應。

我的問題是

<强>1。為什麼這裡Vue2和Vue3有差別?

<强>2。我怎麼能實現類似 Vue2 範例但在 Vue3 中的效果?

請注意,我無法在 Vue 生命週期方法中執行計時器。類別字段需要自行更新。

這是不起作用的 Vue3 程式碼:

HTML:

<div id="app">{{ myClass.field }}</div>

Javascript:

class MyClass {
  field = 0;

  constructor() {
    setInterval(() => {
      this.field++;
    }, 1000);
  }
}

export default {
  data() {
    return {
      myClass: new MyClass(),
    };
  },
};

P粉274161593
P粉274161593

全部回覆(1)
P粉709644700

此答案所述,在 Vue 3 中建立代理物件以啟用反應性。建構子中的 this 引用原始類別實例而不是代理,因此它不能是響應式的。

解決方案是將類別建構子和期望 this 具有反應性的副作用設定分開。設定方法可以實現流暢的介面模式,使其更易於使用:

class MyClass {
  field = 0;

  init() {
    setInterval(() => {
      this.field++;
    }, 1000);

    return this;
  }
}

在選項 API 中它是:

data() {
    return {
      myClass: new MyClass(),
    };
  },
  created() {
    this.myClass.init();
  }

在組合API中它是::

const myClass = reactive(new MyClass()).init();
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板