# EK的vue學習筆記
:::info
:bulb: 要下載16.0以上版本的Node.js
:::
## 🛠 生成專案
1. 打開Terminal 如:windows的powershell、ubuntu的Terminator
2. cd "你要放專案的位置"
3. npm init vue@latest
4. Project name: "your-project-name" //你要的專案名稱
5. 一路按NO
6. cd "your-project-name" //你要的專案名稱
7. npm install //還沒研究出這是幹嘛的
8. npm run dev //你的網頁在本地架起來了
9. 用Terminal顯示的位址在瀏覽器打開,即可看到你的專案目前長圓的扁的
10. 編輯 "專案資料夾/src/App.vue" 開始你的vue練習
## 📖Vue小工具與他們的用法
#### :small_blue_diamond: script中的變數與函式的寫法
javascript:
export default {
data() {
return {
變數名: 變數值,
}
},
methods: {
函式名(輸入) {
//函式做的事
},
函數中取變數的方法() {
this.變數名 = !this.變數名;
}
}
}
}
#### :small_blue_diamond: v-bind:取變數-綁定script的資料
template:
<div v-bind:id="變數名"></div> 完整寫法
<div :id="變數名"></div> 簡寫
#### :small_blue_diamond: v-on:取函式-監聽DOM事件(按鈕之類的)
template:
<button v-on:click="函式名"> {{ count }} </button> 完整寫法
<button @click="函式名"> {{ count }} </button> 簡寫
#### :small_blue_diamond: v-if v-else:有條件地渲染元素
template:
<h1 v-if="awesome">Vue is awesome!</h1> 如果awesome==true則顯示這個
<h1 v-else>Oh no</h1> 否則顯示這個
#### :small_blue_diamond: v-for:依照列表重複渲染
template:
<ul>
<li v-for="元素 in 列表" :key="排序依據">
{{ 元素 }}
</li>
</ul>
#### :small_blue_diamond: v-model:雙向綁定
與v-bind很像,但差別是v-model會同步資料到js的data裡面,v-bind不會
template:
<li v-for="元素 in 列表">
<input v-model="元素">
</li>
<!--JOJO-->
#### :small_blue_diamond: ref:手動操作 DOM
javascript:
export default {
mounted() {
this.$refs.名稱.innerHTML = '改變的內容'
}
}
template:
<div ref="名稱">hello</div>
#### :small_blue_diamond: components:引入已經做好的子物件,props:讓子物件從父物件那裡取東西
javascript:
import 你喜歡的子物件名字_1 from '檔案路徑_1'
import 你喜歡的子物件名字_2 from '檔案路徑_2'
export default {
components: {
你喜歡的子物件名字_1,
你喜歡的子物件名字_2
}
}
template:
<你喜歡的子物件名字_1 :子物件_1的變數 = "資料內容"/>
<你喜歡的子物件名字_2 :子物件_2的變數 = "資料內容"/>
你喜歡的名字_1.vue javascript:
export default {
props: {
子物件_1的變數: 資料型別
}
}
你喜歡的名字_1.vue template:
<h2>{{ 子物件_1的變數 || '資料還沒傳進來' }}</h2>
#### :small_blue_diamond: emits:向父組件發送事件
javascript:
import 你喜歡的子物件名字_1 from '檔案路徑_1'
export default {
components: {
你喜歡的子物件名字_1,
}
}
template:
<你喜歡的子物件名字_1 @函式名稱="(傳入資料_1,傳入資料_2) => {你要做的事}" />
你喜歡的子物件名字_1.vue javascript:
emits: ['函式名稱'],
created() {
this.$emit('函式名稱', '傳入資料_1', '傳入資料_2')
}
#### :small_blue_diamond: watch:監測資料變動
javascript:
//如果 要偵測的值 變化則執行 你要做的事情()
watch: {
要偵測的值() {
你要做的事情()
}
}
}
#### :small_blue_diamond: slot:依照列表重複渲染
template:
<你喜歡的子物件名字_1>
要給子物件顯示的東西
</你喜歡的子物件名字_1>
你喜歡的子物件名字_1.vue template:
<slot>
不會顯示的東西
</slot>//只會顯示 要給子物件顯示的東西
## ✒官網練習範例
#### :small_blue_diamond: v-bind與v-on同時使用之範例
<script>
export default {
data() {
return {
text: ''
}
}
}
</script>
<template>
<input v-model="text" placeholder="Type here">
<p>{{ text }}</p>
</template>
#### :small_blue_diamond: v-if與v-else之範例
<script>
export default {
data() {
return {
awesome: true
}
},
methods: {
toggle() {
this.awesome = !this.awesome
}
}
}
</script>
<template>
<button @click="toggle">toggle</button>
<h1 v-if="awesome">Vue is awesome!</h1>
<h1 v-else>Oh no 😢</h1>
</template>
#### :small_blue_diamond: v-for加上v-model之範例
<script>
let id = 0
export default {
data() {
return {
newTodo: '',
hideCompleted: false,
todos: [
{ id: id++, text: 'Learn HTML', done: true },
{ id: id++, text: 'Learn JavaScript', done: true },
{ id: id++, text: 'Learn Vue', done: false }
]
}
},
computed: {
filteredTodos() {
return this.hideCompleted
? this.todos.filter((t) => !t.done)
: this.todos
}
},
methods: {
}
}
</script>
<template>
<ul>
<li v-for="todo in filteredTodos" :key="todo.id">
<input type="checkbox" v-model="todo.done">
<span :class="{ done: todo.done }">{{ todo.text }}</span>
</li>
</ul>
<button @click="hideCompleted = !hideCompleted">
{{ hideCompleted ? 'Show all' : 'Hide completed' }}
</button>
</template>
#### :small_blue_diamond: watch之範例
<script>
export default {
data() {
return {
todoId: 1,
todoData: null
}
},
methods: {
async fetchData() {
this.todoData = null
const res = await fetch(
`https://jsonplaceholder.typicode.com/todos/${this.todoId}`
)
this.todoData = await res.json()
}
},
mounted() {
this.fetchData()
},
//如果todoId變化則執行fetchData
watch: {
todoId() {
this.fetchData()
}
}
}
</script>
<template>
<p>Todo id: {{ todoId }}</p> 顯示Todo id
<button @click="todoId++">Fetch next todo</button> 執行Todo id++
<p v-if="!todoData">Loading...</p> 如果todoData還沒進來就顯示loading
<pre v-else>{{ todoData }}</pre> 否則顯示內容
</template>