表单控制、购物车案例、v-model进阶、vue生命周期、vue与后端交互
表单控制
checkbox单选
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
</head>
<body>
<div id="app">
<h1>checkbox单选</h1>
<br>
<br>
<input type="text" placeholder="请输入用户名" v-model="username">
<br>
<br>
<input type="password" placeholder="请输入密码" v-model="password">
<br>
<br>
记住密码:<input type="checkbox" v-model="remember">
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
username:'',
password:'',
remember:false,
},
})
</script>
</body>
</html>

单选radio
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
</head>
<body>
<div id="app">
<h1>radio</h1>
<br>
<br>
<input type="text" placeholder="请输入用户名" v-model="username">
<br>
<br>
<input type="password" placeholder="请输入密码" v-model="password">
<br>
<br>
<input type="radio" v-model="gender" value="1">男
<input type="radio" v-model="gender" value="2">女
<input type="radio" v-model="gender" value="0">未知
<hr>
您选择的性别是:{{gender}}
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
username:'',
password:'',
gender:'',
},
})
</script>
</body>
</html>

多选
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
</head>
<body>
<div id="app">
<h1>checkbox多选</h1>
<br>
爱好:
<br>
<input type="checkbox" v-model="check_many" value='化妆'>化妆
<input type="checkbox" v-model="check_many" value='逛街'>逛街
<input type="checkbox" v-model="check_many" value='吃饭'>吃饭
<input type="checkbox" v-model="check_many" value='旅游'>旅游
<hr>
{{check_many}}
<hr>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
check_many:[],
},
})
</script>
</body>
</html>

购物车
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
</head>
<body>
<div id="app">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<h1>基本购物车</h1>
<table class="table table-bordered">
<thead>
<tr>
<th>商品id号</th>
<th>商品名</th>
<th>商品价格</th>
<th>商品数量</th>
</tr>
</thead>
<tbody>
<tr v-for="good in goodList" :key="good.id">
<th>{{good.id}}</th>
<td>{{good.name}}</td>
<td>{{good.price}}</td>
<td>{{good.number}}</td>
<td><input type="checkbox" v-model="checkGroup" :value="good"></td>
</tr>
</tbody>
</table>
<hr>
总价格是:{{getPrice()}}
<hr>
选中了:{{checkGroup}}
</div>
</div>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
goodList: [{id: 1, name: '小汽车', price: 89731, number: 1},
{id: 2, name: '小火车', price: 33292, number: 4},
{id: 3, name: '小飞机', price: 49184, number: 5},
{id: 4, name: '小坦克', price: 29433, number: 2},
{id: 5, name: '小轮船', price: 53224, number: 6},
{id: 6, name: '小木筏', price: 48972, number: 4},],
checkGroup: [],
},
methods: {
getPrice() {
var total = 0
// 方式一:
// for (i = 0; i < this.checkGroup.length; i++) {
// total += this.checkGroup[i].price * this.checkGroup[i].number
// }
// 方式二:
// for (i in this.checkGroup){
// total += this.checkGroup[i].price * this.checkGroup[i].number
// }
// 方式三:
this.checkGroup.forEach(function (value,index){
total+=value.price*value.number
})
return total
}
}
})
</script>
</body>
</html>

购物车全选与全不选
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
</head>
<body>
<div id="app">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<h1>基本购物车</h1>
<table class="table table-bordered">
<thead>
<tr>
<th>商品id号</th>
<th>商品名</th>
<th>商品价格</th>
<th>商品数量</th>
<th>全选/全不选<input type="checkbox" v-model="allChecked" @change="checkAll"></th>
</tr>
</thead>
<tbody>
<tr v-for="good in goodList" :key="good.id">
<th>{{good.id}}</th>
<td>{{good.name}}</td>
<td>{{good.price}}</td>
<td>{{good.number}}</td>
<td><input type="checkbox" v-model="checkGroup" :value="good" @change="checkOne"></td>
</tr>
</tbody>
</table>
<hr>
总价格是:{{getPrice()}}
<hr>
选中了:{{checkGroup}}
</div>
</div>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
goodList: [{id: 1, name: '小汽车', price: 89731, number: 1},
{id: 2, name: '小火车', price: 33292, number: 4},
{id: 3, name: '小飞机', price: 49184, number: 5},
{id: 4, name: '小坦克', price: 29433, number: 2},
{id: 5, name: '小轮船', price: 53224, number: 6},
{id: 6, name: '小木筏', price: 48972, number: 4},],
checkGroup: [],
allChecked: false,
},
methods: {
getPrice() {
var total = 0
// 方式一:
// for (i = 0; i < this.checkGroup.length; i++) {
// total += this.checkGroup[i].price * this.checkGroup[i].number
// }
// 方式二:
// for (i in this.checkGroup){
// total += this.checkGroup[i].price * this.checkGroup[i].number
// }
// 方式三:
this.checkGroup.forEach(function (value,index){
total+=value.price*value.number
})
return total
},
checkAll(){
if (this.checkGroup.length > 0){
this.checkGroup = []
}else{
this.checkGroup = this.goodList
}
},
checkOne(){
this.allChecked = this.checkGroup.length === this.goodList.length;
}
}
})
</script>
</body>
</html>

