Vue 新手村,初心者的升級之路

前言 #

Vue.js 是當今(2022 年)的前端三大框架(Vue.js、Angular、React)之一。Vue.js 是漸進式的網頁架構,新增 script 指令碼標籤即可讓開發人員快速啟動並執行,也可以使用 Vue CLI 來建立可調整規模的大型應用程式。Microsoft Learn 網站,有個「使用 Vue.js 邁出第一步」教學,透過實際動手做教你開始用 Vue.js 寫網頁。

課程筆記 #

  1. 開始使用 Vue
<script src="https://unpkg.com/vue@next"></script>
<!-- the HTML element which will host our app -->
<div id='app'>
,
</div>

<script src="https://unpkg.com/vue@next"></script>
<script>
const App = Vue.createApp({
data() {
return {
firstName: 'Christopher',
lastName: 'Harrison'
};
}
});
// Registering and mounting our app
App.mount('#app');
</script>
<div id="app">
<img v-bind:src="imageSource" />
<img :src="imageSource" />
</div>

<script src="https://unpkg.com/vue@next"></script>
<script>
Vue.createApp({
data() {
return {
imageSource: './media/sample.jpg'
}
}
}).mount('#app');
</script>
<div id="app">
<div :class="classObject" :style="styleObject">Hello, Vue!</div>
</div>

<script src="https://unpkg.com/vue@next"></script>
<script>
Vue.createApp({
data() {
return {
classObject: {
centered: true,
active: true
},
styleObject: {
'background-color': 'red'
}
}
}
}).mount('#app');
</script>
  1. 使用 Vue.js 的動態頁面顯示
git clone https://github.com/MicrosoftDocs/mslearn-vue-dynamic-render/
<ul id="demo">
<li v-for="(name, index) in names" :key="index"></div>
</ul>

<script src="https://unpkg.com/vue@next"></script>
<script>
Vue.createApp({
data() {
return {
names: ['Susan', 'Peter', 'Bill' ]
}
}
}).mount('#demo');
</script>
<div v-if="new Date().getMonth() < 3">It is the first quarter</div>
<div v-else-if="new Date().getMonth() < 6">It is the second quarter</div>
<div v-else-if="new Date().getMonth() < 9">It is the third quarter</div>
<div v-else>It is the fourth quarter</div>
  1. 在 Vue.js 中使用資料與事件
git clone https://github.com/MicrosoftDocs/mslearn-vue-data-events
<div id="app">
<!--若要與文字方塊繫結,請使用指示詞 v-model。每當文字方塊的值變更時,name 屬性便會更新。 如果您想要改用 textarea,語法是相同的。-->
<input type="text" v-model="name" />

<!--通常,布林值會與核取方塊繫結。 核取方塊能允許選項切換。-->
<input type="checkbox" v-model="active" /> Is active

<!--您可能會有兩個選擇,例如「是」和「否」。 在此情況下,您可以使用 true-value 和 false-value 來指示所選核取方塊為已勾選 (true) 或未勾選 (false)。-->
<input type="checkbox" v-model="benefitsSelected" true-value="yes" false-value="no"> Benefits selected:

<!--若要建立由選項所組成的清單,請使用 v-for 對清單執行迴圈。 然後選擇將值設定為陣列中項目的索引。 您可以使用 v-for(status, index) in statusList 來為每個項目提供索引。 然後您可以將每個選項的 :value 設為 index,並顯示 status 為使用者的選項。-->
<select v-model="statusIndex">
<!-- Create a message to select one -->
<option disabled value="-1">Please select one</option>
<!-- Use v-for to create the list of options -->
<option v-for="(status, index) in statusList" :value="index">

</option>
</select>
</div>

<script src="https://unpkg.com/vue@next"></script>
<script>
Vue.createApp({
data() {
return {
name: 'Cheryl',
statusIndex: -1,
active: true,
benefitsSelected: 'yes',
statusList: [
'full-time',
'part-time',
'contractor'
]
}
}
}).mount('#app');
</script>
<form v-show="!booking.completed">
<!--TODO: 未完成... -->
<script>
// TODO: 未完成...
</script>
<div id="app">
<button type="button" @click="displayName">Display name</button>
</div>

<script src="https://unpkg.com/vue@next"></script>
<script>
Vue.createApp({
data() {
return {
name: 'Cheryl'
}
},
methods: {
displayName() {
console.log(this.name);
}
}
}).mount('#app');
</script>
<div id="app">
<div> </div>
</div>

