Vue3 Composition API

更新於 2022/11/10閱讀時間約 7 分鐘
續上篇,那是Vue 2 Options API的舊寫法,這邊改成用Vue 3 Composition API的寫法:
Vue2:

Vue3 setup() / ref / reactive

...
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,可看這個範例:
#關於監聽的部分,可以看下面的範例:
這邊可以發現,只有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與資料如下:
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如下:

common function

可以直接設計一個.js檔案,裡面可以直接寫script,computed是在count資料改變時再做計算。
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。
import Counter from "@/utils/Counter.js";
const { count, double, increment } = Counter();
一開始count跟double都是0,按第一下按鈕:
按第二下按鈕:

props

  • 用來將父元件的資料傳遞給子元件。
- 父元件:
- 子元件:
L8用來定義外部傳來的props,L9 setup()第一個參數即是props。
如上,如果是字串不需要加「v-bind:」或簡寫「:」,如果是其他type則需要加,否則都會變成是字串型態:
  • 有加v-bind:
  • 沒加v-bind:
  • v-bind可省略,以下兩者寫法一樣意思:
v-bind:parent-msg
:parent-msg

emit

  • 用來將子元件的事件與資料傳遞給父元件。
- 父元件:
@testButtonClick用來當子元件emit testButtonClick時,要呼叫onTestButtonClick function。
- 子元件:
當click test button會觸發testButtonSelfClick function,當emit testButtonClick,則會呼叫父元件的onTestButtonClick function,並將參數帶過去。
L8用來定義emits,與父元件的@testButtonClick是對應的,L12則是真正emit out 父層。
- test button click結果:
為什麼會看到廣告
avatar-img
21會員
161內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Vic Lin的沙龍 的其他內容
本筆記除了以文字說明SOLID設計原則以外,並以Java code實際舉例。 Single Responsibility Principle (SRP) 單一職責原則 每個人負責屬於自己的職責,不該承擔太多職責,大家各自做自己應該做的事情,且不會互相干擾。 續上程式碼,修改如下: Output:
data() method 續上篇,這邊修改一下HomeView.vue的code。 Before: After: 在頁面最下方顯示 name: Vic,data method直接回傳name變數,在<template>中可以直接用{{ name }}將變數顯示出來。 結果如下: v-model
Vue CLI與React的create-react-app是類似的工具,目的都是為了讓開發者快速建置環境,節省複雜的安裝相關環境的時間,簡單的一個建立專案指令與設定,即建立一個內建了Hot-Reload, webpack, ESLint等功能的專案。 安裝Vue CLI: 選擇檢查程式碼的時機
假設資料如下: local DB裡面的test Collection SELECT SELECT可以這樣寫: 由於config/database.php中設定的default DB_CONNECTION是mysql,所以這邊特別指定使用mongodb connection。 回傳結果如下: 軟刪除
欲在Laravel中使用MongoDB,首先要確認有安裝MongoDB PHP driver,接著再安裝Laravel MongoDB套件,才能開始使用CRUD。 1. 安裝MongoDB PHP driver (1) 到這邊下載MongoDB PHP driver (3) 檢查是否正常 後記:
MongoDB 簡介 MongoDB是一種開源的NoSQL文件資料庫(Document Database),MongoDB中可以有多個Database,每個Database中可以有多個Collection,每個Collection中可以有多個Document。 Windows 安裝 MongoDB
本筆記除了以文字說明SOLID設計原則以外,並以Java code實際舉例。 Single Responsibility Principle (SRP) 單一職責原則 每個人負責屬於自己的職責,不該承擔太多職責,大家各自做自己應該做的事情,且不會互相干擾。 續上程式碼,修改如下: Output:
data() method 續上篇,這邊修改一下HomeView.vue的code。 Before: After: 在頁面最下方顯示 name: Vic,data method直接回傳name變數,在<template>中可以直接用{{ name }}將變數顯示出來。 結果如下: v-model
Vue CLI與React的create-react-app是類似的工具,目的都是為了讓開發者快速建置環境,節省複雜的安裝相關環境的時間,簡單的一個建立專案指令與設定,即建立一個內建了Hot-Reload, webpack, ESLint等功能的專案。 安裝Vue CLI: 選擇檢查程式碼的時機
假設資料如下: local DB裡面的test Collection SELECT SELECT可以這樣寫: 由於config/database.php中設定的default DB_CONNECTION是mysql,所以這邊特別指定使用mongodb connection。 回傳結果如下: 軟刪除
欲在Laravel中使用MongoDB,首先要確認有安裝MongoDB PHP driver,接著再安裝Laravel MongoDB套件,才能開始使用CRUD。 1. 安裝MongoDB PHP driver (1) 到這邊下載MongoDB PHP driver (3) 檢查是否正常 後記:
MongoDB 簡介 MongoDB是一種開源的NoSQL文件資料庫(Document Database),MongoDB中可以有多個Database,每個Database中可以有多個Collection,每個Collection中可以有多個Document。 Windows 安裝 MongoDB
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
這篇文章記錄了如何在網頁中使用<iframe>或套件vue3-google-map來實現Google Map呈現,並在上面設置圖釘。兩種方法的優缺點也有相關的說明。想要在網頁上加入Google Map及設置圖釘的讀者可以參考這篇文章。
最近在把 Tailwind CSS 加入我的技能樹中,其實像這種 Bootstrap, Tailwind CSS 都是很基本前端需要掌握的 CSS 相關工具 但是我其實對美工比較沒那麼大的興趣,我對功能、效能、安全比較感興趣,所以後端、架站、DevOps、一些安全防護玩了一圈,現在來加強我的排版功力
Thumbnail
前言 Vue 在過去的一兩年內快速發展,寫法也一直改變,我在過去一年多也更改了兩次寫法,在這個系列中我將以最新的 composition api + typescript 寫法進行教學。 javascript 有兩大痛點,一個是異步問題,另一個是弱型別。要渲染畫面一定要多線程同時異步處理,不然真的一
State management 首先我們先來寫一些前台存 token 和刪除 token 的方法在 vuex sate management,檔案位置在 src/store/index.ts Login 所有頁面每隔一段時間自動刷新 token Logout
Thumbnail
Create project 裝好 vue CLI 之後,只要在終端輸入 vue create 想取的專案名稱 就可以開始創建 vue 專案囉 1. Pick a preset 2. Select the features 3. Choose the version of vue 選擇 vue3
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
這篇文章記錄了如何在網頁中使用<iframe>或套件vue3-google-map來實現Google Map呈現,並在上面設置圖釘。兩種方法的優缺點也有相關的說明。想要在網頁上加入Google Map及設置圖釘的讀者可以參考這篇文章。
最近在把 Tailwind CSS 加入我的技能樹中,其實像這種 Bootstrap, Tailwind CSS 都是很基本前端需要掌握的 CSS 相關工具 但是我其實對美工比較沒那麼大的興趣,我對功能、效能、安全比較感興趣,所以後端、架站、DevOps、一些安全防護玩了一圈,現在來加強我的排版功力
Thumbnail
前言 Vue 在過去的一兩年內快速發展,寫法也一直改變,我在過去一年多也更改了兩次寫法,在這個系列中我將以最新的 composition api + typescript 寫法進行教學。 javascript 有兩大痛點,一個是異步問題,另一個是弱型別。要渲染畫面一定要多線程同時異步處理,不然真的一
State management 首先我們先來寫一些前台存 token 和刪除 token 的方法在 vuex sate management,檔案位置在 src/store/index.ts Login 所有頁面每隔一段時間自動刷新 token Logout
Thumbnail
Create project 裝好 vue CLI 之後,只要在終端輸入 vue create 想取的專案名稱 就可以開始創建 vue 專案囉 1. Pick a preset 2. Select the features 3. Choose the version of vue 選擇 vue3