# 1 属性指令
-v-bind:属性名=属性值
-:属性名=属性值
-src,href,id,name,自定义属性
# 2 class和style属性
-字符串,数组,对象
-class使用数组,style使用对象(对象的key可以不加引号,如果不加引号,使用驼峰)
# 3 条件渲染
-v-if=条件
-v-else-if=条件
-v-else
-如果复合期中某一个,显示某个标签
# 4 列表渲染
-v-for
-对象 item in book_list:item指的是value
value,index in book_list:value和index值和key
-数组
-数字
-字符串
# v-for控制购物车商品展示
# key值的解释:加快虚拟dom的替换
# 数组的检测与更新
# 数据双向绑定 input v-model绑定
-只要input的value属性发生变化,绑定的js变量也变化
# 事件处理
# 过滤案例:input的事件
-input:只要input发生变化,就会触发
-change:只要value值变化,就会触发
-blur:只要失去焦点,就会触发
# 事件修饰符:stop(阻止事件冒泡,加在子组件上),
-self阻止事件冒泡,加在父组件上),
-prevent(阻止a标签跳转),
-once(只点击依次)
# 按键修饰符
-@keyup=函数
-只要键按下弹起,就会触发
-@keyup.enter=函数 :只要enter键,弹起,就会触发
1 表单控制之checkbox,单选,多选
<meta charset="UTF-8">
<title>Title</title>
<script src="./js/vue.js"></script>
<div class="app">
<form>
<p>用户名:<input type="text" v-model="username"></p>
<p>密码:<input type="password" v-model="password"></p>
<input type="radio" v-model="radio" value="1">男
<input type="radio" v-model="radio" value="2">女
<input type="radio" v-model="radio" value="0">保密
<p><input type="checkbox" v-model="remember">记住密码</p>
<h2>选择爱好(多选)</h2>
<p><input type="checkbox" v-model="checkMany" value="1">足球</p>
<p><input type="checkbox" v-model="checkMany" value="2">篮球</p>
<p><input type="checkbox" v-model="checkMany" value="3">乒乓球</p>
<br><br>您选择的性别:{{radio}}
<br><br>您选择的爱好是:{{checkMany}}
</form>
</div>
<script>
var vm = new Vue({
el: '.app',
data: {
username: '',
password: '',
// 如果是checkbox,选择是true,不选中是false
remember: false,
// 如果是radio,多个radio框要绑定同一个变量,radio的值是选择的value值
radio:'',
// 如果是多选,绑定的变量是数组,数组内容是value的值
checkMany:[]
}
})
</script>
2 购物车案例(普通)
<meta charset="UTF-8">
<title>Title</title>
<script src="./js/vue.js"></script>
<div class="app">
<table border="1">
<tbody><tr>
<td>商品名称</td>
<td>商品价格</td>
<td>商品数量</td>
<td>选中/不选中</td>
</tr>
<tr v-for="item in good_list">
<td>{{item.name}}</td>
<td>{{item.price}}</td>
<td>{{item.count}}</td>
<td><input type="checkbox" v-model="checkGroup" :value="item"></td>
</tr>
</tbody></table>
<h2>您选中的商品有:{{checkGroup}}</h2>
<h2>总价格为(由于数据的双向绑定,只要变量变了,页面也会变):{{getPrice()}}</h2>
</div>
<script>
var vm = new Vue({
el: '.app',
data: {
good_list: [
{name: '特斯拉', price: 102304, count: 2},
{name: '钢笔', price: 6, count: 3},
{name: '鸡蛋', price: 2, count: 5},
{name: '鞋子', price: 299, count: 7},
{name: '衬衣', price: 189, count: 4},
],
checkGroup: []
},
methods: {
getPrice() {
// 计算选中的商品总价格
let totalPrice = 0
// 1 js老循环方式(按索引循环)
// for (i = 0; i < this.checkGroup.length; i++) {
// totalPrice += this.checkGroup[i].price * this.checkGroup[i].count
// }
//2 js的按迭代循环 【i是数组的索引值】
for (i in this.checkGroup) {
// console.log(i)
totalPrice += this.checkGroup[i].price * this.checkGroup[i].count
}
return totalPrice
}
}
})
</script>
3 购物车案例(全选,全不选)
<meta charset="UTF-8">
<title>Title</title>
<script src="./js/vue.js"></script>
<div class="app">
<table border="1">
<tbody><tr>
<td>商品名称</td>
<td>商品价格</td>
<td>商品数量</td>
<td>选中/不选中 <input type="checkbox" v-model="checkAll" @change="handelCheckALL"></td>
</tr>
<tr v-for="item in good_list">
<td>{{item.name}}</td>
<td>{{item.price}}</td>
<td>{{item.count}}</td>
<td><input type="checkbox" v-model="checkGroup" :value="item" @change="checkOne"></td>
</tr>
</tbody></table>
<h2>您选中的商品有:{{checkGroup}}</h2>
<h2>总价格为(由于数据的双向绑定,只要变量变了,页面也会变):{{getPrice()}}</h2>
<!-- <h3>{{checkAll}}</h3>-->
</div>
<script>
var vm = new Vue({
el: '.app',
data: {
good_list: [
{name: '特斯拉', price: 102304, count: 2},
{name: '钢笔', price: 6, count: 3},
{name: '鸡蛋', price: 2, count: 5},
{name: '鞋子', price: 299, count: 7},
{name: '衬衣', price: 189, count: 4},
],
checkGroup: [],
checkAll:false
},
methods: {
getPrice() {
// 计算选中的商品总价格
let totalPrice = 0
// 1 js老循环方式(按索引循环)
// for (i = 0; i < this.checkGroup.length; i++) {
// totalPrice += this.checkGroup[i].price * this.checkGroup[i].count
// }
//2 js的按迭代循环 【i是数组的索引值】
for (i in this.checkGroup) {
// console.log(i)
totalPrice += this.checkGroup[i].price * this.checkGroup[i].count
}
return totalPrice
},
handelCheckALL(){
//一个是全选了,一个是全不选
if(this.checkAll){
this.checkGroup=this.good_list
}else {
this.checkGroup=[]
}
},
checkOne(){
if(this.checkGroup.length==this.good_list.length){
//全选
this.checkAll=true
}else {
this.checkAll=false
}
}
}
})
</script>
4 购物车案例(数量加减)
<meta charset="UTF-8">
<title>Title</title>
<script src="./js/vue.js"></script>
<div class="app">
<table border="1">
<tbody><tr>
<td>商品名称</td>
<td>商品价格</td>
<td>商品数量</td>
<td>选中/不选中 <input type="checkbox" v-model="checkAll" @change="handelCheckALL"></td>
</tr>
<tr v-for="item in good_list">
<td>{{item.name}}</td>
<td>{{item.price}}</td>
<td><button @click="handleDown(item)">-</button>{{item.count}} <button @click="item.count++">+</button></td>
<td><input type="checkbox" v-model="checkGroup" :value="item" @change="checkOne"></td>
</tr>
</tbody></table>
<h2>您选中的商品有:{{checkGroup}}</h2>
<h2>总价格为(由于数据的双向绑定,只要变量变了,页面也会变):{{getPrice()}}</h2>
<!-- <h3>{{checkAll}}</h3>-->
</div>
<script>
var vm = new Vue({
el: '.app',
data: {
good_list: [
{name: '特斯拉', price: 102304, count: 2},
{name: '钢笔', price: 6, count: 3},
{name: '鸡蛋', price: 2, count: 5},
{name: '鞋子', price: 299, count: 7},
{name: '衬衣', price: 189, count: 4},
],
checkGroup: [],
checkAll:false
},
methods: {
getPrice() {
// 计算选中的商品总价格
let totalPrice = 0
// 1 js老循环方式(按索引循环)
// for (i = 0; i < this.checkGroup.length; i++) {
// totalPrice += this.checkGroup[i].price * this.checkGroup[i].count
// }
//2 js的按迭代循环 【i是数组的索引值】
for (i in this.checkGroup) {
// console.log(i)
totalPrice += this.checkGroup[i].price * this.checkGroup[i].count
}
return totalPrice
},
handelCheckALL(){
//一个是全选了,一个是全不选
if(this.checkAll){
this.checkGroup=this.good_list
}else {
this.checkGroup=[]
}
},
checkOne(){
if(this.checkGroup.length==this.good_list.length){
//全选
this.checkAll=true
}else {
this.checkAll=false
}
},
handleDown(item){
if(item.count>1){
item.count--
}else {
alert('太少了,我受不了了')
}
}
}
})
</script>
5 v-model进阶
lazy:懒对应
number:只要以数字开头,就只保留数字
trim:截掉前后的空格
<meta charset="UTF-8">
<title>Title</title>
<script src="./js/vue.js"></script>
<div class="app">
<!-- <input type="text" v-model.lazy="name">-->
<!-- <hr>-->
<!-- {{name}}-->
<!-- <input type="text" v-model.number="age"> 必须以数字开头-->
<!-- <hr>-->
<!-- {{age}}-->
<input type="text" v-model.trim="name">
<hr>
{{name}}
</div>
<script>
var vm = new Vue({
el: '.app',
data: {
name: '',
age: ''
},
})
</script>
6 生命周期钩子
6.1 延迟和定时任务
<meta charset="UTF-8">
<title>Title</title>
<script>
// 延迟执行
// 3s后弹出lqz
// setTimeout(function () {
// alert('lqz')
// },3000)
// 使用箭头函数
// setTimeout(() => {
// alert('lqz')
// }, 3000)
// setInterval,每隔多长时间干什么事
// 应用挺多:由于http协议,不能服务端主动向客户端推送消息
// 服务端向客户端推送消息:轮询,长轮询,websocket
setInterval(function () {
console.log('lqz')
},3000)
</script>
# 8个
-created
-mounted
-updated
<meta charset="UTF-8">
<title>生命周期</title>
<script src="./js/vue.js"></script>
<div id="box">
<child v-if="isShow"></child>
<hr>
<button @click="terminate">删除子组件</button>
<button @click="reborn">显示子组件</button>
</div>
<script>
// 子组件 child 定义的组件,相当于一个标签,但是他有自己的模板和样式,事件
Vue.component('child', {
template: `
<div>
<button @click="handleClick">点我,name更新</button>
<br>
{{name}}
</div>
`,
data() {
return {
name: 'lqz',
t:''
}
},
methods:{
handleClick(){
this.name='彭于晏'
}
},
beforeCreate() {
console.group('当前状态:beforeCreate')
console.log('当前el状态:', this.$el)
console.log('当前data状态:', this.$data)
console.log('当前name状态:', this.name)
},
created() {
console.group('当前状态:created')
console.log('当前el状态:', this.$el)
console.log('当前data状态:', this.$data)
console.log('当前name状态:', this.name)
},
beforeMount() {
console.group('当前状态:beforeMount')
console.log('当前el状态:', this.$el)
console.log('当前data状态:', this.$data)
console.log('当前name状态:', this.name)
},
mounted() {
console.group('当前状态:mounted')
console.log('当前el状态:', this.$el)
console.log('当前data状态:', this.$data)
console.log('当前name状态:', this.name)
//用的最多,向后端加载数据,创建定时器等
console.log("页面已被vue实例渲染, data, methods已更新");
console.log('mounted')
// 定时器,每隔3s钟,打印daada
this.t = setInterval(function () {
console.log('daada')
}, 3000)
},
beforeUpdate() {
console.group('当前状态:beforeUpdate')
console.log('当前el状态:', this.$el)
console.log('当前data状态:', this.$data)
console.log('当前name状态:', this.name)
},
updated() {
console.group('当前状态:updated')
console.log('当前el状态:', this.$el)
console.log('当前data状态:', this.$data)
console.log('当前name状态:', this.name)
},
beforeDestroy() {
console.group('当前状态:beforeDestroy')
console.log('当前el状态:', this.$el)
console.log('当前data状态:', this.$data)
console.log('当前name状态:', this.name)
},
destroyed() {
console.group('当前状态:destroyed')
console.log('当前el状态:', this.$el)
console.log('当前data状态:', this.$data)
console.log('当前name状态:', this.name)
//组件销毁,清理定时器
clearInterval(this.t)
this.t = null
console.log('destoryed')
},
})
let vm = new Vue({
el: '#box',
data: {
isShow: true
},
methods: {
terminate() {
this.isShow = false
},
reborn() {
this.isShow = true
}
},
})
</script>
7 跟后端交互
<meta charset="UTF-8">
<title>Title</title>
<script src="./js/vue.js"></script>
<!-- <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>-->
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<div class="app">
<!-- <h1>我的名字是:{{name}}</h1>-->
<!-- <h1>我的年龄是:{{age}}</h1>-->
<div v-for="data in data_list">
<h1>电影名为:{{data.name}}</h1>
<h2>导演:{{data.director}}</h2>
<img :src="data.poster" alt="">
</div>
</div>
<script>
var vm = new Vue({
el: '.app',
data: {
name: '',
age: '',
data_list:[]
},
// created() {
// // 发送ajax请求,正常来讲,需要使用js向后端发送请求
// // 原生js写的ajax,非常麻烦,还要处理浏览器兼容
// // 于是 jquery,封装了一个ajax函数,方便咱们使用
// //CORS:面试重点,跨域问题
// $.ajax({
// url: 'http://127.0.0.1:5000/',
// type: 'get',
// success: data=> {
// console.log(data)
// this.name=data.name
// this.age=data.age
// }
// })
// }
// created() {
// // fetch:新的ajax,原生js支持的
// fetch('http://127.0.0.1:5000/').then(res => res.json()).then(res=>{
// // console.log(res)
// this.name=res.name
// this.age=res.age
// })
// }
created(){
// axios:第三方
axios.get('http://127.0.0.1:5000/').then(res=>{
console.log(res.data) //需要从res.data中取出后台给的数据
this.data_list=res.data.data.films
})
}
})
</script>