Vue快速上手
声明式渲染
🔗 链接:
reactive()
📒 笔记:
JavaScript |
---|
| import { reactive } from 'vue'
const counter = reactive({
count: 0
})
console.log(counter.count) // 0
counter.count++
|
ref()
📒 笔记:
- 接受任何类型
- 返回一个包裹对象,并在
.value
属性下暴露内部值
JavaScript |
---|
| import { ref } from 'vue'
const message = ref('Hello World!')
console.log(message.value) // "Hello World!"
message.value = 'Changed'
|
完整代码
JavaScript |
---|
| <script setup>
import { reactive, ref } from 'vue'
const counter = reactive({ count: 0 })
const message = ref('Hello World!')
</script>
<template>
<h1>{{ message }}</h1>
<p>Count is: {{ counter.count }}</p>
</template>
|
Attribute 绑定 v-bind
🔗 链接:
📒 笔记:
- 在 Vue 中,mustache 语法 (即双大括号) 只能用于文本插值
- attribute绑定动态值需要使用
v-bind
语法
完整代码
JavaScript |
---|
| <script setup>
import { ref } from 'vue'
const titleClass = ref('title')
</script>
<template>
<h1 :class="titleClass">Make me red</h1>
</template>
<style>
.title {
color: red;
}
</style>
|
事件监听 v-on
🔗 链接:
完整代码
JavaScript |
---|
| <script setup>
import { ref } from 'vue'
const count = ref(0)
function increment() {
count.value++
}
</script>
<template>
<button @click="increment">count is: {{ count }}</button>
</template>
|
表单绑定 v-model
🔗 链接:
完整代码
条件渲染 v-if
🔗 链接:
完整代码
JavaScript |
---|
| <script setup>
import { ref } from 'vue'
const awesome = ref(true)
function toggle() {
awesome.value = !awesome.value
}
</script>
<template>
<button @click="toggle">toggle</button>
<h1 v-if="awesome">Vue is awesome!</h1>
<h1 v-else>Oh no 😢</h1>
</template>
|
列表渲染 v-for
🔗 链接:
示例代码
JavaScript |
---|
| <ul>
<li v-for="todo in todos" :key="todo.id">
{{ todo.text }}
</li>
</ul>
|
更新列表有两种方式:
完整代码
JavaScript |
---|
| <script setup>
import { ref } from 'vue'
// 给每个 todo 对象一个唯一的 id
let id = 0
const newTodo = ref('')
const todos = ref([
{ id: id++, text: 'Learn HTML' },
{ id: id++, text: 'Learn JavaScript' },
{ id: id++, text: 'Learn Vue' }
])
function addTodo() {
todos.value.push({ id: id++, text: newTodo.value })
newTodo.value = ''
}
function removeTodo(todo) {
todos.value = todos.value.filter((t) => t !== todo)
}
</script>
<template>
<form @submit.prevent="addTodo">
<input v-model="newTodo">
<button>Add Todo</button>
</form>
<ul>
<li v-for="todo in todos" :key="todo.id">
{{ todo.text }}
<button @click="removeTodo(todo)">X</button>
</li>
</ul>
</template>
|
计算属性 computed()
🔗 链接:
📒 笔记:
- 此API用于创建一个计算属性
ref
,这个 ref
会动态地根据其他响应式数据源来计算其 .value
示例代码:
JavaScript |
---|
| import { ref, computed } from 'vue'
const hideCompleted = ref(false)
const todos = ref([
/* ... */
])
const filteredTodos = computed(() => {
// 根据 `todos.value` & `hideCompleted.value`
// 返回过滤后的 todo 项目
})
|
完整代码
JavaScript |
---|
| <script setup>
import { ref, computed } from 'vue'
let id = 0
const newTodo = ref('')
const hideCompleted = ref(false)
const todos = ref([
{ id: id++, text: 'Learn HTML', done: true },
{ id: id++, text: 'Learn JavaScript', done: true },
{ id: id++, text: 'Learn Vue', done: false }
])
const filteredTodos = computed(() => {
return hideCompleted.value
? todos.value.filter((t) => !t.done)
: todos.value
})
function addTodo() {
todos.value.push({ id: id++, text: newTodo.value, done: false })
newTodo.value = ''
}
function removeTodo(todo) {
todos.value = todos.value.filter((t) => t !== todo)
}
</script>
<template>
<form @submit.prevent="addTodo">
<input v-model="newTodo">
<button>Add Todo</button>
</form>
<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>
<button @click="removeTodo(todo)">X</button>
</li>
</ul>
<button @click="hideCompleted = !hideCompleted">
{{ hideCompleted ? 'Show all' : 'Hide completed' }}
</button>
</template>
<style>
.done {
text-decoration: line-through;
}
</style>
|
生命周期和模板引用 ref=
🔗 链接:
📒 笔记:
- 使用模板引用: 指向模板中一个 DOM 元素的
ref
,即<p ref="pElementRef">hello</p>
- 访问引用: 声明一个同名的
ref
,即const pElementRef = ref(null)
- 要在挂载之后执行代码,需要使用
onMounted()
函数,即
JavaScript |
---|
| import { onMounted } from 'vue'
onMounted(() => {
// 此时组件已经挂载。
})
|
完整代码
JavaScript |
---|
| <script setup>
import { ref, onMounted } from 'vue'
const pElementRef = ref(null)
onMounted(() => {
pElementRef.value.textContent = 'mounted!'
})
</script>
<template>
<p ref="pElementRef">hello</p>
</template>
|
侦听器 watch()
🔗 链接:
📒 笔记:
示例代码
JavaScript |
---|
| import { ref, watch } from 'vue'
const count = ref(0)
watch(count, (newCount) => {
console.log(`new count is: ${newCount}`)
})
|
完整代码
JavaScript |
---|
| <script setup>
import { ref, watch } from 'vue'
const todoId = ref(1)
const todoData = ref(null)
async function fetchData() {
todoData.value = null
const res = await fetch(
`https://jsonplaceholder.typicode.com/todos/${todoId.value}`
)
todoData.value = await res.json()
}
fetchData()
watch(todoId, fetchData)
</script>
<template>
<p>Todo id: {{ todoId }}</p>
<button @click="todoId++">Fetch next todo</button>
<p v-if="!todoData">Loading...</p>
<pre v-else>{{ todoData }}</pre>
</template>
|
组件
🔗 链接:
📒 笔记:
- 父组件可以在模板中渲染另一个组件作为子组件。
- 要使用子组件,需要先导入它,即
import ChildComp from './ChildComp.vue'
完整代码
Props
🔗 链接:
📒 笔记:
完整代码
Emits
🔗 链接:
📒 笔记:
完整代码
插槽slots
🔗 链接:
📒 笔记:
- 父组件可以通过插槽
slots
将模板片段传递给子组件
完整代码
参考