---
# System prepended metadata

title: Vue 3 with TypeScript Tutorial  筆記

---

# Vue 3 with TypeScript Tutorial  筆記

### #1 Introduction
[#1 Tutorial 教程](https://www.youtube.com/watch?v=JfI5PISLr9w&list=PL4cUxeGkcC9gCtAuEdXTjNVE5bbMFo5OD&index=1)
[#1 Practice 練習](https://codesandbox.io/s/relaxed-tree-r8bbuz)
＊ 引入defineComponent的方式
```
import { defineComponent } from "vue";

export default defineComponent({
  name: "App",
  components: {},
 }); 
```
---

### #2 Vue Components using TypeScript

[#2 Tutorial 教程](https://www.youtube.com/watch?v=UDAVj_vlAr8&list=PL4cUxeGkcC9gCtAuEdXTjNVE5bbMFo5OD&index=2)
[#2 Practice 練習](https://codesandbox.io/s/interesting-blackburn-qkxmq7?file=/src/App.vue)

＊按鈕 button @click="changeName('zelda')"
去呼叫 methods 方式下 的 changeName 函式
[#2 重構](https://codesandbox.io/s/reverent-blackwell-mn7ocs)

---

### #3 Composition API & TypeScript
[#3 Tutorial 教程](https://www.youtube.com/watch?v=H-hXNym2CK8&list=PL4cUxeGkcC9gCtAuEdXTjNVE5bbMFo5OD&index=3)
[#3 Practice 練習](https://codesandbox.io/s/morning-wind-m3zkwo?file=/src/App.vue)

定義資料型別介面
```
interface Job {
  title: string;
  location: string;
  salary: number;
  id: string;
}
export default Job;
```
資料陣列的傳遞
```
import Job from "./types/Job";

 setup() {
    const jobs = ref<Job[]>([
        // Data Arrays
    ]);
    return { jobs };
    },
```

[#3 重構](https://codesandbox.io/s/mystifying-varahamihira-mx7w1z)

---

### #4 Types & Props
[#4 Tutorial 教程](https://www.youtube.com/watch?v=GdWrYfDfqRE&list=PL4cUxeGkcC9gCtAuEdXTjNVE5bbMFo5OD&index=4)
[#4 Practice 練習](https://codesandbox.io/s/elegant-pateu-w2yqjx?file=/src/App.vue)

JobsList組件    及使用v-for 迴圈傳值
```
//src/components/JobsList.vue
<template>
  <div class="job-list">
    <ul>
      <li v-for="job in jobs" :key="job.id">
        <h2>{{ job.title }} in {{ job.location }}</h2>
        
...
```
vue引入組件
```
//App.vue
<template>
    <JobList :jobs="jobs" />
</template>

import JobList from "./components/JobsList.vue";
...
components: { JobList },
```
[#4 重構](https://codesandbox.io/s/vigilant-forest-41xrnq)

---

### #5  Functions
[#5 Tutorial 教程](https://www.youtube.com/watch?v=usSBsgWNUZk&list=PL4cUxeGkcC9gCtAuEdXTjNVE5bbMFo5OD&index=5)
[#5 Practice 練習](https://codesandbox.io/s/elastic-lake-nqkblr)

按鈕點擊資料排序
```
//App.vue
<div class="order">
    <button @click="handleClick('title')">order by title</button>
    ...
</div>

<JobList :jobs="jobs" :order="order" />

import OrderTerm from "./types/OrderTerm";

...
const order = ref<OrderTerm>("title");

const handleClick = (term: OrderTerm) => {
    order.value = term;
};

return { jobs, handleClick, order };
```
[](https://)

---

### #6 Computed Values
[#6 Tutorial 教程](https://www.youtube.com/watch?v=TwN36HU-NQM&list=PL4cUxeGkcC9gCtAuEdXTjNVE5bbMFo5OD&index=6)
[#6 Practice 練習](https://codesandbox.io/s/fervent-babycat-o5vevx)

```
/src/components/JobsList.vue

<script lang="ts">
import { computed, defineComponent, PropType } from "vue";
import Job from "../types/Job";
import OrderTerm from "../types/OrderTerm";

export default defineComponent({
  props: {
    jobs: {
      required: true,
      type: Array as PropType<Job[]>,
    },
    order: {
      required: true,
      type: String as PropType<OrderTerm>,
    },
  },
  setup(props) {
    const OrderedJobs = computed(() => {
      return [...props.jobs].sort((a: Job, b: Job) => {
        return a[props.order] > b[props.order] ? 1 : -1;
      });
    });
    return { OrderedJobs };
  },
});
```
[](https://)

---

### #7 Forms & Inputs
[#7 Tutorial 教程](https://www.youtube.com/watch?v=6n4myAZwdxg&list=PL4cUxeGkcC9gCtAuEdXTjNVE5bbMFo5OD&index=7)
[#7 Practice 練習](https://codesandbox.io/s/snowy-haze-zenbic)


---
END