59.[前端开发-Vue3]Day01-Vue初体验-MVVM-模板语法-常用指令
邂逅Vue.js开发
1 Vue在前端重要性
认识Vue
目前Vue在前端处于什么地位?
框架数据对比(Google指数)
框架数据对比(百度指数)
npm下载量
框架数据对比(GitHub)
谁是最好的前端框架?
Vue对前端工程师的重要性

2 Vue2和Vue3选择
学习vue2还是vue3?
目前需要学习Vue3吗?
3 引入Vue的方式
如何使用Vue呢?
方式一:CDN引入
方式二:下载和引入
4 Vue案例初体验
Vue初体验
计数器案例
计数器原生实现
计数器Vue实现
对比
5 命令和声明式编程
声明式和命令式
MVVM模型
6 Vue的options
data属性
methods属性
问题一:不能使用箭头函数?
问题二:this到底指向什么?
其他属性
Vue基础 – 模板语法
1.Mustache语法
VSCode代码片段
代码片段过程
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><h2>{{message}}</h2></div><script src="./lib/vue.js"></script><script>// 1.创建appconst app = Vue.createApp({// data: option apidata: function() {return {message: "Hello Vue"}},})// 2.挂载appapp.mount("#app")</script>
</body>
</html>
模板语法
Mustache双大括号语法(掌握)
{{}}胡子语法/插值语法
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><!-- 1.基本使用 --><h2>{{ message }}</h2><h2>当前计数: {{ counter }} </h2><!-- 2.表达式 --><h2>计数双倍: {{ counter * 2 }}</h2><h2>展示的信息: {{ info.split(" ") }}</h2><!-- 3.三元运算符 --><h2>{{ age >= 18? "成年人": "未成年人" }}</h2><!-- 4.调用methods中函数 --><h2>{{ formatDate(time) }}</h2><!-- 5.注意: 这里不能定义语句 --><!-- <h2>{{ const name = "why" }}</h2> --></div><script src="../lib/vue.js"></script><script>// 1.创建appconst app = Vue.createApp({// data: option apidata: function() {return {message: "Hello Vue",counter: 100,info: "my name is why",age: 22,time: 123}},methods: {formatDate: function(date) {return "2022-10-10-" + date}}})// 2.挂载appapp.mount("#app")</script>
</body>
</html>
2.常见的基本指令2
v-once指令(了解)
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><!-- 指令: v-once --><h2 v-once>{{ message }}<span>数字: {{counter}}</span></h2><h1>{{message}}</h1><button @click="changeMessage">改变message</button></div><script src="../lib/vue.js"></script><script>// 1.创建appconst app = Vue.createApp({// data: option apidata: function() {return {message: "Hello Vue",counter: 100}},methods: {changeMessage: function() {this.message = "你好啊, 李银河"this.counter += 100console.log(this.message, this.counter)}}})// 2.挂载appapp.mount("#app")</script>
</body>
</html>
v-text指令(了解)
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><h2> aa {{message}} bbb</h2><h2 v-text="message">aaa</h2></div><script src="../lib/vue.js"></script><script>// 1.创建appconst app = Vue.createApp({// data: option apidata: function() {return {message: "Hello Vue"}},})// 2.挂载appapp.mount("#app")</script>
</body>
</html>
v-html
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><h2>{{ content }}</h2><h2 v-html="content"></h2></div><script src="../lib/vue.js"></script><script>// 1.创建appconst app = Vue.createApp({// data: option apidata: function() {return {content: `<span style="color: red; font-size: 30px;">哈哈哈</span>`}},})// 2.挂载appapp.mount("#app")</script>
</body>
</html>
v-pre
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><div v-pre><h2>{{ message }}</h2><p>当前计数: {{ counter }}</p><p>{{}}</p></div></div><script src="../lib/vue.js"></script><script>// 1.创建appconst app = Vue.createApp({// data: option apidata: function() {return {message: "Hello Vue",counter: 0}},})// 2.挂载appapp.mount("#app")</script>
</body>
</html>
v-cloak
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>[v-cloak] {display: none;}</style>
</head>
<body><div id="app"><h2 v-cloak>{{message}}</h2></div><script src="../lib/vue.js"></script><script>setTimeout(() => {// 1.创建appconst app = Vue.createApp({// data: option apidata: function() {return {message: "Hello Vue"}},})// 2.挂载appapp.mount("#app")}, 3000)</script>
</body>
</html>
cloak斗篷的意思
3.v-bind绑定属性
v-bind的绑定属性
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><div><button @click="switchImage">切换图片</button></div><!-- 1.绑定img的src属性 --><img v-bind:src="showImgUrl" alt=""><!-- 语法糖: v-bind -> : --><img :src="showImgUrl" alt=""><!-- 2.绑定a的href属性 --><a :href="href">百度一下</a></div><script src="../lib/vue.js"></script><script>// 1.创建appconst app = Vue.createApp({// data: option apidata: function() {return {imgUrl1: "http://p1.music.126.net/agGc1qkogHtJQzjjyS-kAA==/109951167643767467.jpg",imgUrl2: "http://p1.music.126.net/_Q2zGH5wNR9xmY1aY7VmUw==/109951167643791745.jpg",showImgUrl: "http://p1.music.126.net/_Q2zGH5wNR9xmY1aY7VmUw==/109951167643791745.jpg",href: "http://www.baidu.com"}},methods: {switchImage: function() {this.showImgUrl = this.showImgUrl === this.imgUrl1 ? this.imgUrl2: this.imgUrl1}}})// 2.挂载appapp.mount("#app")</script>
</body>
</html>
v-memo
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><div v-memo="[name, age]"><h2>姓名: {{ name }}</h2><h2>年龄: {{ age }}</h2><h2>身高: {{ height }}</h2></div><button @click="updateInfo">改变信息</button></div><script src="../lib/vue.js"></script><script>// 1.创建appconst app = Vue.createApp({// data: option apidata: function() {return {name: "why",age: 18,height: 1.88}},methods: {updateInfo: function() {// this.name = "kobe"this.age = 20}}})// 2.挂载appapp.mount("#app")</script>
</body>
</html>
4.绑定class和style
绑定基本属性
绑定class介绍
绑定class – 对象语法
绑定class – 数组语法
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.active {color: red;}</style>
</head>
<body><div id="app"><!-- 1.基本绑定class --><h2 :class="classes">Hello World</h2><!-- 2.动态class可以写对象语法 --><button :class=" isActive ? 'active': '' " @click="btnClick">我是按钮</button><!-- 2.1.对象语法的基本使用(掌握) --><button :class="{ active: isActive }" @click="btnClick">我是按钮</button><!-- 2.2.对象语法的多个键值对 --><button :class="{ active: isActive, why: true, kobe: false }" @click="btnClick">我是按钮</button><!-- 2.3.动态绑定的class是可以和普通的class同时的使用 --><button class="abc cba" :class="{ active: isActive, why: true, kobe: false }" @click="btnClick">我是按钮</button><!-- 2.4.动态绑定的class是可以和普通的class同时的使用 --><button class="abc cba" :class="getDynamicClasses()" @click="btnClick">我是按钮</button><!-- 3.动态class可以写数组语法(了解) --><h2 :class="['abc', 'cba']">Hello Array</h2><h2 :class="['abc', className]">Hello Array</h2><h2 :class="['abc', className, isActive? 'active': '']">Hello Array</h2><h2 :class="['abc', className, { active: isActive }]">Hello Array</h2></div><script src="../lib/vue.js"></script><script>// 1.创建appconst app = Vue.createApp({// data: option apidata: function() {return {classes: "abc cba nba",isActive: false,className: "why"}},methods: {btnClick: function() {this.isActive = !this.isActive},getDynamicClasses: function() {return { active: this.isActive, why: true, kobe: false }}}})// 2.挂载appapp.mount("#app")</script>
</body>
</html>
绑定style介绍
绑定style演练
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><!-- 1.普通的html写法 --><h2 style="color: red; font-size: 30px;">哈哈哈哈</h2><!-- 2.style中的某些值, 来自data中 --><!-- 2.1.动态绑定style, 在后面跟上 对象类型 (重要)--><h2 v-bind:style="{ color: fontColor, fontSize: fontSize + 'px' }">哈哈哈哈</h2><!-- 2.2.动态的绑定属性, 这个属性是一个对象 --><h2 :style="objStyle">呵呵呵呵</h2><!-- 3.style的数组语法 --><h2 :style="[objStyle, { backgroundColor: 'purple' }]">嘿嘿嘿嘿</h2></div><script src="../lib/vue.js"></script><script>// 1.创建appconst app = Vue.createApp({// data: option apidata: function() {return {fontColor: "blue",fontSize: 30,objStyle: {fontSize: '50px',color: "green"}}},})// 2.挂载appapp.mount("#app")</script>
</body>
</html>
动态绑定属性
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><h2 :[name]="'aaaa'">Hello World</h2></div><script src="../lib/vue.js"></script><script>// 1.创建appconst app = Vue.createApp({// data: option apidata: function() {return {name: "class"}},})// 2.挂载appapp.mount("#app")</script>
</body>
</html>
绑定一个对象
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><h2 :name="name" :age="age" :height="height">Hello World</h2><!-- v-bind绑定对象: 给组件传递参数 --><h2 v-bind="infos">Hello Bind</h2></div><script src="../lib/vue.js"></script><script>// 1.创建appconst app = Vue.createApp({// data: option apidata: function() {return {infos: { name: "why", age: 18, height: 1.88, address: "广州市" },name: "why",age: 18,height: 1.88}},})// 2.挂载appapp.mount("#app")</script>
</body>
</html>
5.v-on绑定事件
v-on绑定事件
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.box {width: 100px;height: 100px;background-color: orange;margin-top: 10px;}</style>
</head>
<body><div id="app"><!-- 1.基本的写法 --><div class="box" v-on:click="divClick"></div><!-- 2.语法糖写法(重点掌握) --><div class="box" @click="divClick"></div><!-- 3.绑定的方法位置, 也可以写成一个表达式(不常用, 不推荐) --><h2>{{ counter }}</h2><button @click="increment">+1</button><button @click="counter++">+1</button><!-- 4.绑定其他方法(掌握) --><div class="box" @mousemove="divMousemove"></div><!-- 5.元素绑定多个事件(掌握) --><div class="box" @click="divClick" @mousemove="divMousemove"></div><!-- <div class="box" v-on="{ click: divClick, mousemove: divMousemove }"></div> --><!-- <div class="box" @="{ click: divClick, mousemove: divMousemove }"></div> --></div><script src="../lib/vue.js"></script><script>// 1.创建appconst app = Vue.createApp({// data: option apidata: function() {return {counter: 0}},methods: {divClick() {console.log("divClick")},increment() {this.counter++},divMousemove() {console.log("divMousemove")}}})// 2.挂载appapp.mount("#app")</script>
</body>
</html>
v-on的用法
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.box {width: 100px;height: 100px;background-color: orange;margin-top: 10px;}</style>
</head>
<body><div id="app"><!-- 1.基本的写法 --><div class="box" v-on:click="divClick"></div><!-- 2.语法糖写法(重点掌握) --><div class="box" @click="divClick"></div><!-- 3.绑定的方法位置, 也可以写成一个表达式(不常用, 不推荐) --><h2>{{ counter }}</h2><button @click="increment">+1</button><button @click="counter++">+1</button><!-- 4.绑定其他方法(掌握) --><div class="box" @mousemove="divMousemove"></div><!-- 5.元素绑定多个事件(掌握) --><div class="box" @click="divClick" @mousemove="divMousemove"></div><!-- <div class="box" v-on="{ click: divClick, mousemove: divMousemove }"></div> --><!-- <div class="box" @="{ click: divClick, mousemove: divMousemove }"></div> --></div><script src="../lib/vue.js"></script><script>// 1.创建appconst app = Vue.createApp({// data: option apidata: function() {return {counter: 0}},methods: {divClick() {console.log("divClick")},increment() {this.counter++},divMousemove() {console.log("divMousemove")}}})// 2.挂载appapp.mount("#app")</script>
</body>
</html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><!-- 1.默认传递event对象 --><button @click="btn1Click">按钮1</button><!-- 2.只有自己的参数 --><button @click="btn2Click('why', age)">按钮2</button><!-- 3.自己的参数和event对象 --><!-- 在模板中想要明确的获取event对象: $event --><button @click="btn3Click('why', age, $event)">按钮3</button></div><script src="../lib/vue.js"></script><script>// 1.创建appconst app = Vue.createApp({// data: option apidata: function() {return {message: "Hello Vue",age: 18}},methods: {// 1.默认参数: event对象// 总结: 如果在绑定事件的时候, 没有传递任何的参数, 那么event对象会被默认传递进来btn1Click(event) {console.log("btn1Click:", event)},// 2.明确参数:btn2Click(name, age) {console.log("btn2Click:", name, age)},// 3.明确参数+event对象btn3Click(name, age, event) {console.log("btn3Click:", name, age, event)}}})// 2.挂载appapp.mount("#app")</script>
</body>
</html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.box {width: 100px;height: 100px;background-color: orange;}</style>
</head>
<body><div id="app"><div class="box" @click="divClick"><button @click.stop="btnClick">按钮</button></div></div><script src="../lib/vue.js"></script><script>// 1.创建appconst app = Vue.createApp({// data: option apidata: function() {return {message: "Hello Vue"}},methods: {btnClick(event) {console.log("btnClick")},divClick() {console.log("divClick")}}})// 2.挂载appapp.mount("#app")</script>
</body>
</html>
v-on的基本使用
v-on参数传递
v-on的修饰符
6.Vue的条件渲染
条件渲染
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><!-- 模板语法 --><div id="app"><ul v-if="names.length > 0"><li v-for="item in names">{{item}}</li></ul><h2 v-else>当前names没有数据, 请求获取数据后展示</h2></div><script src="../lib/vue.js"></script><script>// 1.创建appconst app = Vue.createApp({// data: option apidata: function() {return {names: []}},})// 2.挂载appapp.mount("#app")</script>
</body>
</html>
v-if、v-else、v-else-if
v-if
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><!-- v-if="条件" --><div class="info" v-if="Object.keys(info).length"><h2>个人信息</h2><ul><li>姓名: {{info.name}}</li><li>年龄: {{info.age}}</li></ul></div></div><script src="../lib/vue.js"></script><script>// 1.创建appconst app = Vue.createApp({// data: option apidata() {return {info: {}}}})// 2.挂载appapp.mount("#app")</script>
</body>
</html>
v-else
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><!-- v-if="条件" --><div class="info" v-if="Object.keys(info).length"><h2>个人信息</h2><ul><li>姓名: {{info.name}}</li><li>年龄: {{info.age}}</li></ul></div><!-- v-else --><div v-else><h2>没有输入个人信息</h2><p>请输入个人信息后, 再进行展示~</p></div></div><script src="../lib/vue.js"></script><script>// 1.创建appconst app = Vue.createApp({// data: option apidata() {return {info: {}}}})// 2.挂载appapp.mount("#app")</script>
</body>
</html>
v-else-if
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><h1 v-if="score > 90">优秀</h1><h2 v-else-if="score > 80">良好</h2><h3 v-else-if="score >= 60">及格</h3><h4 v-else>不及格</h4></div><script src="../lib/vue.js"></script><script>// 1.创建appconst app = Vue.createApp({// data: option apidata() {return {score: 40}},})// 2.挂载appapp.mount("#app")</script>
</body>
</html>
template元素
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><!-- v-if="条件" --><template v-if="Object.keys(info).length"><h2>个人信息</h2><ul><li>姓名: {{info.name}}</li><li>年龄: {{info.age}}</li></ul></template><!-- v-else --><template v-else><h2>没有输入个人信息</h2><p>请输入个人信息后, 再进行展示~</p></template></div><script src="../lib/vue.js"></script><script>// 1.创建appconst app = Vue.createApp({// data: option apidata() {return {info: { name: "why", age: 18 }}}})// 2.挂载appapp.mount("#app")</script>
</body>
</html>
条件渲染-阶段性案例
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>img {width: 200px;height: 200px;}</style>
</head>
<body><div id="app"><div><button @click="toggle">切换</button></div><template v-if="isShowCode"><img src="https://game.gtimg.cn/images/yxzj/web201706/images/comm/floatwindow/wzry_qrcode.jpg" alt=""></template></div><script src="../lib/vue.js"></script><script>// 1.创建appconst app = Vue.createApp({// data: option apidata() {return {isShowCode: true}},methods: {toggle() {this.isShowCode = !this.isShowCode}}})// 2.挂载appapp.mount("#app")</script>
</body>
</html>
v-show
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>img {width: 200px;height: 200px;}</style>
</head>
<body><div id="app"><div><button @click="toggle">切换</button></div><div v-show="isShowCode"><img src="https://game.gtimg.cn/images/yxzj/web201706/images/comm/floatwindow/wzry_qrcode.jpg" alt=""></div><div v-if="isShowCode"><img src="https://game.gtimg.cn/images/yxzj/web201706/images/comm/floatwindow/wzry_qrcode.jpg" alt=""></div></div><script src="../lib/vue.js"></script><script>// 1.创建appconst app = Vue.createApp({// data: option apidata() {return {isShowCode: true}},methods: {toggle() {this.isShowCode = !this.isShowCode}}})// 2.挂载appapp.mount("#app")</script>
</body>
</html>