Vue3 Composition API

更新於 發佈於 閱讀時間約 8 分鐘

續上篇,那是Vue 2 Options API的舊寫法,這邊改成用Vue 3 Composition API的寫法:

Vue2:

raw-image

Vue3 setup() / ref / reactive

raw-image
...
import { ref, reactive } from "vue";
...
setup() {
  const name = ref("Vic");
  const names = reactive([
    { title: "Vic", value: "Vic" },
    { title: "Allen", value: "Allen" },
    { title: "Amy", value: "Amy" },
  ]);
  return { name, names };
}
...
  1. Composition API可以直接在setup()裡面定義data跟method,簡潔許多。
  2. setup() 就等於Vue2生命週期的beforeCreate、created。
  3. Vue2 destroyed = Vue3 onUnmounted。

reactive跟ref的差別

L27其實也可以用ref來定義,reactive跟ref的差別:

  • ref: 不限資料型態,不會對 Object 或 Array 內部的屬性做監聽,存取資料需要.value。
  • reactive: 只能是Object或Array資料型態,可以做深層監聽,存取資料不需要.value。

#關於存取資料需不需要.value,可看這個範例:

raw-image
raw-image

#關於監聽的部分,可以看下面的範例:

raw-image
raw-image

這邊可以發現,只有name2 ref: 這個console沒有print出來,原因跟上述的一樣,因為ref不會對 Object 或 Array 內部的屬性做監聽,所以雖然事實上值的確改變了,但是watch不到,也就不會有print log。

所以如果資料型態是Object or Array,而且希望value改變的時候可以watch的到,就可以使用reactive。


使用axios抓取資料

在DOM 渲染完成後,使用axios打API拿資料,可以用onMounted method,使用axios可選擇CDN或本地安裝:

$ npm install axios

假設後端api url與資料如下:

raw-image
raw-image
import { ref, reactive, onMounted } from "vue";
import axios from "axios";
onMounted(() => {
  axios
  .get("http://localhost/redis/public/api/order")
  .then(function (response) {
    console.log(response);
    name.value = response.data.message;
  })
  .catch(function (error) {
    console.log(error);
  });
});

then中的response console log如下:

raw-image

common function

可以直接設計一個.js檔案,裡面可以直接寫script,computed是在count資料改變時再做計算。

raw-image
import { ref, computed } from "vue";

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

使用時直接import,可以直接存取變數, function等等,這邊直接讓按鈕click的時候觸發increment function。

raw-image
import Counter from "@/utils/Counter.js";
const { count, double, increment } = Counter();

一開始count跟double都是0,按第一下按鈕:

raw-image

按第二下按鈕:

raw-image



props

  • 用來將父元件的資料傳遞給子元件。

- 父元件:

raw-image

- 子元件:
L8用來定義外部傳來的props,L9 setup()第一個參數即是props。

raw-image
raw-image

如上,如果是字串不需要加「v-bind:」或簡寫「:」,如果是其他type則需要加,否則都會變成是字串型態:

  • 有加v-bind:
raw-image
raw-image
  • 沒加v-bind:
raw-image
raw-image
  • v-bind可省略,以下兩者寫法一樣意思:
v-bind:parent-msg
:parent-msg

emit

  • 用來將子元件的事件與資料傳遞給父元件。

- 父元件:
@testButtonClick用來當子元件emit testButtonClick時,要呼叫onTestButtonClick function。

raw-image

- 子元件:
當click test button會觸發testButtonSelfClick function,當emit testButtonClick,則會呼叫父元件的onTestButtonClick function,並將參數帶過去。

L8用來定義emits,與父元件的@testButtonClick是對應的,L12則是真正emit out 父層。

raw-image

- test button click結果:

raw-image



本筆記參考:
1. https://ithelp.ithome.com.tw/articles/10259305
2. https://medium.com/web-design-zone/%E5%9C%A8vue-js%E4%B8%AD%E4%BD%BF%E7%94%A8axios%E5%8F%96%E5%BE%97%E8%B3%87%E6%96%99-8db6aec9157d
3. https://www.tpisoftware.com/tpu/articleDetails/2530
4. https://ithelp.ithome.com.tw/articles/10278236
5. https://www.tpisoftware.com/tpu/articleDetails/2459
6. https://ithelp.ithome.com.tw/articles/10223518
7. https://stackoverflow.com/questions/64605807/vuejs-3-emit-event-from-child-to-parent-component







