一.vue是什么
vue简单小巧(压缩后大小仅有17kb),渐进式(可以一步一步,有阶段的使用,不必一开始就使用所有东西)的前端框架
提供了开发中常用功能,如:1.解耦视图与数据2.组件复用3.前端路由4.状态管理5.虚拟Dom
开发模式(m v vm):mvvm由mvc繁衍而来,当v(视图)层变化时,会自动更新到vm(视图模型),然后m(模型)层发生变化,反之亦然,v和vm之间通过双向绑定建立联系
二.使用安装vue
1.通过<script>标签直接引入:<script src="https://unpkg.com/vue/dist/vue.js"></script>
2.通过脚手架vue-cli(项目中):
1安装vue
npm install vue
2全局安装vue-cli
vue install --global vue-cli
3创建基于webpack模板的新项目
vue init webpack my-project //my-project :项目名称
4进入项目
cd my-project
5下载依赖包
npm install
6运行项目
npm run dev
或
npm start
7项目打包
npm run build
三.计算属性
computed
当模板中的表达式或者逻辑过长时,项目就会难以维护,比如
<div>
{{text.split(','}.reverse().join(,)}} //split()截取 reverse()取反 join()将数组转换成字符串
<div>
计算属性:
<div id="app">
{{reversetext}}
</div>
<script>
new Vue({
el:'#app',
data:{
text:'cheng,cong,ming'
},
computed:{
reversetext(){
return this.text.split(',').reverse().join(',')
}
}
})
</script>
用法:计算属性可以完成各种复杂的逻辑,包括运算,函数调用,只要最终返回一个结果
每个计算属性中都包含一个getter和一个setter函数,getter用来读取,setter用来修改,绝大多数只用默认的getter很少用setter
计算属性小技巧:1计算属性可以依赖其他计算属性2计算属性不仅可以依赖当前的Vue实例的数据,还可以依赖其他实例的数据
计算属性缓存(与methods区别):你可能发现,调用methods里的方法也可以实现计算属性的逻辑,甚至methods还可以传值,使用起来更灵活,为什么还要使用计算属性呢,原因就是计算属性是基于他的依赖缓存的,一个计算属性所依赖的数据发生变化时,他才会重新获取值,而methods只要重新渲染,他就会被调用,因此函数也会被执行
四.vue内置指令
(1).v-bind(简写也可以叫语法糖为 : )
:主要用于动态更新html元素上的属性
v-bind:class(绑定class,动态切换class)
对象语法:
<body>
<div id="app">
<div v-bind:class="{'cheng':congming}"></div>
</div>
<script>
new Vue({
el:'#app',
data:{
congming:true
}
})
</script>
</body>
给div绑定一个class,名为cheng,这个名为cheng的class依赖于data中数据congming,当congming为ture时,添加上class,渲染结果为:
<div class="cheng"></div>
当congming为false时,class名不显示,渲染结果为:
<div class=""></div>
当然,动态添加class可以存在多个
,如
<div :class="{'cheng'':congming,'congming':cheng}">
注:写法与一个class名相同,true显示,false不显示
当:class的表达式过长或者逻辑复杂时,还可以绑定一个计算属性,或者data,methods
<body>
<div id="app">
<div v-bind:class="cheng"></div>
</div>
<script>
new Vue({
el:'#app',
data:{
cong:true,
ming:null
},
computed:{
cheng(){
return{
acative:this.cong && !this.ming,
'text-fail':this.ming && this.ming.type==='fail'
}
}
}
})
</script>
</body>
渲染结果:
<div class="acative"></div>
数组语法
当需要应用多个class是,可以用数组语法
<body>
<div id="app">
<div v-bind:class="[cheng,cong]"></div>
</div>
<script>
new Vue({
el:'#app',
data:{
cheng:'ming',
cong:'ming'
}
})
</script>
</body>
渲染结果:
<div class="ming ming"></div>
还可以用三元表达式
来根据条件切换
<body>
<div id="app">
<div v-bind:class="[cheng?cong:'']"></div>
</div>
<script>
new Vue({
el:'#app',
data:{
cheng:true,
cong:'ming'
}
})
</script>
</body>
当cheng为true时,渲染结果为:
<div class="ming"></div>
当cheng为false时,渲染结果为:
<div class=""></div>
也可以在数组中使用对象
<div v-bind:class="[{'cheng':cong},ming]"></div>
注:当然,与对象语法一样,数组语法也可以使用data,computed和methods三种方法
v-bind:style(给元素绑定内联样式,与绑定class类似)
<body>
<div id="app">
<div v-bind:style="{'color':cheng,'font-size':cong + 'px'}">程聪明</div>
</div>
<script>
new Vue({
el:'#app',
data:{
cheng:'red',
cong:12
}
})
</script>
</body>
渲染结果:
<div style="color: red; font-size: 12px;">程聪明</div>
大多数情况下,直接写一串样式不便于维护,可以写在data或者computed里
,
<body>
<div id="app">
<div v-bind:style='cheng'>程聪明</div>
</div>
<script>
new Vue({
el:'#app',
data:{
cheng:{
color:'red',
fontSize:12 + 'px'
}
}
})
</script>
</body>
渲染结果
<div style="color: red; font-size: 12px;">程聪明</div>
应用多个样式对象时,可以使用数组语法
<div :style="[cheng,cong,ming]">程聪明</div>
在实际业务中:style的数组语法不常用,因为往往可以写在一个对象里,较为常用的是计算属性
(2)v-cloak
:不需要表达式,会在Vue实例结束编译时从绑定的HTML元素上移除,经常和css中的display:none;配合使用:
<body>
<div id="app" v-cloak>
{{cheng}}
</div>
<script>
new Vue({
el:'#app',
data:{
cheng:'程聪明'
}
})
</script>
<style>
[v-cloak]{
display: none;
}
</style>
</body>
当网速较慢,vue文件还没加载完成时,页面会显示{{cheng}}的字样,直到页面加载完成,所以这个过程屏幕是会闪动的,而v-cloak就是解决页面闪动问题的
,但是一般在大型的项目中,html结构只有一个空的div元素,剩余的内容都是由路由挂载不同组件完成,所以不再需要
(3).v-once
:不需要表达式的指令,作用是定义它的元素或组件值渲染一次,包括元素或组件的所有子节点.首次渲染后,不在随数据的变化重新渲染,将被视为静态内容:
<body>
<div id="app" v-cloak>
<div v-once>{{cheng}}</div>
<div v-once>
<span>{{cheng}}</span>
</div>
</div>
<script>
new Vue({
el:'#app',
data:{
cheng:'程聪明'
}
})
</script>
</body>
(4)v-if.v-else-if.v-else
:条件渲染指令 ,与if.else.else if类似,根据表达式的值渲染Dom
<body>
<div id="app">
<div v-if="cheng === 'cheng'">程</div>
<div v-else-if="cheng === 'cong'">聪</div>
<div v-else="cheng === 'ming'">明</div>
</div>
<script>
new Vue({
el:'#app',
data:{
cheng:'cheng', //可以更改此处的值页面会随之变化
}
})
</script>
</body>
v-else-if需要紧跟v-if,v-else需要紧跟v-else-if,如果一次判断的是多个元素,可以在元素上使用条件指令,最终渲染的结果不会包含该元素,
<body>
<div id="app">
<template v-if="cheng===cheng">
<p>程</p>
<p>聪</p>
<p>明</p>
</template>
</div>
<script>
new Vue({
el:'#app',
data:{
cheng:'cheng',
}
})
</script>
</body>
(5)v-show
:ye v-if用法基本一致,只不过v-show改变元素的css属性display.当表达式值为false时,元素隐藏,为true时元素显示
<body>
<div id="app">
<div v-show="cheng==='congming'">程聪明</div>
</div>
<script>
new Vue({
el:'#app',
data:{
cheng:'congming',
}
})
</script>
</body>
注:v-show不能写在template上
v-show和v-if区别:
v-if时真正的条件渲染,创建dom和删除dom,而v-show只是在元素上添加了css属性;v-if更适合于条件不常改变的场景,v-show适合频繁操作的场景
(6)v-for
:遍历数组或者对象循环显示,表达式需要用in或者if结合使用
遍历数组:
<body>
<div id="app">
<ul>
<li v-for="item in cheng">{{item.name}}</li>
</ul>
</div>
<script>
new Vue({
el:'#app',
data:{
cheng:[
{name:'程'},
{name:'聪'},
{name:'明'}
],
}
})
</script>
</body>
渲染结果:
<div id="app">
<ul>
<li>程</li>
<li>聪</li>
<li>明</li>
</ul>
</div>
v-for可以选参数作为当前的索引:
<body>
<div id="app">
<ul>
<li v-for="(item,index) in cheng">{{index}}-{{item.name}}</li>
</ul>
</div>
<script>
new Vue({
el:'#app',
data:{
cheng:[
{name:'程'},
{name:'聪'},
{name:'明'}
],
}
})
</script>
</body>
渲染结果:
<div id="app">
<ul>
<li>0-程</li>
<li>1-聪</li>
<li>2-明</li>
</ul>
</div>
跟v-if一样,v-for也可以写在template标签上,进行多个元素渲染,也可以进行对象渲染
:
<body>
<div id="app">
<ul>
<li v-for="item in cheng">{{item}}</li>
</ul>
</div>
<script>
new Vue({
el:'#app',
data:{
cheng:{
name:'程',
gender:'男',
age:100
}
}
})
</script>
</body>
渲染结果:
<div id="app">
<ul>
<li>程</li>
<li>男</li>
<li>100</li>
</ul>
</div>
遍历对象时可以有两个参数
<body>
<div id="app">
<ul>
<li v-for="(item,key,index) in cheng">{{index}}-{{key}}-{{item}}</li>
</ul>
</div>
<script>
new Vue({
el:'#app',
data:{
cheng:{
name:'程',
gender:'男',
age:100
}
}
})
</script>
</body>
渲染结果:
<div id="app">
<ul>
<li>0-name-程</li>
<li>1-gender-男</li>
<li>2-age-100</li>
</ul>
</div>
v-for还可以循环整数:
<li v-for="item in 10">{{item}}</li>
渲染结果
1 2 3 4 5 6 7 8 9 10
vue中一些数据变化,v-for也会立即更新.vue中数组变异的方法
:
push() //向数组的末尾添加一个或多个元素,并返回新的长度
pop() //删除并返回数组的最后一个元素
shift() //把数组的第一个元素从其中删除,并返回第一个元素的值
unshift() //向数组的开头添加一个或更多元素,并返回新的长度
splice() //向/从数组中添加/删除项目,然后返回被删除的项目
sort() //对数组的元素进行排序
reverse() //颠倒数组中元素的顺序
filter() //创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素(不会改变原数组)
concat() //连接两个或多个数组(不会改变原数组)
slice() //从已有的数组中返回选定的元素(不改变原数组)
(7).v-on(简写也可以叫语法糖为 @ )
:绑定事件监听器,如v-on:click
<body>
<div id="app">
<button @click="cheng++">+1</button>
<div>{{cheng}}</div>
</div>
<script>
new Vue({
el:'#app',
data:{
cheng:1
}
})
</script>
</body>
监听事件可以写在methods中
<body>
<div id="app">
<button @click="congming">+1</button>
<div>{{cheng}}</div>
</div>
<script>
new Vue({
el:'#app',
data:{
cheng:1
},
methods:{
congming(){
return this.cheng++
}
}
})
</script>
</body>
(8)v-model
:表单数据双向绑定
<body>
<div id="app">
<input type="text" v-model="cheng">
<div>{{cheng}}</div>
</div>
<script>
new Vue({
el:'#app',
data:{
cheng:''
}
})
</script>
</body>
使用v-model后,表单显示的值只能依赖所绑定的数据,不在关心初始化时的value属性
五.组件
全局注册组件
component
Vue.component('cheng',{
//选项
})
实例:
<body>
<div id="app">
<cheng></cheng>
</div>
<script>
Vue.component('cheng',{
template:'<div>程聪明</div>'
})
new Vue({
el:'#app'
})
</script>
</body>
渲染结果:
<div id="app"><div>程聪明</div></div>
template的Dom元素必须被一个元素包含
局部注册组件
componets
<body>
<div id="app">
<cheng></cheng>
</div>
<script>
var cheng = {
template:'<div>程聪明</div>'
}
new Vue({
el:'#app',
components:{
'cheng':cheng
}
})
</script>
</body>
vue模板在某种情况下会受html的限制,比如table中值允许写tr.td.th等表格元素,所以在表格中直接使用组件是无效的
,在这种情况下,可以用is属性来挂载
<body>
<div id="app">
<table>
<tr>
<td is="cheng"></td>
</tr>
</table>
</div>
<script>
var cheng = {
template:'<div>程聪明</div>'
}
new Vue({
el:'#app',
components:{
'cheng':cheng
}
})
</script>
</body>
注:在组件中使用data时,data必须写成函数形式,然后将数据return出去
持续更新…(本资源参考 <<Vue.js实战>>,如有侵权,请联系删除)