安装vue的方法
1. 通过CDN引入
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<!-- 生产环境版本,优化了尺寸和速度 -->
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
2. 下载vue.js文件引用
3. NPM安装
API
实例化vue和基础选项
以下示例都默认引入了对应的vue.js文件
- el:用来挂载的元素,告诉vue实力用来管理那个html元素
- data:该属性通常存储一些数据,可以自定义,可以来自服务器请求的数据
- {{}}:Mustache语法,两个大括号里面写vue里面的一些对象属性和函数返回值,文本插值,也可以以写表达式
vue2版本
```html{{message}}
{{text1and2}}
在某些情况系,可以使用setter方法,以下是computed的完整写法 ```html ``` ### watch 可以监测数据发生的变化,可以监测data,props等
watch里面的方法名必须是你要监听的数据名,可以传入两个参数,第一个参数为变化后的值,第二个参数为变化之前的值。 ```html
你选择的是:{{sex}}
同意 苹果 梨子 西瓜你选择的水果是:{{fruits}}
你选择的abc是:{{abc}}
你选择的abcs是:{{abcs}}
<a name="eVfXK"></a>
#### v-model修饰符
> **lazy**:懒加载,不是实时同步数据,在数据失去焦点或者回车时才更新
> **number**:转换成数字,input里面填写的不管是什么都是按照字符串处理,加上这个就是数字类型。
> **trim**:去掉值两端的空格
```html
<div id="app1">
<!-- 修饰符.lazy -->
<input type="text" v-model.lazy="massage"/>{{massage}}
<!-- 修饰符.number -->
<input type="number" v-model.number="age"/>{{age}}
<!-- 修饰符.trim -->
<input type="text" v-model.trim="massage"/>{{massage}}
</div>
<script>
const app =new Vue({
el:"#app1",
data:{
massage:" 你好",
age:0
}
})
</script>
v-for
循环v-for 指令需要以 site in sites 形式的特殊语法, sites 是源数据数组并且 site 是数组元素迭代的别名。
可以绑定数组渲染一个列表
<div id="app1">
<!-- 遍历数组里面是普通值 -->
<ul>
<li v-for="movie in movies">{{movie}}</li>
</ul>
<!-- 遍历数组里面是对象 -->
<ul>
<li v-for="person in persons">姓名:{{person.name}} 年龄:{{person.age}}</li>
</ul>
<!-- 可以直接迭代对象 -->
<ul>
<li v-for="value in animal">{{value}}</li>
</ul>
<!-- 遍历对象可以提供第二个参数为键名,第三个参数为索引 -->
<!-- 数组的第二参数就是索引,没有第三个参数 -->
<ul>
<li v-for="(movie,index) in movies ">索引:{{index}},电影名:{{movie}}</li>
</ul>
<!-- 还可以直接迭代整数 -->
<ul>
<li v-for="n in 10">{{n}}</li>
</ul>
</div>
<script>
const app =new Vue({
el:"#app1",
data:{
movies:["星际穿越","复仇者联盟4","钢铁侠","流浪地球"],
persons:[
{name:"张三",age:18},
{name:"李四",age:22},
{name:"王五",age:32}
],
animal:{type:"cat",name:"咪咪",age:3,color:"black"}
}
})
</script>
在v-for的循环项中,最好加入key关键字,key值不同,记住这样能提高效率。 假设v-for的源数组为A,B,C,D,E,不加key,如果要在BC之间加入一个F,是这样的。 先把C变成F,D变成C,E变成D,新加一条E。效率很低。 有key的时候,就是把循环项和key先一一对应起来,再把F插进入,F也有key
v-on
v-on用来监听元素的事件,可以缩写用@,值可以是方法名,还可以是js表达式。
方法可以传入参数,实参是字符串要加引号,不加引号视为vue变量名。
无参数时,在{{}}里面要加(),在v-on里面不加括号
如果方法有形参,而调用方法却没有传对应的实参,那么默认传入的参数就是event事件对象 如果又要传入参数,又要传入事件对象,手动写事件对象的实参$event
<div id="app1">
<button v-on:click="add">加号</button>
<button @click="sub">减号</button>
<button @click="add2(10,num1,'这是传入的字符串')">传入3变量</button>
<button @click="sub" @focus="add">监听多个方法</button>
<button @click="add2(10,num1,$event)">多个参数时手动传入event事件对象</button>
</div>
<script>
const app =new Vue({
el:"#app1",
data:{
count:0,
num1:25
},
methods:{ //定义方法
//es5的写法
add:function(){
console.log(this.count);
this.count++;//不加this,就是那的全局变量,加了this就是指当前对象里面的数据
},
//es6的写法
sub(){
console.log(this.count);
this.count--;
},
add2(num1,num2,str){ //带有参数
this.count+=num1+num2;
console.log(this.count);
console.log(str);
}
}
})
</script>
v-on的修饰符
stop:如果不加这个.stop,当点击button时,会触发btnclick方法,然后事件冒泡,触发divclick方法。在button上加了.stop,就能阻止点击button时的事件冒泡了 prevent:有些标签有默认事件,加上prevent修饰符,就是阻止默认事件 键别名/键代码:键上每个键都有对应的代码别名之类的,把这个作为修饰符,限定了当按下这个键后才能触发事件 once:事件只触发一次
<div id="app1">
<div @click="divclick">
<!-- 停止冒泡事件 -->
<button @click.stop="btnclick">按钮</button>
<!-- 键别名 -->
<button @keyup.enter="v_keyup">按钮2</button>
<!-- 键代码 -->
<button @keyup.32="v_keyup">按钮3</button>
<!-- 只回调一次 -->
<button @click.once="btnclick">按钮</button>
</div>
</div>
<script>
const app =new Vue({
el:"#app1",
data:{
},
methods:{
divclick(){
console.log("点击了div");
},
btnclick(){
console.log("点击了button");
},
v_keyup(){
console.log("监听了键盘按下enter键或者代码为32的键并抬起来时的事件");
}
}
})
</script>
v-bind
一般给属性双向绑定值,要绑定什么属性就什么属性前面加上v-bind:
<style>
.red{
color:red;
}
.green{
color:green;
}
.big{
font-size: 18px;
}
</style>
<div id="app1">
<!-- 绑定到属性 -->
<img v-bind:src="img" />
<!-- 缩写 -->
<img :src="img"/>
<!-- 拼接绑定,字符串记得加引号 -->
<img :src="'https://img3.doubanio.com/view/photo/s_ratio_poster/public/'+imgid">
<!-- 绑定类,可以绑定一个对象,key是类名,value是bool值。类名在data里面可以不写,也可以不加引号。
哪个类为true,就用哪个类,如果多个true,用最后一个,覆盖。
同时可以用到普通的class,会合并在一起 -->
<h2 :class="{red:isred,green:isgreen}" class="big">对象绑定class</h2>
<!-- 还可以是数组,加了引号就是普通字符串 -->
<h2 :class="['green',vue_red]" class="big">数组绑定class</h2>
<!-- 绑定style,绑定一个对象,key是css的属性名,value是css属性值 -->
<!-- 如fontSize和font-size两种写法,驼峰直接写,短横线要加引号 -->
<h2 :style="{fontSize:'50px',color:vue_red}">对象绑定style</h2>
<!-- 绑定style,数组。数组里面就是一个一个对象,对象key是css属性名,value是css属性值-->
<h2 :style="[vue_color,vue_font_size]">数组绑定style</h2>
</div>
<script>
const app =new Vue({
el:"#app1",
data:{
img:"https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2639035790.jpg",
imgid:"p2639035790.jpg",
isred:true,
isgreen:false,
vue_red:"red",
vue_color:{color:"pink"},
vue_font_size:{'font-size':"50px"}
}
})
</script>
v-once
用v-once限定的标签,数据只渲染第一次,之后更新数据,都不会跟着更新
<div id="app1">
<p>{{massage}}</p>
<p v-once>{{massage}}</p>
</div>
<script>
const app =new Vue({
el:"#app1",
data:{
massage:"这是一段文字"
}
})
</script>
v-html
把html代码的字符串渲染到html页面里面,不太安全,慎用
<div id="app1">
<div v-html="title"></div>
</div>
<script>
const app =new Vue({
el:"#app1",
data:{
title:"<h1>这是标题</h1>"
}
})
</script>
v-text
和Mustache语法一致,不过v-text更新当前标签下全部文本,{{}}可以拼接更新部分
<div id="app1">
<p v-text="title"></p>
</div>
<script>
const app =new Vue({
el:"#app1",
data:{
title:"这是标题"
}
})
</script>
v-pre
加了v-pre就会跳过这个标签下的编译,原封不动的显示里面的内容。相当于转义。
<div id="app1">
<p>{{title}}</p>
<p v-pre>{{title}}</p>
</div>
<script>
const app =new Vue({
el:"#app1",
data:{
title:"这是标题"
}
})
</script>
v-cloak
当页面先渲染出来html页面,还没有加载到相应的js代码时。就会在页面上出现原封不动的Mustache标签,会让用户看到你写的什么变量。加上v-cloak,就把这个指令当成标签的属性,一旦vue对这个标签进行解析过后,就会删除这个属性。可以把这个属性设置为隐藏,当没有加载到渲染值时,这个标签就处于隐藏状态,一旦加载出来,就删掉隐藏的属性,标签和渲染后的值就出现了
<style>
[v-cloak]{
display: none;
}
</style>
<div id="app1">
<p v-cloak>{{title}}</p>
</div>
<script>
//等待3秒才实例化vue
setTimeout(function(){
const app =new Vue({
el:"#app1",
data:{
title:"这是标题"
}
})
},3000)
</script>
v-if&v-else&v-else-if
条件判断要不要渲染这个标签,值一般是bool类型
<div id="app1">
<!-- 这里isif为false,所以这个div标签根本不会渲染出来 -->
<div v-if="isif">{{massage}}</div>
<div v-else>isif为false时显示我</div>
<!-- else-if的使用 -->
<div v-if="score>=90">优秀</div>
<div v-else-if="score>=80">良好</div>
<div v-else>不咋滴</div>
</div>
<script>
const app =new Vue({
el:"#app1",
data:{
massage:"你好",
isif:false,
score:88
},
methods:{
}
})
</script>
v-show
也是决定要不要显示元素。不过和v-if的区别是,v-if为false时,根本不渲染dom。v-show要渲染dom,不过display为none。
需要在显示隐藏切换频率比较高时,用v-show
<div id="app1">
<h2 v-show="isshow">这是一段标题</h2>
</div>
<script>
const app =new Vue({
el:"#app1",
data:{
massage:"你好",
isshow:false,
},
methods:{
}
})
</script>
key
如果不写key,
当下面两个input,随时切换,场上只留一个。如果在id为name的input里面输入了字符串,isif改变了,nam消失,email显示,这时候明明在name里面输入的字符串,跑到了email里面。
这是vue里面的虚拟dom,只会生成一个input,其他的都是复用而已,就是把type,id,class等都换了,input只有一个,值也就是那个值,所以isif换来换去的,都是一个input不断的改变属性,一个input,就一个值。
加上key,给input取不通的键名,键名不一样就不能复用。
<input type="text" id="name" v-if="isif" key="a">
<input type="email" id="email" v-else key="b">
生命周期
大概意思就是一个事物从诞生到消亡的整个过程
vue里面的生命周期,从vue实例的诞生开始,再执行到某一步骤操作时,会有一个回调函数,执行这个回调函数,告诉你,现在执行到哪一步了。下面图片中,红圈的就是生命周期的回调函数
<script>
const app =new Vue({
el:"#app1",
data:{
},
created(){ //es6的写法
console.log("进入到created这个阶段了");
},
methods:{
}
})
</script>