留言
avatar-img
留言分享你的想法!
avatar-img
Vic Lin的沙龍
20會員
161內容數
Vic Lin的沙龍的其他內容
2023/08/13
父元件 傳遞方法使用@ <template>    ...    <Login @modalClose="modalClose"/> ... </template> <script setup>     const _modal = ref();     function m
2023/08/13
父元件 傳遞方法使用@ <template>    ...    <Login @modalClose="modalClose"/> ... </template> <script setup>     const _modal = ref();     function m
2023/03/25
前情提要 由於我的筆電已經用了10年,無法再戰下去了,且有預算考量,加上使用電腦幾乎都是定點,只有偶爾回家的時候會需要攜帶,因此最終選擇了迷你電腦,體積小不占空間,又方便攜帶,剛好符合我的需求。 菜單 由於這台無法裝獨顯,所以CPU的部分選擇 AMD R5 3400G(含Vega 11內
Thumbnail
2023/03/25
前情提要 由於我的筆電已經用了10年,無法再戰下去了,且有預算考量,加上使用電腦幾乎都是定點,只有偶爾回家的時候會需要攜帶,因此最終選擇了迷你電腦,體積小不占空間,又方便攜帶,剛好符合我的需求。 菜單 由於這台無法裝獨顯,所以CPU的部分選擇 AMD R5 3400G(含Vega 11內
Thumbnail
2023/03/10
Nuxt3中可使用useFetch來獲取數據,不須再引用axios,相當方便: 本筆記參考: https://juejin.cn/post/7104071421160063012 https://juejin.cn/post/7086472647575339045
2023/03/10
Nuxt3中可使用useFetch來獲取數據,不須再引用axios,相當方便: 本筆記參考: https://juejin.cn/post/7104071421160063012 https://juejin.cn/post/7086472647575339045
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
各位使用 Vue.js 開發的小夥伴們,你們都怎麼實作父子層組件資料的雙向綁定呢?如果你還在寫 prop + emit 的話,不妨進來看看吧。
Thumbnail
各位使用 Vue.js 開發的小夥伴們,你們都怎麼實作父子層組件資料的雙向綁定呢?如果你還在寫 prop + emit 的話,不妨進來看看吧。
Thumbnail
到底要用 ref 還是 reactive 是一個很常見的問題,不過現在官方文檔推薦使用 ref 就行,所以也不是甚麼大問題就是了。( •̀ ω •́ )✧ 所以 reactive 真的沒用用途了嗎?這篇文章來記錄一下 reactive 的用法。
Thumbnail
到底要用 ref 還是 reactive 是一個很常見的問題,不過現在官方文檔推薦使用 ref 就行,所以也不是甚麼大問題就是了。( •̀ ω •́ )✧ 所以 reactive 真的沒用用途了嗎?這篇文章來記錄一下 reactive 的用法。
Thumbnail
Vue3 筆記,指令進階篇
Thumbnail
Vue3 筆記,指令進階篇
Thumbnail
Vue3 學習筆記,元件與資料傳遞篇
Thumbnail
Vue3 學習筆記,元件與資料傳遞篇
Thumbnail
Vue3 學習筆記,專案建立與基礎響應式篇
Thumbnail
Vue3 學習筆記,專案建立與基礎響應式篇
Thumbnail
定義路由 首先先來定義路由,先把上一篇寫的 home.vue 定義在根路由。 打開 src/router/index.ts,在 routes 內定義 path 定義 url,component 定義要指向哪個 vue 頁面,component:()=>import('@/components/hom
Thumbnail
定義路由 首先先來定義路由,先把上一篇寫的 home.vue 定義在根路由。 打開 src/router/index.ts,在 routes 內定義 path 定義 url,component 定義要指向哪個 vue 頁面,component:()=>import('@/components/hom
Thumbnail
專案建好了,那先來講 Vue 的專案架構 詳細內容很多,所以我挑重點講 public index.html public/index.html 是 Vue 頁面的 entry point,進入一個 Vue 頁面會先進 public/index.html,再套用 App.vue,最後才是進入你寫的 .
Thumbnail
專案建好了,那先來講 Vue 的專案架構 詳細內容很多,所以我挑重點講 public index.html public/index.html 是 Vue 頁面的 entry point,進入一個 Vue 頁面會先進 public/index.html,再套用 App.vue,最後才是進入你寫的 .
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News