目录
1.打包工具:webPack,Gulp
vue.js react.js angular.js合称前端三大主流框架。
vue注重于构建用户界面的框架,只关注视图层(MVC-V这层),可以和第三方库兼容。
框架好处:开发效率高、
原生JS(兼容性低)-》(jQuery 解决兼容性,开发模式写法较复杂)-》(前端模板引擎(生成DOM,不再渲染页面。解决写法复杂))=》(angular.js/vue.js(减少不必要的DOM操作,提高渲染效率,双向绑定))
框架和库的区别:
框架:完整的解决方案,对项目侵入性大。重选就需重构;但是功能性大。
库:某一个功能,侵入性小;容易切换。
MVVC:前端视图层的开发思想,M、V、VM(VM是调度者,分割V/M。)
M(每个页面中单独的数据)和V(html结构)
app.js(入口,请求由此入但没有路由分发功能)->router.js(只负责路由分发,不处理逻辑)->controller(只负责业务处理,不涉及crud)->model (只负责sql操作)
1、vue起步
引包、
2.创建一个新的实例
new Vue();
vue中存属性
1.el属性=element
2.data:数据
插值表达式实现数据绑定{{数据}}或通过指令v-。
补充两个插值表达式{{2>1?true:false}} 可插入表达式、{{txt.split(").reverse().join('')}}可插入运算 反转单词。也能插入方法,基本什么都能插。
在实例化的时候,直接将属性里的值暴露出来了,所以可以直接用属性,也可以通过$data.属性点出来。
例:基础的v-html v-text
3.指令
3.1、v-if 和v-show
条件渲染
v-if和v-show区别:v-if是移除dom元素相当于remove;v-show是改变style,显示变成隐藏了。
v-show始终有初始化的渲染,对性能消耗少,不会一直销毁和重建。
v-if不会有初始化渲染,但是一直操作的是dom。
频繁性比较多的用v-show较好。
3.2、v-bind属性绑定
对哪个属性进行绑定就在那个属性前面加v-bind
例:v-bind:title 就把实例的title放在了元素标签里。可简写为冒号
3.3 v-on事件绑定
v-on:click="事件名",事件在vue实例里声明
声明事件通过 methods:{方法}
经典案例之当点击切换的时候,这个div的颜色动态变化。
<div id="app">
<div class="box" :class="{active:isActive}" >hi</div>
<button @click="changeClick">切换</button>
</div>
<script type="text/javascript">
var vue=new Vue({
el:'#app',
data:{
isActive:false,
},
methods:{
changeClick(){
this.isActive=!this.isActive
}
}
})
</script>
<style>
.box{
width: 200px;
height: 200px;
background-color: red;
}
.active{
background-color: green;
}
</style>
3.4 vue的事件修饰符
<!-- 阻止单击事件继续传播 --> <a v-on:click.stop="doThis"></a>
<!-- 提交事件不再重载页面 --> <form v-on:submit.prevent="onSubmit"></form>
<!-- 修饰符可以串联 --> <a v-on:click.stop.prevent="doThat"></a>
<!-- 只有修饰符 --> <form v-on:submit.prevent></form>
<!-- 添加事件监听器时使用事件捕获模式 --> <!-- 即内部元素触发的事件先在此处理,然后才交由内部元素进行处理 --> <div v-on:click.capture="doThis">...</div>
<!-- 只当在 event.target 是当前元素自身时触发处理函数 --> <!-- 即事件不是从内部元素触发的 --> <div v-on:click.self="doThat">...</div>
可以直接看官网的事件修饰符,蛮简单的这一块。
事件监听的好处:
1.代码易读、易定位。
2.无需再自己写自己写逻辑处理,直接交给vue处理。和DOM完全解耦,可测性高。
3.自动销毁机制。
3.5 vue的v-for列表渲染
v-for='index,循环取数 in 数组' 不建议在v-for里使用index作为key。因为vue发现key相同的话就不会再更新DOM了。
例:循环数组
<div id="app">
<ul>
<li class="li" v-for=' (item,index) in listMenu'>
{{item.name}}
{{index}}
</li>
</ul>
</div>
var vue=new Vue({
el:'#app',
data:{
listMenu:[
{id:1,name:"列表1"},
{id:2,name:"列表2"},
]
},
})
遍历对象:
<div id="app">
<ul>
<li v-for='(val,key) in obj'>
{{key+val}}
</li>
</ul>
</div>
var vue=new Vue({
el:'#app',
data:{
obj:{
title:"hellod world",
name:"jack"
}
},
})
attention:当使用v-for的时候一定要给每一个这个元素添加一个:key属性 唯一,尽量绑id,因为index可能会出错,理由同上。使用:key的原因是跟踪每一个节点的身份,从而DOM对这个元素再次操作的时候不用再每一条数据都追踪,只用追踪对应的这一条数据。这样会高效。
3.6 v-model的双向数据绑定
例:
页面显示如下:
当更改视图里的hello world时,对应着的数据层里的也会更改。当然更改数据层里的数据视图肯定会跟着改变。
4.侦听器watch的使用
4.1普通监视:
watch:{
'msg':function(newV,oldV) {
console.log(oldV,newV);
}
}
key:msg是data的属性名,value是监视后的行为。newV:新值、oldV:旧值。
4.2深度监视:Object/Array
当数据为复杂数据类型时就可以使用到深度监视
例:
<div id="app">
<button @click='checkedNames[0].name="Tom"'>Tom</button>
</div>
var vue=new Vue({
el:'#app',
data:{
msg:"",
checked:false,
checkedNames:[{id:1,name:"Jack"}],
},
watch:{
"checkedNames":{
deep:'true',
handler:function(newV,oldV) {
console.log(newV[0].name);
}
}
}
})
此时可以监听到数组的变化。
5.计算属性computed
因为用插值表达式对于一些复杂的计算很麻烦,所以这里可以用到简便的computed计算。
computed计算默认只有getter方法。监听计算属性。
例:这样就能实现反转。
<div id="app">
<p>{{reverseMsg}}</p>
</div>
var vue=new Vue({
el:'#app',
data:{
msg:"hello world",
},
computed:{
reverseMsg:function() {
return this.msg.split('').reverse().join('');
}
}
})
最大的优点:能产生缓存,如果数据没有发生变化那就直接从缓存中取。如果数据发生变化就重新计算重新渲染。如果不用计算属性的话,就会重新渲染整个页面,这样性能是不是就更低了。如果页面有大量数据,那是不是性能就更更更低了?
6.计算属性setter方法
简单,不赘述
7 过滤器filter
作用:数据展示更精准。
分为局部和全局的过滤器
局部在每一个实例里使用,不加赘述
全局:
/* 全局,注意 没有s */
Vue.filter('过滤器名字',((对应value值)=>{
这里对value值进行操作
}))