On this page
article
4.Vue
一套用于快速构建用户界面的渐进式前端框架
1.Vue介绍
- Vue.js:简称Vue,是一套用于快速构建用户界面的渐进式前端框架。
- Vue.js核心实现
- 响应式数据绑定:当数据发生改变,视图可以自动更新,不用关心DOM操作,专心数据操作。
- 可组合的视图组件:把视图按照功能切分成若干个基本单元,可维护,可重用,可测试等特点。
- 响应式,双向数据绑定,即MVVM。是指数据层(Model)-视图层(View)-数据视图(ViewModel)的响应式框架。
1.2引入Vue.js
- 在html中使用CDN包的形式引入
<script src="https://unpkg.com/vue@3"><script>
- 下载js文件保存到本地再导入
- 使用npm安装
npm install @vue/cli@4.5.12
- 使用官方vuecli脚手架创建项目(不建议新手使用)
vue create vue-demo
番外:
- const var let的区别
- var有设计缺陷,不建议使用
- 用const和let定义变量,const本身是常量的意思
- let 定义函数内局部变量
function xxx() {
let xxx
}
1.3声明式渲染
- Hello World示例:Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>demo</title>
<script src="https://unpkg.com/vue@3"></script>
<style>
</style>
</head>
<body>
<div id="hello-vue">
{{ message }}
</div>
<script>
const { ref } = Vue
const HelloVueApp = {
setup() {
const message = ref('Hello,Vue')
return {
message
}
}
}
Vue.createApp(HelloVueApp).mount('#hello-vue')
</script>
</body>
</html>
- 现在数据和DOM已经被建立了关联,所有东西都是响应式的,可通过下面示例确认:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>demo</title>
<script src="https://unpkg.com/vue@3"></script>
<style>
</style>
</head>
<body>
<div id="hello-vue">
Conter: {{ counter }}
</div>
<script>
//引入vue原生方法
const { ref,onMounted } = Vue
const HelloVueApp = {
setup() {
//变量定义
const counter = ref(5)
//生命周期钩子
onMounted(() => { //在挂载时去干什么事
//定时器
setInterval(() => {
//ref定义的变量,在js内部使用,必须加value
counter.value ++
},1000) //每隔一秒执行一次
})
//如果需要html使用,则需要返回出去
return {
counter
}
}
}
Vue.createApp(HelloVueApp).mount('#hello-vue')
</script>
</body>
</html>
1.4模版语法
- Vue.js使用了基于HTML的模板语法,允许开发者声明式的将
DOM
绑定致底层组件实例的数据,所有Vue.js的模板都是合法的HTML,所以能被遵循规范的浏览器和HTML解析器解析, - 数据绑定最常见的形式就是使用
{{ }}
,语法在HTML中插入文本:<span>Message:{{ msg }}</span>
{{ msg }}
将被替换为对应组件实例中msg
属性的值,无论何时,绑定的组件实例上msg
属性发生改变,传入HTML的值也会随之改变。
2.Vue3响应式
- 解决了:Vue2中新增属性,删除属性(对象),界面不会更新的问题。
- 解决了:Vue2中直接通过下标修改数组,界面不会刷新的问题。
2.1ref
函数(基本数据类型的定义)
- 作用:定义一个响应式的数据即变量(基本类型)。
- 语法:
let a = ref('Hello Vue!')
- 创建一个包含响应式数据的引用对象(reference对象)。
- JS中操作数据:
a.value
- 模板中读取数据,不需要
.value
,直接:<div>{{ a }}<div>
- 接收的数据可以是基本类型,也可以是对象类型(自动转reactive)。
- 基本类型的数据:响应式依然是靠
Object.defineProperty()
的get与set完成的(vue2响应式的实现方式)。 - 对象类型的数据:内部使用了Vue3中的一个新函数:reactive函数
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>demo</title>
<script src="https://unpkg.com/vue@3"></script>
<style>
</style>
</head>
<body>
<div id="hello-vue">
{{ message }}
</div>
<script>
const { ref } = Vue
const HelloVueApp = {
setup() {
const message = ref('Hello,Vue')
return {
message
}
}
}
Vue.createApp(HelloVueApp).mount('#hello-vue')
</script>
</body>
</html>
2.2reactive
函数
- 作用:定义一个对象类型的响应式数据(基本类型数据不能用,要用ref函数)。
- 语法:const 代理对象=reactive(原函数),接收一个对象或数组,返回一个代理对象(proxy对象)。
- reactive定义的响应式数据是深层次的。
- 内部基于ES6的Proxy实现,通过代理对象操作源内部数据进行操作。
- 用法与ref创建的代理对象类似,不过操作时不需要再加.value了
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>demo</title>
<script src="https://unpkg.com/vue@3"></script>
<style>
</style>
</head>
<body>
<div id="hello-vue">
{{ student }}
<br>
{{ student.name }}
</div>
<script>
const { ref,reactive,onMounted } = Vue
const HelloVueApp = {
setup() {
onMounted(() => {
student.name = "chi"
})
//定义对象 reactive返回一个proxy对象,实现对象类型的响应式
//使用const定义对象,对象本身不能改变,但是对象的属性可以改变
// 错误:student = "xxx"
// 正确:student.name = "xxx"
const student = reactive({
name: "fei",
age: "2",
score:70
})
console.log(student)
return {
student
}
}
}
Vue.createApp(HelloVueApp).mount('#hello-vue')
</script>
</body>
</html>
3.Vue常用指令
- 指令:带有
v-
前缀的特殊属性。 - 指令的作用:当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM。
3.1v-text
- v-text 作用与双大花括号作用一样,将数据填充到标签中。但没有闪烁问题!
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>demo</title>
<script src="https://unpkg.com/vue@3"></script>
<style>
</style>
</head>
<body>
<div id="hello-vue">
<p v-text="msg"></p>
<!--v-text插入这个p标签的值-->
<p>{{ msg }}</p>
</div>
<script>
const { ref } = Vue
const HelloVueApp = {
setup() {
const msg = ref("Hello Vue!")
return {
msg
}
}
}
Vue.createApp(HelloVueApp).mount('#hello-vue')
</script>
</body>
</html>
3.2v-html
- 某些情况下,从服务端请求的数据本身就是一个HTML代码,如果用双大括号会将数据解 释为普通文本,而非HTML代码,为了输出真正的HTML,需要使用
v-html
指令:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>demo</title>
<script src="https://unpkg.com/vue@3"></script>
<style>
</style>
</head>
<body>
<div id="hello-vue">
{{ msg }}
<br>
<span v-html="msg"></span>
</div>
<script>
const { ref } = Vue
const HelloVueApp = {
setup() {
const msg = ref("<span style='color: brown'>Hello Vue!<span>")
return {
msg
}
}
}
Vue.createApp(HelloVueApp).mount('#hello-vue')
</script>
</body>
</html>
3.3v-on
- 在前端开发中,我们经常监听用户发生的事件,例如点击、拖拽、键盘事件等。 在Vue中如何监听事件呢?使用
v-on
指令 v-on
: 冒号后面是event参数,例如click、change
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>demo</title>
<script src="https://unpkg.com/vue@3"></script>
<style>
</style>
</head>
<body>
<div id="hello-vue">
<p>点击次数: {{ counter }}</p>
<button v-on:click="counter++">按钮</button>
<br>
<a type="text" id="fname" v-on:mouseout="counter++">鼠标离开计数</a>
</div>
<script>
const { ref } = Vue
const HelloVueApp = {
setup() {
const counter = ref(0)
return {
counter
}
}
}
Vue.createApp(HelloVueApp).mount('#hello-vue')
</script>
</body>
</html>
3.4v-bind
- 用于动态绑定一个或多个属性值,或者向另一个组件传递props值(这个后面再介绍)
- 应用场景:图片地址src、超链接href、动态绑定一些类、样式等等
3.4.1绑定超链接
v-bind
指令后接收一个参数,以冒号分割。v-bind
指令将该元素的 href 属性与表达式 url 的值绑定。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>demo</title>
<script src="https://unpkg.com/vue@3"></script>
<style>
</style>
</head>
<body>
<div id="hello-vue">
<a href="https://cakepanit.com">MaxBit</a>
<br>
<a v-bind:href="url">MaxBitDocs</a>
</div>
<script>
const { ref } = Vue
const HelloVueApp = {
setup() {
const url = "https://docs.cakepanit.com"
return {
url
}
}
}
Vue.createApp(HelloVueApp).mount('#hello-vue')
</script>
</body>
</html>
3.4.2绑定Class
- 操作元素(标签)的 class 和 style 属性是数据绑 定的一个常见需求。
- 例如希望动态切换class,为div显示不同背景颜色
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>demo</title>
<script src="https://unpkg.com/vue@3"></script>
<style>
#default {
height: 200px;
width: 200px;
border: 1px solid brown;
margin: 2px;
}
.active {
height: 200px;
width: 200px;
background-color: darkgreen;
}
</style>
</head>
<body>
<div id="hello-vue">
<!--如果isActive为true,那么class="active"属性出现-->
<div v-bind:class="{active:isActive}" id="default"></div>
<button v-on:click="Onclick()">切换</button>
</div>
<script>
const { ref } = Vue
const HelloVueApp = {
setup() {
const isActive = ref(false)
function Onclick(){
if (isActive.value) {
isActive.value = false
} else {
isActive.value = true
}
}
return {
isActive,
Onclick
}
}
}
Vue.createApp(HelloVueApp).mount('#hello-vue')
</script>
</body>
</html>
3.4.3绑定Style
v-bind:style
的对象语法看着非常像 CSS,但其实是一个 JavaScript 对象。- 可以使用v-bind在style样式中传递样式变量。
- 使用时需要将css样式名中带”-“的转成驼峰命名法,如font-size,转为fontSize
- 例如后台管理系统中改变侧边栏宽度
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>demo</title>
<script src="https://unpkg.com/vue@3"></script>
<style>
</style>
</head>
<body>
<div id="hello-vue">
<div style="background: dodgerblue;font-size: 24px">
Hello Vue! 原生写法
</div>
<div v-bind:style="{background: color,fontSize: num + 'px'}">
Hello Vue! 动态绑定写法
</div>
</div>
<script>
const { ref } = Vue
const HelloVueApp = {
setup() {
const color = ref('red')
const num = 24
return {
color,
num
}
}
}
Vue.createApp(HelloVueApp).mount('#hello-vue')
</script>
</body>
</html>
3.4.4指令缩写
-
v-
前缀作为一种视觉提示,用来识别模板中 Vue 特定的 属性。 但对于一些频繁用到的指令来说,就会感到使用繁琐。 -
因此,Vue 为 v-bind 和 v-o n 这两个最常用的指令,提供了特定简写: v-bind 缩写
-
v-bind
缩写
<!--完整语法-->
<a v-bind:href="url"> ... </a>
<!--缩写-->
<a :href="url"> ... </a>
<!--动态参数的缩写-->
<a :[key]="url"> ... </a>
v-on
缩写
<!--完整语法-->
<a v-on:click="doSomething"> ... </a>
"<!--缩写-->
<a @click="doSomething"> ... </a>
<!--动态参数的缩写-->
<a @[event]="doSomething"> ... </a>
Last updated 11 Nov 2024, 23:39 +0800 .