一、创建Vue实例
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>HELLO WORLD</title>
<script type="text/javascript"></script>
</head>
<body>
<div id="app"> //1.创建容器
<h1> {{ msg }} </h1> //插值引入
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script> //2.引入包
<script>
//3.创建实体
const app = new Vue({
el: '#app',
data:{
msg: 'hello'
}
})
</script>
</body>
</html>
二、Vue的常用指令
指令总结
v-html //以html代码的形式解析传入data
v-show //以控制display:none来控制显示隐藏
v-if //基于条件判断以创建元素节点来控制显示隐藏
v-else v-else-if //条件判断
v-on //添加监听+提供处理逻辑 可替换为@
v-bind //动态设置标签属性 简写:
v-for //循环,多次渲染整个元素
v-model //数据和视图双向数据绑定
v-bind //class 样式控制
案例:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript"></script>
</head>
<body>
<div id="app">
<div class="box">
<h3>小黑的书架</h3>
<li v-for="(item,index) in list" :key="item.id">
<span>{{ item.name }} </span>
<button v-on:click="fn(item.id)">删除</button>
</li>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data:{
list:[{id:1 ,name:'《红楼梦》曹雪芹'},
{id:2 ,name:'《西游记》吴承恩'},
{id:3 ,name:'《水浒》施耐庵'},
{id:4 ,name:'《三国演义》罗贯中'}]
},
methods: {
fn(number){
this.list = this.list.filter(item => item.id !== number) //过滤后返回一个新数值
console.log(this.list.filter(item => item.id !== number))
}
}
})
</script>
</body>
</html>
案例:
只是简单的书写功能要求,没有样式
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript"></script>
</head>
<body>
<div id="app">
<div class="box">
<h3>小黑记事本</h3>
<input v-model="todoname" placeholder="输入任务" class="new-todo" />
<button @click="add">添加</button>
<ul>
<li v-for="(item,index) in list" :key="item.id">
<span @mouseover="showTip=true" @mouseleave="showTip=false"> //鼠标悬停出现按钮未优化
<span class="index" >{{ index+1 }} </span>
<span> {{ item.name }} </span>
<button v-show="showTip" @click="destory(item.id)">消除</button>
</span>
</li>
</ul>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data:{
todoname:' ',
showTip: false,
list:[{id:1 ,name:'跑步'},
{id:2 ,name:'跳水'},
{id:3 ,name:'跳绳'},
{id:4 ,name:'游泳'}]
},
methods: {
destory(number){
this.list = this.list.filter(item => item.id !== number) //过滤后返回一个新数值
console.log(this.list.filter(item => item.id !== number))
},
add(){
console.log(this.todoname)
if (this.todoname.trim() === ''){
alert('输入')
return
}
this.list.unshift(
{
id: +new Date(),
name: this.todoname
})
this.todoname=''
}
}
})
</script>
</body>
</html>
计算属性
基于现有的数据,计算出来的新属性。依赖数据变化,自动重新计算。
优点:具有缓存特性,除非改变依赖,性能高。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>gift</title>
<script type="text/javascript"></script>
</head>
<body>
<div id="app">
<table>
<tr>
<th>name</th>
<th>count</th>
</tr>
<tr v-for="(item,index) in list" :key="item.id">
<th>{{item.name}}</th>
<th>{{item.num}}</th>
</tr>
</table>
<p>一共{{ totalcount }}个礼物</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:{
list:[{id:1,name:'basketball', num:1},
{id:2,name:'toll',num:5},
{id:3,name:'pen',num:6}]
},
computed:{
totalcount(){
let total=this.list.reduce((sum,item)=>sum+item.num,0) //累加计算函数0为sum的初始值
return total
}
}
})
</script>
</body>
</html>
watch侦听器
watch:{
words(newvalue,oldvalue){
console.log('change',newvalue,oldvalue)
}
watch:{
newgift(newvalue,oldvalue){
// console.log('change',newvalue,oldvalue)
clearTimeout(this.timer)
this.timer = setTimeout(async() => {
this.value=oldvalue
},1000)
} //防抖延迟
综合案例购物车
主要内容包含:1.v-for 列表展示
2.:class=”{active:item.isChecked}" 动态化展示
3. 全选反选绑定
4.实时监测本地化 【watch】
<!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" />
<link rel="stylesheet" href="./css/inputnumber.css" />
<link rel="stylesheet" href="./css/index.css" />
<title>购物车</title>
</head>
<body>
<div class="app-container" id="app">
<!-- 顶部banner -->
<div class="banner-box"><img src="http://autumnfish.cn/static/fruit.jpg" alt="" /></div>
<!-- 面包屑 -->
<div class="breadcrumb">
<span>🏠</span>
/
<span>购物车</span>
</div>
<!-- 购物车主体 -->
<div class="main" v-if="fruitList.length > 0">
<div class="table">
<!-- 头部 -->
<div class="thead">
<div class="tr">
<div class="th">选中</div>
<div class="th th-pic">图片</div>
<div class="th">单价</div>
<div class="th num-th">个数</div>
<div class="th">小计</div>
<div class="th">操作</div>
</div>
</div>
<!-- 身体 -->
<div class="tbody">
<div v-for="(item,index) in fruitList" :key="item.id" class="tr" :class="{active: item.isChecked}">
<div class="td"><input type="checkbox" v-model="item.isChecked" /></div>
<div class="td"><img :src="item.icon" alt="" /></div>
<div class="td" >{{ item.price }}</div>
<div class="td">
<div class="my-input-number">
<button :disabled="item.num <= 1" class="decrease" @click="sub(item.id)"> - </button>
<span class="my-input__inner" >{{ item.num }}</span>
<button class="increase" @click="add(item.id)"> + </button>
</div>
</div>
<div class="td">{{item.num *item.price}}</div>
<div class="td" @click="del(item.id)"><button>删除</button></div>
</div>
</div>
</div>
<!-- 底部 -->
<div class="bottom">
<!-- 全选 -->
<label class="check-all">
<input type="checkbox" v-model="atall" />
全选
</label>
<div class="right-box">
<!-- 所有商品总价 -->
<span class="price-box">总价 : ¥ <span class="price">{{ totalprice }}</span></span>
<!-- 结算按钮 -->
<button class="pay">结算( {{ totalcount }} )</button>
</div>
</div>
</div>
<!-- 空车 -->
<div class="empty" v-else>🛒空空如也</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
const firstlist= [
{
id: 1,
icon: './img/火龙果.png',
isChecked: true,
num: 2,
price: 6,
},
]
const app = new Vue({
el: '#app',
data: {
// 水果列表
fruitList:JSON.parse(localStorage.getItem('list')) || firstlist,
},
computed:{
atall:{
get(){
return this.fruitList.every(item => item.isChecked)
},
set(value){
this.fruitList.forEach(item => item.isChecked = value)
},
},
totalcount(){
return this.fruitList.reduce((sum,item)=> {
if(item.isChecked )
{
return sum + item.num
}
else{
return sum
}
},0)
},
totalprice()
{
return this.fruitList.reduce((sum,item)=>{
if(item.isChecked){
return sum + (item.num * item.price)
}
else{
return sum
}
},0)
}
},
methods:{
del(number){
this.fruitList=this.fruitList.filter(item => item.id !== number)
},
sub(id){
const fruit = this.fruitList.find(item => item.id === id )
fruit.num --
},
add(id){
const fruit=this.fruitList.find(item => item.id ===id )
fruit.num ++
}
},
watch:{
fruitList:{
deep:true,
handler (newvalue){
localStorage.setItem('list',JSON.stringify(newvalue))
}
}
},
})
</script>
</body>
</html>
ps:案例都来源黑马vue的学习,记录学习和编码的过程。
生命周期:created,mounted,update,destroy
案例数据展示
<body>
<div id="app">
<div class="contain">
<!-- 左侧列表 -->
<div class="list-box">
<!-- 添加资产 -->
<form class="my-form">
<input type="text" class="form-control" placeholder="消费名称" v-model.trim="name" />
<input type="text" class="form-control" placeholder="消费价格" v-model.number="price"/>
<button @click="add" type="button" class="btn btn-primary">添加账单</button>
</form>
<table class="table table-hover">
<thead>
<tr>
<th>编号</th>
<th>消费名称</th>
<th>消费价格</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr v-for="(item,index) in list" :key="item.id">
<td>{{ index + 1 }}</td>
<td>{{item.name}}</td>
<td :class="{red: item.price > 500}">{{item.price.toFixed(2)}}</td>
<td><a @click="del(item.id)" href="javascript:;">删除</a></td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan="4">消费总计: {{atall}}</td>
</tr>
</tfoot>
</table>
</div>
<!-- 右侧图表 -->
<div class="echarts-box" id="main"></div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/echarts@5.4.0/dist/echarts.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>
/**
*
* 功能需求:
* 1. 基本渲染
* 2. 添加功能
* 3. 删除功能
* 4. 饼图渲染
*/
const app = new Vue({
el: '#app',
data: {
list:[],
name:'',
price:''
},
computed:{
atall() {
return this.list.reduce((sum,item) =>sum+item.price ,0)
}
},
created(){
// const res = await axios.get('https://applet-base-api-t.itheima.net/bill', {
// params: {
// creator: '小黑'
// }
// })
// this.list=res.data.data
this.getlist()
console.log(this.list)
},
mounted(){
this.myChart = echarts.init(document.querySelector('#main'))
this.myChart.setOption({
// 大标题
title: {
text: '消费账单列表',
left: 'center'
},
// 提示框
tooltip: {
trigger: 'item'
},
// 图例
legend: {
orient: 'vertical',
left: 'left'
},
// 数据项
series: [
{
name: '消费账单',
type: 'pie',
radius: '50%', // 半径
data: [
// { value: 1048, name: '球鞋' },
// { value: 735, name: '防晒霜' }
],
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
})
},
methods:{
async getlist(){
const res = await axios.get('https://applet-base-api-t.itheima.net/bill', {
params: {
creator: 'heizi'
}
})
this.list=res.data.data
this.myChart.setOption({
series:[{
data:this.list.map(item =>({value : item.price,name : item.name}))
}]
})
},
async add(){
if(!this.name){
alert('pleace write')
}
const res =await axios.post('https://applet-base-api-t.itheima.net/bill',{
creator:'heizi',
name:this.name,
price:this.price,
})
this.getlist()
this.name=''
this.price=''
},
async del(id){
const res = await axios.delete(`https://applet-base-api-t.itheima.net/bill/${id}`)
this.getlist()
},
}
})
</script>
</body>