文章目录
一、基本语法
1.1 基本概念
- el: 对应标签中的id属性
希望被vue渲染的一部分指定对应的ID,不希望被渲染的不指定其ID- data:对应标签中的对应变量
- methods:对应标签中的方法
{{}}中可以是变量,基本类型,表达式,方法,方法是{{method()}}这种形式,字符串类型是{{‘str’}}。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
<script src="vue.js"></script>
</head>
<body>
<div id="name">
<h1>{{haha}}</h1>
<h1>{{10+32}}</h1>
<h1>{{'张三'}}</h1>
<h1>{{getSth()}}</h1>
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#name',
data:{
haha: "jack love rose",
},
methods:{
getSth: function(){
return "i like java";
}
}
})
</script>
</body>
</html>
1.2 测试
可以在控制台获取vm变量,同时也可以对里面的变量进行赋值。
1.3 指令
- v-html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
<script src="vue.js"></script>
</head>
<body>
<div id="name">
<div v-html="sort"></div>
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#name',
data:{
sort: "<b>11111<b>"
},
})
</script>
</body>
- v-show
动态显示与隐藏,其实是display属性
<body>
<div id="name">
<div v-show="sort">显示了</div>
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#name',
data:{
sort: true
},
})
</script>
</body>
- v-if
动态的创建与删除
<body>
<div id="name">
<div v-if="sort">动态的创建与删除</div>
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#name',
data:{
sort: true
},
})
</script>
</body>
1.4 动态绑定class
- 动态绑定class对象写法
<body>
<div id="start">
<div :class="obj">动态绑定class对象</div>
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#start',
data:{
obj:{
a: true,
b: false
}
},
})
</script>
</body>
* 动态绑定class数组写法
可以使用pop和push方法往class中添加属性
<body>
<div id="start">
<div :class="obj">动态绑定classs数组写法</div>
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#start',
data:{
obj:["a","b"]
},
})
</script>
</body>
1.5 动态绑定style
- 动态绑定style对象写法
<body>
<div id="start">
<div :style="obj">动态绑定classs数组写法</div>
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#start',
data:{
obj:{
color: "red"
}
},
})
</script>
</body>
- 动态绑定style数组写法
可以往里面添加属性
<body>
<div id="start">
<div :style="obj">动态绑定classs数组写法</div>
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#start',
data:{
obj:[{color:"yellow"}]
},
})
</script>
</body>
- 控制台中改变属性
vm.obj.push({fontSize:"60px"})
vm.obj.push({color:"black"})
1.6 条件渲染
- 代码
<body>
<div id="start">
<button @click="handleClick()">购物</button>
<ul v-if="order.length != 0">
<li v-for="list in order">
{{list}}
</li>
</ul>
<div v-else>你的购物车是空的</div>
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#start',
data:{
order:[]
},
methods: {
handleClick(){
this.order = ["111","222","333"];
}
}
})
</script>
</body>
- 效果
1.7 列表渲染
- 对数组的便利
- 对对象的便利
<body>
<div id="start">
<ul>
<li v-for="(item,index) in order">
{{item}}"----"{{index}}
</li>
</ul>
<ul>
<li v-for="(item,key) in student">
{{item}}"---"{{key}}
</li>
</ul>
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#start',
data:{
order:["111","222","333"],
student:{
name:"张三",
age:12,
address:"西安"
}
},
})
</script>
</body>
- 可以在便利的时候设置对应的key值
一般key是设置为data.id,便于前端渲染时减少对比两次数据的次数。
<li v-for="(item,index) in order" key="item">
1.8 增添新的属性
- Vue.set()方法
1.9 对数组的操作
- 会改变原数组
pop(),push(),sort(),reverse(),splice(),shift(),unshift() - 不会改变原数组
filter(),map(),concat(),slice() - 通过索引操作数组
会改变数组,但是视图不会被渲染
1.10 数组索引解决方法
- splice(0,1,555)
- vue的set方法
1.11 给对象添加属性
二、基本语法
2.1 数据的简单过滤
- v-model数据的双向绑定
- @input value值改变就出发对应的事件
<body>
<div id="start">
<input v-model="name" @input="handlerInput()">
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#start',
data:{
name: ""
},
methods: {
handlerInput(){
console.log(this.name);
}
}
})
</script>
</body>
- filter()方法
<body>
<div id="start">
<input v-model="name" @input="handlerInput()">
<ul>
<li v-for="(item,index) in list">
{{item}}
</li>
</ul>
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#start',
data:{
name: "",
list:["aaa","aab","acc","ddd","eee"],
oldlist:["aaa","aab","acc","ddd","eee"],
},
methods: {
handlerInput(){
console.log(this.name);
var list2 = this.oldlist.filter(item=>item.indexOf(this.name) > -1)
this.list = list2;
}
}
})
</script>
</body>
filter()方法对原数组不产生影响。
2.2 事件处理
<body>
<div id="start">
<button @click="handleClick">click</button>
<div v-show="start">隐藏还是显示</div>
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#start',
data:{
start: false
},
methods: {
handleClick(){
this.start = !this.start;
}
}
})
</script>
</body>
2.3 事件修饰符
- 冒泡事件
点击一个事件,会触发对应的其他事件,比如点击触发li上的事件,也会触发ul上的事件。
<body>
<div id="start">
<ul @click="click1()">
<li @click="click2()">11111</li>
</ul>
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#start',
data:{
start: false
},
methods: {
click1(){
console.log("click1");
},
click2(){
console.log("click2");
}
}
})
</script>
</body>
- 冒泡事件
此处的stop就可以阻止冒泡事件
<ul @click="click1()">
<li @click.stop="click2()">11111</li>
</ul>
还可以:
self会判断是不是自己本身触发的事件,如果是孩子冒泡上来的,则阻止。
<ul @click.self="click1()">
<li @click="click2()">11111</li>
</ul>
还可以:
<ul @click="click1()">
<li @click.once="click2()">11111</li>
</ul>
- 阻止默认行为
比如阻止a标签的跳转行为
<body>
<div id="start">
<a href="http://www.baidu.com" @click.prevent="click3()">百度</a>
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#start',
data:{
start: false
},
methods: {
click3(){
console.log("跳转了");
}
}
})
</script>
</body>
- once修饰符在父标签修饰符为self时才会触发一次
2.4 按键修饰符
- 回车键触发事件(回车键对应的按键码是13)
@keyup.enter
<body>
<div id="start">
<input @keyup.enter="enter()">
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#start',
data:{
start: false
},
methods: {
enter(){
console.log("触发回车事件");
}
}
})
</script>
</body>
- @keyUp.1 = “…”
点击键值是1的键触发事件
2.5 表单控件绑定
- 判断打没打勾
只需绑定一个变量判断打没打勾就行
<body>
<div id="start">
<input type="checkbox" v-model="checked">勾了没
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#start',
data:{
checked:false
},
})
</script>
</body>
- 多选获得多选的结果
value:对应选中框的值
<body>
<div id="start">
<input type="checkbox" v-model="checkedgrp" value="游泳">游泳
<input type="checkbox" v-model="checkedgrp" value="打篮球">打篮球
<input type="checkbox" v-model="checkedgrp" value="打兵乓球">打兵乓球
{{checkedgrp}}
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#start',
data:{
checkedgrp:[]
},
})
</script>
</body>
- 单选
linpue的类型是: redio
<body>
<div id="start">
<P>
<input type="radio" v-model="picked" value="java">java
<input type="radio" v-model="picked" value="php">php
<input type="radio" v-model="picked" value="python">python
{{picked}}
</P>
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#start',
data:{
picked:"",
},
})
</script>
</body>
- 商品订单模拟
<body>
<div id="start">
<li v-for="(item,index) in goods">
<input type="checkbox" :value="item" v-model="goodslist">
{{item.name + " " + item.price + " " + item.count}}
</input>
</li>
<p>商品的总价是:{{getPrice()}}</p>
<p>订单:{{goodslist}}</p>
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#start',
data:{
goods:[{
id:1,
name:"辣椒",
price:10,
count:1
},
{
id:1,
name:"火腿",
price:20,
count:2
},
{
id:1,
name:"西红柿",
price:30,
count:0
},
],
goodslist:[],
},
methods:{
getPrice(){
var sum = 0;
for(var i in this.goodslist){
sum += this.goodslist[i].price * this.goodslist[i].count;
}
return sum;
}
}
})
</script>
</body>
- 全选和全不选
<body>
<div id="start">
<input type="checkbox" v-model="choose" value="{{choose}}" @change="chooseall()">
<li v-for="(item,index) in goods" @change="judjeChooseAll()">
<input type="checkbox" :value="item" v-model="goodslist">
{{item.name + " " + item.price + " " + item.count}}
</input>
</li>
<p>商品的总价是:{{getPrice()}}</p>
<p>订单:{{goodslist}}</p>
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#start',
data:{
choose:false,
goods:[{
id:1,
name:"辣椒",
price:10,
count:1
},
{
id:1,
name:"火腿",
price:20,
count:2
},
{
id:1,
name:"西红柿",
price:30,
count:0
},
],
goodslist:[],
},
methods:{
getPrice(){
var sum = 0;
for(var i in this.goodslist){
sum += this.goodslist[i].price * this.goodslist[i].count;
}
return sum;
},
judjeChooseAll(){
if(this.goods.length === this.goodslist.length){
this.choose = true;
}else{
this.choose = false;
}
},
chooseall(){
if(this.choose === true){
this.goodslist = this.goods;
}else{
this.goodslist = [];
}
}
}
})
</script>
</body>
- 增加减少商品数量
<body>
<div id="start">
<input type="checkbox" v-model="choose" value="{{choose}}" @change="chooseall()">
<li v-for="(item,index) in goods" @change="judjeChooseAll()">
<input type="checkbox" :value="item" v-model="goodslist">
{{item.name + " " + item.price + " " + item.count}}
<button @click="delGoodsCount(item)">del</button>{{item.count}}<button @click="{{item.count++}}">add</button>
</input>
</li>
<p>商品的总价是:{{getPrice()}}</p>
<p>订单:{{goodslist}}</p>
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#start',
data:{
choose:false,
goods:[{
id:1,
name:"辣椒",
price:10,
count:1
},
{
id:1,
name:"火腿",
price:20,
count:2
},
{
id:1,
name:"西红柿",
price:30,
count:0
},
],
goodslist:[],
},
methods:{
getPrice(){
var sum = 0;
for(var i in this.goodslist){
sum += this.goodslist[i].price * this.goodslist[i].count;
}
return sum;
},
judjeChooseAll(){
if(this.goods.length === this.goodslist.length){
this.choose = true;
}else{
this.choose = false;
}
},
chooseall(){
if(this.choose === true){
this.goodslist = this.goods;
}else{
this.goodslist = [];
}
},
delGoodsCount(data){
var number = data.count--;
if(number <= 1){
data.count = 1;
}
}
}
})
</script>
</body>