Vue2学习(一)——Vue简介、Vue指令与指令修饰符
一、Vue简介
Vue是一套用于构建用户界面的渐进式框架。
所谓渐进式就是循序渐进,不一定非得把Vue中的所有API都学完才能开发Vue,可以学一点开发一点。
Vue2官网地址:https://v2.cn.vuejs.org/
Vue3官网地址:https://cn.vuejs.org/
二、安装与创建第一个Vue实例
注意:在写代码之前要安装node.js和VS Code编辑器,这里省略。
创建Vue实例,初始化渲染的核心步骤:
1.准备容器
2.引包(官网)- 开发版本/生产版本开发版本:学习时使用开发版本,报错更详细;也可以直接下载vue.js文件
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>
生产版本:
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16"></script>
3.创建Vue实例 new Vue()
4.指定配置项 el data => 渲染数据
el 指定挂载点,选择器指定控制的是哪个盒子
data 提供数据
创建第一个Vue实例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<div class="box"></div>
<div class="box2"></div>
<div id="app">
<!-- 这里将来会编写一些用于渲染的代码逻辑 -->
<h1>{{msg}}</h1>
<a href="###">{{count}}</a>
</div>
<script src="/day01/vue/vue.js"></script>
<!-- <script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script> -->
<script>
const app = new Vue({
// 通过el配置选择器,指定Vue管理的是哪个盒子
el: "#app",
// 通过data提供数据
data: {
msg: "Hello World",
count: 6666,
},
});
</script>
</body>
</html>
三、插值表达式
1.插值表达式概述
插值表达式是一种Vue的模板语法,我们可以用插值表达式渲染出Vue提供的数据。
上面代码的<h1>{{msg}}</h1>就是插值表达式
2.语法
<h3>{{title}}<h3>
<p>{{nickName.toUpperCase()}}</p>
<p>{{age >= 18 ? '成年':'未成年'}}</p>
<p>{{obj.name}}</p>
<p>{{fn()}}</p>
3.错误用法
1.在插值表达式中使用的数据 必须在data中进行了提供
<p>{{hobby}}</p> //如果在data中不存在 则会报错
2.支持的是表达式,而非语句,比如:if for ...
<p>{{if}}</p>
3.不能在标签属性中使用 {{ }} 插值 (插值表达式只能标签中间使用)
<p title="{{username}}">我是P标签</p>
4.代码示例
<body>
<div id="app">
<p>{{nickname}}</p>
<p>{{nickname.toUpperCase()}}</p>
<p>{{nickname + '你好'}}</p>
<p>{{age >= 18 ? '成年':'未成年'}}</p>
<p>{{friend.name}}</p>
<p>{{friend.desc}}</p>
<p :title="friend.desc">我是李四</p>
</div>
<script src="/day01/vue/vue.js"></script>
<script>
const app = new Vue({
el: "#app", //绑定id是app的元素(又称:容器)
// 通过data提供数据
data: {
nickname: "Hello World",
age: 18,
friend: {
name: "张三",
desc: "热爱学习vue",
},
},
});
</script>
</body>
四、响应式
响应式简单理解就是数据变,视图对应变。
① 访问数据: "实例.属性名"
② 修改数据: "实例.属性名"= "值"
<body>
<div id="app">{{msg}} {{count}}</div>
<!-- <script src="/day01/vue/vue.js"></script> -->
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
// 响应式数据
msg: "你好",
count: 100,
},
});
</script>
</body>
五、Vue开发者工具安装——Vue.js Devtools
(一)Edge浏览器中安装
在扩展中直接搜素vue,Vue.js.devtools就是,点击获取安装
勾选上红框的内容
使用VS Code打开浏览器时F12就会有Vue标志了
(二)Google浏览器安装
参考文章:Vue的开发者调试工具(devtools5.3.4)安装
安装之后可以F12后看到多一个Vue的调试面板
六、Vue指令
(一)v-show与v-if
条件判断指令,用来辅助开发者按需控制 DOM 的显示与隐藏。条件渲染指令有如下两个,分别是:
1.v-show
- 作用: 控制元素显示隐藏
- 语法: v-show = "表达式" 表达式值为 true 显示, false 隐藏
- 原理: 切换 display:none 控制显示隐藏
- 场景:频繁切换显示隐藏的场景
2.v-if
- 作用: 控制元素显示隐藏(条件渲染)
语法: v-if= "表达式" 表达式值 true显示, false 隐藏
原理: 基于条件判断,是否创建 或 移除元素节点
场景: 要么显示,要么隐藏,不频繁切换的场景
<div id="app">
<div v-show="flag" class="box">我是v-show控制的盒子</div>
<div v-if="flag" class="box">我是v-if控制的盒子</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
flag: false
}
})
</script>
(二)v-on与v-bind
1.v-on与v-bind语法
- <button v-on:事件名="内联语句">按钮</button>
- <button v-on:事件名="处理函数">按钮</button>
- <button v-on:事件名="处理函数(实参)">按钮</button>
- `v-on:` 简写为 **@**
- v-bind:动态设置html的标签属性 比如:src、url、title
- v-bind: 可以简写成 => :标签属性
注意:
事件处理函数应该写到一个跟data同级的配置项(methods)中
methods中的函数内部的this都指向Vue实例
代码示例:
<body>
<div id="app">
<p v-if="gender == 1">性别:男</p>
<p v-else>性别:女</p>
<button @click="count--">-</button>
<span>{{count}}</span>
<button @click="count++">+</button>
<hr />
<button @click="fn">切换显示隐藏</button>
<h1 v-show="isShow">hello world</h1>
<!-- v-on调用传参 -->
<hr />
<div class="box">
<h3>自动售货机</h3>
<button @click="buy(5)">可乐5元</button>
<button @click="buy(10)">咖啡10元</button>
<button @click="buy(8)">牛奶8元</button>
</div>
<p>银行卡余额:{{money}}元</p>
<!-- v-bind:src => :src -->
<hr />
<img :src="imgUrl" :title="msg" />
</div>
</body>
<script src="/day01/vue/vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
gender: 2,
count: 100,
isShow: true,
money: 100,
imgUrl: "imgs/11-02.gif",
msg: "hello",
},
methods: {
fn() {
console.log("执行了fn");
// app.isShow= !app.isShow;
this.isShow = !this.isShow;
},
buy(price) {
this.money -= price;
},
},
});
</script>
2.v-bind对样式控制的增强-操作class
为了方便开发者进行样式控制, Vue 扩展了 v-bind 的语法,可以针对 class 类名 和 style 行内样式 进行控制 。
2.1语法
<div> :class = "对象/数组">这是一个div</div>
2.2对象语法
当class动态绑定的是对象时,键就是类名,值就是布尔值,如果值是true,就有这个类,否则没有这个类
<div class="box" :class="{ 类名1: 布尔值, 类名2: 布尔值 }"></div>
适用场景:一个类名,来回切换
2.3数组语法
当class动态绑定的是数组时 → 数组中所有的类,都会添加到盒子上,本质就是一个 class 列表
<div class="box" :class="[ 类名1, 类名2, 类名3 ]"></div>
使用场景:批量添加或删除类
<body>
<div id="app">
<ul>
<li
v-for="(item, index) in list"
:key="item.id"
@click="activeIndex = index"
>
<a :class="{active:index === activeIndex}" href="#">{{item.name}}</a>
</li>
</ul>
</div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>
<!-- <script src="./vue/vue.js"></script> -->
<script>
const app = new Vue({
el: "#app",
data: {
activeIndex: 0, // 记录高亮,给出默认的索引位置
list: [
{ id: 1, name: "京东秒杀" },
{ id: 2, name: "每日特价" },
{ id: 3, name: "品类秒杀" },
],
},
});
</script>
<style>
* {
margin: 0;
padding: 0;
}
ul {
display: flex;
border-bottom: 2px solid #e01222;
padding: 0 10px;
}
li {
width: 100px;
height: 50px;
line-height: 50px;
list-style: none;
text-align: center;
}
li a {
display: block;
text-decoration: none;
font-weight: bold;
color: #333333;
}
li a.active {
background-color: #e01222;
color: #fff;
}
</style>
思路:
1.基于数据,动态渲染tab(v-for)
2.准备一个下标 记录高亮的是哪一个 tab
3.基于下标动态切换class的类名
3.v-bind对有样式控制的增强-操作style
语法:
<div class="box" :style="{ CSS属性名1: CSS属性值, CSS属性名2: CSS属性值 }"></div>
(三)v-for
v-for 用来辅助开发者基于一个数组来循环渲染一个列表结构。
v-for 指令需要使用(item, index) in arr形式的特殊语法,也可以遍历对象和数字,其中:
item 是数组中的每一项
index 是每一项的索引,不需要可以省略
arr 是被遍历的数组
<body>
<div id="app">
<ul>
<li v-for="(item, index) in list" :key="index">{{item}}</li>
</ul>
<hr />
<ul>
<li v-for="(book, index) in booksList" :key="book.id">
<span>{{book.name}}</span>
<span>{{book.author}}</span>
<!-- 注册点击事件-> 通过id进行删除数组中的对应项 尽量不使用index删除,因为id更稳定 -->
<button @click="deleteBook(book.id)">删除</button>
</li>
</ul>
</div>
</body>
<!-- <script src="vue/vue.js"></script> -->
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
list: ["张三", "李四", "王五", "jack"],
booksList: [
{ id: 1, name: "《红楼梦》", author: "曹雪芹" },
{ id: 2, name: "《西游记》", author: "吴承恩" },
{ id: 3, name: "《水浒传》", author: "施耐庵" },
{ id: 4, name: "《三国演义》", author: "罗贯中" },
],
},
methods: {
deleteBook(id) {
console.log(id);
this.booksList = this.booksList.filter((item) => item.id !== id);
},
},
});
</script>
v-for中的key
语法: key="唯一值"
作用:给列表项添加的唯一标识。便于Vue进行列表项的正确排序复用。
为什么加key:Vue 的默认行为会尝试原地修改元素(就地复用)
注意:
key 的值只能是字符串 或 数字类型
key 的值必须具有唯一性
推荐使用 id 作为 key(唯一),不推荐使用 index 作为 key(会变化,不对应)
(四)v-model
<body>
<div id="app">
账户:<input type="text" v-model="username" /><br />
密码:<input type="password" v-model="password" /><br />
<button @click="login">登录</button>
<button @click="reset">重置</button>
</div>
</body>
<!-- <script src="vue/vue.js"></script> -->
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
username: "",
password: "",
},
methods: {
login() {
console.log(this.username, this.password);
},
reset() {
this.username = "";
this.password = "";
console.log(this.username, this.password);
},
},
});
</script>
v-model在其他表单元素的使用
常见的表单元素都可以用 v-model 绑定关联 → 快速 获取 或 设置 表单元素的值
它会根据 控件类型 自动选取 正确的方法 来更新元素
输入框 input:text ——> value
文本域 textarea ——> value
复选框 input:checkbox ——> checked
单选框 input:radio ——> checked
下拉菜单 select ——> value
...
<body>
<div id="app">
<h3>xx学习网</h3>
姓名:
<input type="text" v-model="username" />
<br /><br />
是否单身:
<input type="checkbox" v-model="isSingle" />
<br /><br />
<!--
1. name: 给单选框加上 name 属性 可以分组 → 同一组互相会互斥
2. value: 给单选框加上 value 属性,用于提交给后台的数据
-->
性别:
<input v-model="gender" type="radio" name="gender" :value="1" />男
<input v-model="gender" type="radio" name="gender" :value="2" />女
<br /><br />
<!--
1. option 需要设置 value 值,提交给后台
2. select 的 value 值,关联了选中的 option 的 value 值
-->
所在城市:
<select v-model="cityId" >
<option value="1">北京</option>
<option value="2">上海</option>
<option value="3">成都</option>
<option value="4">南京</option>
</select> {{cityId}}
<br /><br />
自我描述:
<textarea v-model="desc"></textarea>
<button>立即注册</button>
</div>
<script src="./vue/vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
username: "789",
isSingle: true,
gender: 1,
cityId: '3',
desc: "",
},
methods: {
fun() {
console.log(this.cityId);
},
},
});
</script>
</body>
(五)综合案例——记事本
<body>
<!-- 主体区域 -->
<section id="app">
<!-- 输入框 -->
<header class="header">
<h1>记事本</h1>
<input placeholder="请输入任务" class="new-todo" v-model="todoName" />
<button class="add" @click="addTodo">添加任务</button>
</header>
<!-- 列表区域 -->
<section class="main">
<ul class="todo-list">
<li class="todo" v-for="(item, index) in list" :key="index">
<div class="view">
<span class="index">{{index+1}}</span>
<label>{{item.name}}</label>
<button class="destroy" @click="del(item.id)"></button>
</div>
</li>
</ul>
</section>
<!-- 统计和清空 -->
<footer class="footer" v-show="this.list.length > 0">
<!-- 统计 -->
<span class="todo-count">合 计:<strong> {{list.length}} </strong></span>
<!-- 清空 -->
<button class="clear-completed" @click="resetToDo">清空任务</button>
</footer>
</section>
</body>
<!-- 底部 -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {
todoName: "",
list: [
{ id: 1, name: "跑步十公里" },
{ id: 2, name: "跑步五公里" },
{ id: 3, name: "跑步三公里" },
],
isShow: true,
},
methods: {
del(id) {
this.list = this.list.filter((item) => item.id !== id);
},
addTodo() {
if (this.todoName.trim() !== "") {
this.list.push({
id: +new Date(),
name: this.todoName,
});
// 添加完成后要清空输入框
this.todoName = "";
} else {
return;
}
console.log(this.list);
},
resetToDo() {
this.list = [];
},
},
});
</script>
七、指令修饰符
所谓指令修饰符就是通过“.”指明一些指令后缀 不同的后缀封装了不同的处理操作 —> 简化代码
1.按键修饰符
@keyup.enter —>当点击enter键的时候才触发
<input type="text" v-model.trim="username" @keyup.enter="writeSomething"/>
<input type="text" v-model.trim.number="age" @keyup.enter="writeSomething"/>
<header class="header">
<h1>记事本</h1>
<input
@keyup.enter="addTodo"
placeholder="请输入任务"
class="new-todo"
v-model="todoName"
/>
<button class="add" @click="addTodo">添加任务</button>
</header>
此时,点击添加按钮和回车,都能触发addTodo函数
小tips:通过函数的形参,可以拿到事件绑定的对象
<body>
<div id="app">
<button @click="handleClick">点击我</button>
</div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
const app = new Vue({
el: "#app",
data: {},
methods: {
handleClick(event) {
console.log(event); // 这里可以访问到事件对象
console.log(event.target);
console.log(event.type);
console.log(event.pageX);
// 可以访问 event.target, event.type, event.pageX 等属性
},
},
});
</script>
2.v-model修饰符
v-model.trim —>去除两端空格
v-model.number —>转数字
姓名:<input type="text" v-model.trim="username" @keyup.enter="writeSomething"/>
年龄<input type="text" v-model.trim.number="age" @keyup.enter="writeSomething"/>
3.事件修饰符
@事件名.stop —> 阻止冒泡
@事件名.prevent —>阻止默认行为
@事件名.stop.prevent —>可以连用 即阻止事件冒泡也阻止默认行为