<script src="https://unpkg.com/vue@next"></script>
<script>
Vue.createApp({
data() {
return {
firstName: 'Cheryl',
lastName: 'Smith'
}
},
computed: {
fullName() {
return `${this.lastName}, ${this.firstName}`
}
},
}).mount('#app');
</script>
  1. 開始使用 Vue.js 中的 Vue CLI 和單一檔案元件
git clone https://github.com/MicrosoftDocs/mslearn-vue-components
  • Lint 分析選項:確定所有程式碼看起來都一致。 這些選項也有助於找出錯誤。
  • 應用程式類型:選擇是否要新增漸進式 Web 應用程式支援。
  • Babel 支援:如果您的應用程式需要在較舊的瀏覽器中使用,Babel 的作用就是將較新的 JavaScript 語法轉換為較舊的 JavaScript 格式。
  • 語言:選擇 JavaScript 或 TypeScript。 兩個選項都適用,但 TypeScript 的功能之一是可提供類型,因此在應用程式成長時可能是不錯的選擇。 Vue 本身內建於 TypeScript 中。
npm install -g @vue/cli
vue create {projectName}
npm run serve
  • style 區段可包含任何有效的 CSS,或您可能使用的任何前置處理器的語法。
  • script 區段會儲存用於元件的指令碼。 如同 Vue JavaScript 元件,您也可以匯出各種 Vue 屬性和方法,例如 data()methodscomponents
  • template 區段含有您想要用來顯示資訊,以及讓使用者與資料互動的 HTML 範本。
<template>
<product-display></product-display>
</template>
<script>
import ProductDisplay from './ProductDisplay.vue'
export default {
components: {
ProductDisplay
}
}
</script>
<template>
<div>Hello, world</div>
</template>
<script src="./hello.js"></script>
<style src="./style.css"></style>
  • Vetur 可讓您在 Visual Studio Code 中支援 .vue 檔案。
  • 來自 Sarah Drasner 的 Vue VSCode Snippets 可在 Visual Studio Code 中啟用程式碼片段。
import { createApp } from 'vue'
import Host from './components/Host.vue'

createApp(Host).mount('#app')
<!-- UserDisplay component -->
<script>
export default {
name: 'UserDisplay',
props: ['name', 'age']
}
</script>
<!-- inside parent component -->
<template>
<!--值 Cheryl 和 28 會透過屬性繫結分別繫結至 name 和 age 屬性。-->
<user-display name='Cheryl' age='28'></user-display>
</template>
<script>
import UserDisplay from './UserDisplay.vue';
export default {
components: {
UserDisplay
}
}
</script>
<!-- UserDisplay component script -->
<script>
export default {
name: 'UserDisplay',
props: {
name: String,
age: Number
}
}
</script>
<template>
<div>Name: </div>
<div>Age: </div>
</template>
<!-- UserDisplay component script -->
<script>
export default {
name: 'UserDisplay',
props: {
user: {
name: String,
age: Number
}
}
}
</script>
<!-- parent component -->
<template>
<user-display :user="user"></user-display>
</template>

<script>
import UserInfo from './UserInfo.vue';
export default {
data() {
return {
user: {
firstName: 'Cheryl',
age: 28
}
}
},
components: {
UserDisplay
}
}
</script>
<template>
<button @click="$emit('userUpdated')">Save user</button>

<!--發出含有資料的事件-->
<button @click="$emit('userUpdated', true)">Save user</button>

<!--有時,您在發出事件之前可能需要執行更多步驟。-->
<button @click="saveUser">Save user</button>
</template>
<script>
export default {
name: 'UserDialog',
emits: ['userUpdated'],
methods: {
saveUser() {
// perform other operations
this.$emit('userUpdated'); // emits event
}
}
}
</script>
<!--子元件-->
<template>
<button @click="$emit('userUpdated', true)">Save user</button>
</template>
<script>
export default {
name: 'UserDialog',
emits: ['userUpdated']
}
</script>
<!--父元件-->
<template>
<user-dialog @user-updated="handleUserUpdated"></user-dialog>
</template>
<script>
import UserDialog from './UserDialog.vue';
export default {
methods: {
handleUserUpdated(success) {
if (success) {
alert('It worked!!');
} else {
alert('Something went wrong');
}
}
},
components: {
UserDialog
}
}
</script>

總結 #

跟著做完大概就知道 Vue.js 的架構是怎麼一回事,從透過 CDN 的輕量使用,到建立專用的使用方式都有提到,雖然沒有很深入,但對 Vue.js 也算是有初步的了解。