购物车商品数量加减操作
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
</head>
<body>
<div id="app">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<h1>基本购物车</h1>
<table class="table table-bordered">
<thead>
<tr>
<th>商品id号</th>
<th>商品名</th>
<th>商品价格</th>
<th>商品数量</th>
<th>全选/全不选<input type="checkbox" v-model="allChecked" @change="checkAll"></th>
</tr>
</thead>
<tbody>
<tr v-for="good in goodList" :key="good.id">
<th>{{good.id}}</th>
<td>{{good.name}}</td>
<td>{{good.price}}</td>
<td><button class="btn link btn-sm" @click="reduceNum(good)">-</button>{{good.number}}<button class="btn link btn-sm" @click="good.number++">+</button></td>
<td><input type="checkbox" v-model="checkGroup" :value="good" @change="checkOne"></td>
</tr>
</tbody>
</table>
<hr>
总价格是:{{getPrice()}}
<hr>
选中了:{{checkGroup}}
</div>
</div>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
goodList: [{id: 1, name: '小汽车', price: 89731, number: 1},
{id: 2, name: '小火车', price: 33292, number: 4},
{id: 3, name: '小飞机', price: 49184, number: 5},
{id: 4, name: '小坦克', price: 29433, number: 2},
{id: 5, name: '小轮船', price: 53224, number: 6},
{id: 6, name: '小木筏', price: 48972, number: 4},],
checkGroup: [],
allChecked: false,
},
methods: {
getPrice() {
var total = 0
// 方式一:
// for (i = 0; i < this.checkGroup.length; i++) {
// total += this.checkGroup[i].price * this.checkGroup[i].number
// }
// 方式二:
// for (i in this.checkGroup){
// total += this.checkGroup[i].price * this.checkGroup[i].number
// }
// 方式三:
this.checkGroup.forEach(function (value,index){
total+=value.price*value.number
})
return total
},
checkAll(){
if (this.checkGroup.length > 0){
this.checkGroup = []
}else{
this.checkGroup = this.goodList
}
},
checkOne(){
this.allChecked = this.checkGroup.length === this.goodList.length;
},
reduceNum(good) {
if (good.number === 1) {
good.number = 1
} else {
good.number--
}
}
}
})
</script>
</body>
</html>

v-model进阶
lazy:等待input框的数据绑定时区焦点之后再变化
number:数字开头,只保留数字,后面的字母不保留;字母开头,都保留
trim:去除首位的空格
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
</head>
<body>
<div id="app">
<h1>v-model</h1>
<input type="text" v-model.lazy="name1">------{{name1}}
<br>
<br>
<input type="text" v-model.number="name2">------{{name2}}
<br>
<br>
<input type="text" v-model.trim="name3">------{{name3}}
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
name1: '',
name2: '',
name3: ''
},
})
</script>
</body>
</html>

vue生命周期

