Composition API

介紹

Composition API的主要思想是,我們將它們定義為從新的 setup 函數返回的JavaScript變數,而不是將組件的功能(例如state、method、computed等)定義為對象屬性。

 

案例對比

  • 下面是一個經典的vue2的計數器案例.
//Counter.vue
export default {
  data: () => ({
    count: 0
  }),
  methods: {
    increment() {
      this.count++;
    }
  },
  computed: {
    double () {
      return this.count * 2;
    }
  }
}

 

  • 下面是使用Composition API定義的完全相同的組件
// Counter.vue
import { ref, computed } from "vue";

export default {
  setup() {
    const count = ref(0);
    const double = computed(() => count * 2)
    function increment() {
      count.value++;
    }
    return {
      count,
      double,
      increment
    }
  }
}

 

ref:導入了ref函數,表示該函數允許我們定義一個響應式變數,其作用與data變數幾乎相同。

count.value:increment方法是一個普通的javascript函數,需要更改子屬性count的value才能更改響應式變數,這是因為使用red創建的響應式變數必須是對象,以便在傳遞的時候保持一致。

 

程式碼提取

Composition API的第一個明顯優點是提取邏輯很容易。使用Composition提取上面Counter.vue組件程式碼。

//useCounter.js
import { ref, computed } from "vue";

export default function () {
  const count = ref(0);
  const double = computed(() => count * 2)
  function increment() {
    count.value++;
  }
  return {
    count,
    double,
    increment
  }
}

 

程式碼重用

要在組件中使用該函數,我們只需將模組導入組件文件並調用它(注意導入是一個函數)。這將返回我們定義的變數,隨後我們可以從 setup 函數中返回它們。

// MyComponent.js
import useCounter from "./useCounter.js";

export default {
  setup() {
    const { count, double, increment } = useCounter();
    return {
      count,
      double,
      increment
    }
  }
} 

解決mixins命名衝突

在vue2中,可能會有相同命名的變數或者函數,會導致衝突,使用composition代替後,就可以解決了。

export default {
  setup () {
    const { someVar1, someMethod1 } = useCompFunction1();
    const { someVar2, someMethod2 } = useCompFunction2();
    return {
      someVar1,
      someMethod1,
      someVar2,
      someMethod2
    }
  }
}

 

Tags: