Vue
Vue.js ,市场占有率前 2 的前端框架
官方文档: https://vuejs.org/ 中文官方文档: https://cn.vuejs.org/
创建 Vue 项目
通过 CDN 使用 Vue
全局构建版本:所有顶层 API 都以属性的形式暴露在了全局的 Vue 对象上,可以通过解构获取这些
<!Doctype html>
<html>
<head>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
<div id="app">
{{ msg }}
</div>
<script>
Vue.createApp({
setup() {
return {
msg: "success"
}
}
}).mount("#app")
</script>
</body>
</html>
使用 ES 模块构建版本
<!Doctype html>
<html>
<head>
</head>
<body>
<div id="app">
{{ msg }}
</div>
<script type="module">
import { createApp, ref } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'
createApp({
setup() {
const msg = ref('success')
return {
msg
}
}
}).mount('#app')
</script>
</body>
</html>
每个 Vue 应用都是通过 createApp 函数创建一个新的 应用实例,传入的是一个根组件,并将其挂载到 dom 元素,可以使用 mount 方法传入 css 选择器将其挂载。
import { createApp } from 'vue'
const app = createApp({
/* 根组件选项 */
})
app.mount('#app')
基础
响应式数据
在组合式 API 中,推荐使用 ref() 函数来声明响应式状态,ref 会返回一个带有 value 属性的引用对象,可以通过这个属性获取或修改值,当状态改变时会重新渲染
为了方便,在模版中使用不需要用 value 属性,ref 会自动解包,可以直接使用
<div id="app">
{{ count }}
<button @click="count++">count++</button>
<button @click="increment">increment</button>
</div>
<script type="module">
import { createApp, ref, reactive } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'
createApp({
setup() {
const count = ref(1)
const increment = () => {
count.value++
}
return {
count,
increment
}
}
}).mount('#app')
</script>
也可以使用 reactive 来声明响应式变量,通过代理对象实现,当状态改变时会重新渲染
reactive 适合复杂对象,不能用于基本类型 string、number 或 boolean。由于通过代理,因此不能替换整个对象
<div id="app">
{{ people }}
<button @click="people.age++">count++</button>
<button @click="increment">increment</button>
</div>
<script type="module">
import { createApp, ref, reactive } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'
createApp({
setup() {
const people = reactive({
name: "jeff",
age: 1
})
const increment = () => {
people.age++
}
return {
people,
increment
}
}
}).mount('#app')
</script>
可以使用 v-on 指令 (简写为 @) 来监听事件,例如 v-on:click
,事件发生时会运行后面的 JavaScript 语句。
<div id="app">
{{ people }}
<button v-on:click="increment">increment1</button>
<button @click="increment">increment2</button>
</div>
<script type="module">
import { createApp, ref, reactive } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'
createApp({
setup() {
const people = ref({
name: "jeff",
age: 1
})
const increment = () => {
console.log(people)
people.value.age++
}
return {
people,
increment
}
}
}).mount('#app')
</script>
条件渲染
v-show 和 v-if 可以用来控制显示
<div id="app">
<div>show: {{ show }}</div>
<div v-show="show">v-show</div>
<div v-if="show">v-if</div>
<div v-else="show">v-else</div>
<button @click="change">Change show</button>
</div>
<script type="module">
import { createApp, ref, reactive } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'
createApp({
setup() {
const show = ref(true)
const change = () => {
show.value = !show.value
}
return {
show,
change
}
}
}).mount('#app')
</script>
查看源代码可以看到 v-show 是通过 display 控制的,而 v-if 是加入或移除元素,v-show 有更高的性能优势
<div style="display: none;">v-show</div>
<div>v-else</div>
动态属性绑定
可以使用 v-bind 或者简写冒号进行动态属性绑定
<div id="app">
<div :style="{ 'font-size': fontSize + 'px' }">Size</div>
<input type="text" v-bind:value="fontSize">
<input type="text" :value="fontSize">
<button @click="fontSize++">increment</button>
</div>
<script type="module">
import { createApp, ref, reactive } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'
createApp({
setup() {
const fontSize = ref(1)
return {
fontSize
}
}
}).mount('#app')
</script>
列表渲染
可以使用 v-for 遍历对象和数组
可以在 template 上使用 v-for 来渲染一个包含多个元素的块,template 不会渲染
key 不是必要的,但推荐使用,以提高性能
<div id="app">
<div v-for="(value, key, index) in people" :key="key">
value: {{value}}, key: {{key}}, index: {{index}}
</div>
<div v-for="(number, index) in numbers" :key="index">
number: {{ number }} , index: {{ index }}
</div>
<template v-for="number in numbers" :key="index">
<div v-if="number % 2 === 1">{{ number }}</div>
</template>
</div>
<script type="module">
import { createApp, ref, reactive } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'
createApp({
setup() {
const people = ref({
name: "jeff",
age: 12
})
const numbers = ref([11,22,33])
return {
people,
numbers
}
}
}).mount('#app')
</script>