Vue-01
一.Vue快速上手
(1)Vue概念
Vue 是什么?
概念:Vue 是一个用于 构建用户界面 (基于数据渲染出用户看到的页面) 的 渐进式 (循序渐进的学习) 框架 (一套完整的项目解决方案,提升开发效率)
Vue 的两种使用方式:
① Vue 核心包开发 场景:局部 模块改造
② Vue 核心包 & Vue 插件 工程化开发 场景:整站 开发
(2)创建实例
核心步骤 4步:
1.准备容器
2.引包 (官网) - 开发版本 / 生产版本
3.创建 Vue 实例 new Vue()
4.指定配置项→ 渲染数据
① el 指定挂载点
② data 提供数据
<body>
<!-- 1.准备容器 (Vue所管理的范围) -->
<div id="app"> {{msg}} </div>
<!-- 2. 引包 (开发版本包 / 生产版本包) 官网 -->
<!-- 开发版本:包含完整的警告和调试模式,学习阶段统一使用开发版本 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
<script>
// 一旦引入了vue的包,全局就会有一个Vue构造函数
// 3. 创建实例
// 4. 添加配置项 => 完成渲染
const app = new Vue({
el: '#app',
data: {
msg: '你好哇世界!'
}
})
</script>
(3)差值表达式 {{ }}
插值表达式是一种 Vue 的模板语法
语法:{{ 表达式 }}
注意点:
(1)使用的数据必须存在 (data)
(2)支持的是表达式,而非语句,比如:if for …
(3)不能在标签属性中使用 {{ }} 插值
(4)响应式特征
响应式:数据变化,视图自动更新 (聚焦于数据 → 数据驱动视图)
① 访问数据: “实例.属性名”
② 修改数据: “实例.属性名” = “值”
(5)安装 Vue 开发者工具:装插件调试 Vue 应用
(1)通过谷歌应用商店安装 (国外网站)
(2)极简插件: 下载 → 开发者模式 → 拖拽安装 → 插件详情允许访问文件
二.Vue指令
Vue 会根据不同的【指令】,针对标签实现不同的【功能】
指令:带有 v- 前缀 的 特殊 标签属性
(1)v-html:
作用:设置元素的 innerHTML
语法:v-html = "表达式 "
<body>
<div id="app">
<div>{{msg}}</div>
<!-- v-html:设置元素的innerHTML -->
<!-- v-html='表达式' -->
<div v-html='msg'></div>
<!-- 注意:如果使用了v-html则标签内不能再写内容了,会被v-html的结果覆盖掉 -->
<div v-html='msg'>1234</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
<script>
/**
* 目标:
* 将带有标签的 msg 数据解析标签并渲染到 div 中
*/
const app = new Vue({
el: '#app',
data: {
msg: '<h1>设置元素的innerHTML</h1>'
}
})
</script>
(2)v-show / v-if
v-show
1.作用: 控制元素显示隐藏
2.语法: v-show = “表达式” 表达式值 true 显示, false 隐藏
3.原理: 切换 display:none 控制显示隐藏
4.场景: 频繁切换显示隐藏的场景
v-if
-
作用: 控制元素显示隐藏(条件渲染)
-
语法: v-if = “表达式” 表达式值 true 显示, false 隐藏
-
原理: 基于条件判断,是否 创建 或 移除 元素节点
-
场景: 要么显示,要么隐藏,不频繁切换的场景
<body>
<div id="app">
<div class="box" v-show='isShow'>我是v-show控制的盒子</div>
<div class="box" v-if='isShow'>我是v-if控制的盒子</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
<script>
/**
* 目标: 控制盒子显示隐藏
* v-show 底层原理:通过设置display:none来改变盒子的显示状态
* v-if 底层原理:通过创建/删除DOM元素来实现盒子的显示隐藏
* */
const app = new Vue({
el: '#app',
data: {
isShow:true
}
})
</script>
</body>
(3)v-else v-else-if
- 作用: 辅助 v-if 进行判断渲染
- 语法: v-else v-else-if = “表达式”
3.注意: 需要紧挨着 v-if 一起使用
<body>
<div id="app">
<p v-if='gender === 1'>性别:♂ 男</p>
<p v-else>性别:♀ 女</p>
<hr>
<p v-if="score >= 90">成绩评定A:奖励电脑一台</p>
<p v-else-if="score >= 70">成绩评定B:奖励周末郊游</p>
<p v-else-if="score >= 60">成绩评定C:奖励零食礼包</p>
<p v-else>成绩评定D:惩罚一周不能玩手机</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
<script>
// 目标:
// 1. 根据条件渲染姓名
// 2. 根据成绩来渲染奖励
const app = new Vue({
el: '#app',
data: {
gender: 1,
score: 95
}
})
</script>
</body>
(4)v-on
-
作用: 注册事件= 添加监听 + 提供处理逻辑
2. 语法:
① v-on:事件名 = “内联语句”
② v-on:事件名 = “methods中的函数名” / v-on:事件名=“处理函数(实参)” -
简写:@事件名
v-on:事件名 = “内联语句”
<body>
<div id="app">
<button @click='count--'>-</button>
<span>{{ count }}</span>
<button @click='count++'>+</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
<script>
// 目标: 点击 - 让数字减一, 点击 + 让数字加一
const app = new Vue({
el: '#app',
data: {
count: 100
}
})
</script>
</body>
v-on:事件名 = “methods中的函数名”
<body>
<div id="app">
<button @click='fn'>切换显示隐藏</button>
<h1 v-if='isShow'>程序猿</h1>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
<script>
/**
* 目标:
* 点击切换 h1 标签显示隐藏
*/
const app = new Vue({
el: '#app',
data: {
isShow: true
},
// methods中存放函数
// 注意:主要是定义在methods中的函数,最终都会放到实例对象上,所以内部的this助兴实力对象
methods: {
fn() {
this.isShow = !this.isShow
}
}
})
</script>
</body>
v-on:事件名=“处理函数(实参)”
<body>
<div id="app">
<div class="box">
<h3>自动售货机</h3>
<button @click='buy(5)'>可乐5元</button>
<button @click='buy(10)'>咖啡10元</button>
</div>
<p>银行卡余额:{{ money }}元</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
<script>
/**
* 目标:
* 点击不同按钮, 银行卡余额减少对应的金额
*/
const app = new Vue({
el: '#app',
data: {
money: 100
},
methods:{
buy(price){
this.money -= price
}
}
})
</script>
</body>
(5)v-bind
- 作用: 动态的设置html的标签属性 src url title …
- 语法: v-bind:属性名=“表达式”
- 注意: 简写形式 :属性名=“表达式”
<body>
<div id="app">
<!-- <img v-bind:src='imgUrl' v-bind:title='msg' alt=""> -->
<!-- 简写 -->
<img :src='imgUrl' :title='msg' alt="">
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
<script>
/**
* 目标:
* 使用 v-bind 指令动态绑定标签属性
*/
const app = new Vue({
el: '#app',
data: {
imgUrl: './imgs/10-02.png',
msg: 'hello '
}
})
</script>
</body>
(6)v-for
-
作用: 基于数据(数组、对象、数字… )循环, 多次渲染整个元素
-
遍历数组语法:
v-for = “(item, index) in 数组”item 每一项, index 下标
3.省略 index: v-for = “item in 数组”
<body>
<div id="app">
<h3>水果店</h3>
<ul>
<li v-for='(item,index) in list'>{{item}}---{{index}}</li>
</ul>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
<script>
/**
* 目标: 使用 v-for 循环渲染 li
*/
const app = new Vue({
el: '#app',
data: {
list: ['西瓜', '苹果', '鸭梨', '榴莲']
}
})
</script>
</body>
(7)v-for 中的 key
语法:key属性 = “唯一标识”
作用:给列表项添加的唯一标识。便于Vue进行列表项的正确排序复用。
v-for 的默认行为会尝试 原地修改元素 (就地复用)
注意:
1. key 的值只能是 字符串 或 数字类型
2. key 的值必须具有 唯一性
3. 推荐使用 id 作为 key(唯一),不推荐使用 index 作为 key(会变化,不对应)
<body>
<div id="app">
<h3>小小图书馆</h3>
<ul>
<!-- 复用:Vue不会轻易删除DOM并重新并重新创建DOM,因为这样很消耗性能,它会想尽一切办法少的去销毁DOM -->
<!-- v-for 的默认复用策略:就地更新,当前删除第一个元素后,还剩3个li,那么Vue就会把最后一个li删除,里面的内容平移,以复用所有现存的li -->
<!-- v-for 时建议加上key属性,一般用唯一标识:id -->
<!-- key的设置要求:
1.一定要在当前v-for中唯一
2.必须是string或number -->
<li v-for="(item, index) in booksList" :key='item.id'>
<span>{{ item.name }}</span>
<span>{{ item.author }}</span>
<button @click="del(item.id)">删除</button>
</li>
</ul>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
<script>
/**
* 目标: 理解 v-for 中 :key 的作用
*/
const app = new Vue({
el: '#app',
data: {
booksList: [
{ id: 1, name: '《红楼梦》', author: '曹雪芹' },
{ id: 2, name: '《西游记》', author: '吴承恩' },
{ id: 3, name: '《水浒传》', author: '施耐庵' },
{ id: 4, name: '《三国演义》', author: '罗贯中' }
]
},
methods: {
del(id) {
this.booksList = this.booksList.filter(item => item.id !== id)
}
}
})
</script>
</body>
(8)v-model
-
作用: 给 表单元素 使用, 双向数据绑定(可以快速 获取 或 设置 表单元素内容)
① 数据变化 → 视图自动更新
② 视图变化 → 数据自动更新 -
语法: v-model = ‘变量’
<body>
<div id="app">
<!--
v-model 可以让数据和视图,形成双向数据绑定
1. 数据变化,视图自动更新
2. 视图变化,数据自动更新
可以快速获取或设置表单元素的内容
-->
账户:<input type="text" v-model='username'> <br><br>
密码:<input type="password" v-model='password'><br><br>
<button @click="login">登录</button>
<button @click="reset">重置</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
<script>
/**
* 目标: 理解 v-model 的使用
* 1. 使用 v-model 双向绑定用户名和密码
* 2. 点击登录时直接获取用户名密码数据
* 3. 点击重置时直接重置用户名和密码
*/
const app = new Vue({
el: '#app',
data: {
username:'',
password:''
},
methods: {
login(){
console.log(this.username,this.password);
},
reset(){
this.username = ''
this.password = ''
}
}
})
</script>
</body>