var vm=new Vue实例()
1 实例创建,数据放到实例中
2 挂载模板:el---> div
3 改页面,改变量,都会相互影响 update
4 销毁实例
4个过程,对应八个函数,依次执行(到某个过程就会执行某个函数)
beforeCreate 创建Vue实例之前调用,data,el都没有
created 创建Vue实例成功后调用(可以在此处发送异步请求后端数据),data有了,el没有的
beforeMount 渲染DOM之前调用 ,data有了,el没有
mounted 渲染DOM之后调用
beforeUpdate 重新渲染之前调用(数据更新等操作时,控制DOM重新渲染)
updated 重新渲染完成之后调用
beforeDestroy 销毁之前调用
destroyed 销毁之后调用
注意:vm实例:看不到它销毁 组件v
学习生命周期重点掌握的
1 组件向后端发送请求,获取数据,应该放在 created 写,此时data已经有数据了
2 destroyed做一些资源清理性的工作
小案例:组件创建,开启定时器,不停的打印hello,在destroyed中对定时器进行销毁
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
</head>
<body>
<div id="app">
<button @click="handleShow">点我组件显示和消失</button>
<Child v-if="show"></Child>
</div>
<script>
// 创建一个组件
Vue.component('Child',{
template: `
<div id="app">
<h1>{{name}}</h1>
<button @click="handleClick">点我看美女</button>
</div>
`,
data(){
return{
name:'所以我是超幸福的'
}
},
methods:{
handleClick(){
alert('美女')
}
},
beforeCreate() {
console.log('beforeCreate')
},
created() {
console.log('created')
},
beforeMount() {
console.log('beforeMount')
},
mounted() {
//用的最多,向后端加载数据,创建定时器等
console.log("页面已被vue实例渲染, data, methods已更新");
console.log('mounted')
this.t = setInterval(function () {
console.log('张小冉是最美的女生,不接受反驳!!')
}, 3000)
},
beforeUpdate() {
console.log('beforeUpdate')
},
updated() {
console.log('updated')
},
beforeDestroy() {
console.log('created')
},
destroyed() {
//组件销毁,清理定时器
clearInterval(this.t)
this.t = null
console.log('destoryed')
},
})
var vm = new Vue({
el: '#app',
data: {
show:true,
},
methods: {
handleShow(){
this.show=!this.show
}
}
})
</script>
</body>
</html>
# 延时任务
setTimeout(()=>{
console.log('3s后执行我')
},3000)
# 定时任务
setInterval(()=>{
console.log('hello')
},3000)
# 什么场景下用定时任务?
1 实时跟后端交互 基于http+定时任务 (websocket协议:服务端主动推送消息,手机app的消息推送)
2 秒杀场景:先提交秒杀请求,每隔3s,查询是否秒到

vue与后端交互
jquery的Ajax与后端交互
view.py
from django.http import JsonResponse
# Create your views here.
def index(request):
user_dict = {'name': 'zxr', 'age': 18}
res = JsonResponse(user_dict)
res["Access-Control-Allow-Origin"] = '*'
return res
html.py
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
</head>
<body>
<div id="app">
<button @click="handleClick">点我想后端发送请求,获取用户信息</button>
<br>
<br>
用户名:{{ name }}
<br>
<br>
年龄:{{ age }}
</div>
<script>
new Vue({
el: '#app',
data: {
name: '',
age: '',
},
methods: {
handleClick() {
// 发送ajax请求
$.ajax({
'url': 'http://127.0.0.1:8000/index/',
'type': 'get',
success: data=>{
this.name = data.name
console.log(this.name)
this.age = data.age
console.log(this.age)
}
})
}
}
})
</script>
</body>
</html>

js原生的fetch与后端交互
handleClick2() { // 用的很少
fetch('http://127.0.0.1:8000/index/').then(res => res.json()).then(res => {
console.log(res)
console.log(typeof res)
this.name = res.name
this.age = res.age
})
},
axios与后端交互
handleClick3() { // 用的很少
axios.get('http://127.0.0.1:8000/index/').then(res => {
console.log(res.data) // 后端真正的数据在res.data中
this.name = res.data.name
this.age = res.data.age
})
},
axios加载后端小案例
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
</head>
<body>
<div id="app">
<ul>
<li v-for="item in film_data">
<h2>电影名字:{{ item.name }}</h2>
<p>电影介绍:{{ item.synopsis }}</p>
<img :src="item.poster" alt=""width="200px" height="300">
</li>
</ul>
</div>
<script>
new Vue({
el: '#app',
data: {
film_data:[]
},
created() {
axios.get('http://127.0.0.1:8000/film/').then(res =>{
this.film_data = res.data.data.films
})
}
})
</script>
</body>
</html>
view.py
import json
from django.http import JsonResponse
# Create your views here.
def film(request):
with open('./film.json', 'r', encoding='utf8') as f:
res = json.load(f)
res1 = JsonResponse(res)
res1["Access-Control-Allow-Origin"] = '*'
return res1
url.py
from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index),
path('film/', views.film),
]

浙公网安备 33010602011771号