文章目录
来源博客:【Harryの心阁】
认识Vue
- 渐进式框架
Core+Vue-router+Vuex
全家桶- 特点:
- 解耦视图和数据
- 可复用的组件
- 前端路由技术
- 状态管理
- 虚拟DOM
初识Vue
let app = new Vue({
el: '#app', // 挂载要管理的元素
data: { // 定义数据
message: '你好,世界'
}
})
简单计数器
<div id="app">
<h2>当前计数:{{counter}}</h2>
<button @click="counter++">+</button>
<button @click="counter--">-</button>
</div>
<script src="./js/vue.js"></script>
<script>
let app = new Vue({
el: '#app',
data: {
counter: 0
}
})
</script>
<div id="app">
<h2>当前计数:{{counter}}</h2>
<!-- <button @click="counter++">+</button>
<button @click="counter--">-</button> -->
<button v-on:click="addNum">+</button>
<button v-on:click="subNum">-</button>
</div>
<script src="./js/vue.js"></script>
<script>
let app = new Vue({
el: '#app',
// mushache语法
data: {
counter: 0
},
methods: {
addNum: function() {
this.counter++;
},
subNum: function() {
this.counter--;
}
}
})
</script>
事件指令
v-once
- 只会在第一次的时候展示,只渲染一次
- 没有表达式
v-html和v-text
- 相当于
innerHTML
- 相当于
innerText
都会将标签中的内容覆盖
v-pre
- 原文输出 不进行解析
v-bind
- 动态绑定class 使用
v-bind:class
或者:class
- class 里面可以写数组,对象,方法
methods
计算属性的setter和getter
- 计算属性一般是没有set方法,只读属性
- 使用计算属性中的set方法必须设置参数
v-on
- 可以使用
@
代替v-on:
- 参数 不需要额外的参数小括号可以省略
$event
对象获取浏览器参数
修饰词
- 修饰符
.stop
阻止事件冒泡 - 阻止表单的默认提交事件
.prevent
- 监听键盘的事件
@keyup
监听键盘回车事件.enter
.once
只能执行一次.navice
监听组件的事件
v-if
- 多个元素 通过条件判断展示或者隐藏某个元素. 或者多个元素
- 进行两个视图之间的切换
条件渲染的问题
- 在渲染DOM时,会复用原来的DOM元素
- 使用
key
标识 会创建新的DOM元素
v-show
- 元素隐藏 保留元素
- 切换频率高时使用
v-show
key的作用
- 为了更高效的更新渲染虚拟DOM
diff
算法
响应式问题
- 可以做到响应式:
push
在数组中追加元素;pop()
删除数组中的最后一个元素,shift()
删除数组中的第一个元素unshift()
在数组中最前面追加元素;splice()
删除元素/插入元素/替换元素(关键在第二个参数);sort()
排序;reverse()
进行反转;Vue.set(修改的对象, 索引值, 要修改的元素)
- 通过索引值修改数组中的元素 无法进行页面渲染
filters
filters不会修改数据, 只是改变用户看到的输出(效果)
购物车案例
<!DOCTYPE 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>图书购物车</title>
</head>
<style>
body {
padding: 0;
margin: 0;
box-sizing: border-box;
}
.table_warp {
padding: 20px;
}
table {
border: 1px solid #ccc;
border-right: 0;
border-bottom: 0;
border-spacing: 0;
}
thead {
background-color: rgb(246, 246, 246);
}
td,
th {
padding: 10px;
border-bottom: 1px solid #ccc;
border-right: 1px solid #ccc;
}
button {
margin: 0 5px;
}
</style>
<body>
<div class="table_warp" id="app">
<h2>图书购物车</h2>
<div v-if="bookList.length">
<table>
<thead>
<th>
<td v-for="(item,index) in th_title">{{item}}</td>
</th>
</thead>
<tbody>
<tr v-for="(item,index) in bookList">
<td>{{index+1}}</td>
<td>{{item.name}}</td>
<td>{{item.datePublish}}</td>
<td>{{item.price*item.puNum| getPrice}}</td>
<td><button @click="item.puNum>1?item.puNum--:false">-</button>{{item.puNum}}<button @click="item.puNum++">+</button></td>
<td><button @click="removeBook(index)">移除</button></td>
</tr>
</tbody>
</table>
<div>总价格:{{totalPrice | getPrice}}</div>
</div>
<h3 v-else>购物车为空</h3>
</div>
</body>
<script src="./js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
th_title: ['书籍名称', '出版日期', '价格', '购买数量', '操作'],
bookList: [{
id: 0,
name: '《算法导论》',
datePublish: '2006-9',
price: 85.00,
puNum: 2
},
{
id: 1,
name: 'UNIX编程艺术',
datePublish: '2008-9',
price: 35.00,
puNum: 1
},
{
id: 2,
name: '《编程珠玑》',
datePublish: '2006-9',
price: 85.00,
puNum: 1
},
{
id: 3,
name: '《算法导论》',
datePublish: '2010-9',
price: 100.00,
puNum: 1
},
{
id: 4,
name: '《算法导论》',
datePublish: '2026-9',
price: 76.00,
puNum: 1
}
]
},
computed: {
// 计算总价格
totalPrice() {
return this.bookList.reduce((v, i) => v + i.price * i.puNum, 0)
}
},
methods: {
// 移除书籍
removeBook(index) {
this.bookList.splice(index, 1)
}
// getPrice(price) {
// return '¥' + price.toFixed(2)
// }
},
// 过滤器的使用
filters: {
getPrice(price) {
return '¥' + price.toFixed(2)
}
}
})
</script>
</html>
v-model
input
双向绑定radio
使用时双向绑定 如果绑定的时相同的数据,name
可以省略selected
多个选择加入属性multiple
<!-- <input type="text" v-model='message'>{{message}} 使用v-model实现双向绑定 -->
<input type="text" :value="message" @input="message = $event.target.value">{{message}}
<!--使用input事件-->
修饰符
.lazy
失去焦点或者用户点击回车时指向- 默认情况传入的数据类型为
string
使用修饰词.number
将数据类型转换成number .trim
将空格去除
组件化开发
- 拆分成一个一个的, 可复用的组件
步骤 - 创建组件构造器, 调用
Vue.extend()
方法 - 注册组件
Vue.component()
方法, 全局组件 - 使用组件
components属性
- 构建局部属性, 在Vue实例中
父组件和子组件
- 组件和组件之间存在层级关系
父子组件的通信
props
属性 向子组件传递数据- 自定义事件
$emit
子传父
props传值类型
- 可以使用对象方法传递, 或者数组
- 在使用对象方法时, 可以给传递的参数设定数据类型String, Array, Object, Null, Undefined, Number, Symbol
- 也可以给传递的参数设定默认值
default
, 设定改参数是否必须接受传值required
, 也可以自定义验证函数validator
- 如果设定的数据类型为对象或者数组时 设置默认值时必须从一个工厂函数获取
default:function(){}
es5,default(){}
es6
子传父
- 使用emit发送事件, 自定义事件
注册语法糖
Vue.component(组件标签名, {template})
注册全局组件的语法糖- 局部注册组件在
components
中{(组件标签名, {template})}
分离template方法
- 通过script类型
text/x-template
通过id来获取模板 - 或者直接通过
template
标签
组件内data动态化实现
- data类型不是对象类型, 而是函数类型, 在函数的返回值中定义数据data
- data函数是为了使组件之间相互独立, 返回的数据 地址不相同