VUE+webpackjavascript
基本概念:css
为何学习流行框架:html
框架和库的区别:前端
node(后端)中的MVC与前端中的mvvm之间的区别vue
#1.安装vue,引入vue
#2.未来new的vue实列,会控制这个元素的全部内容
<div id="app">
<p>{{msg}}</p>
</div>
#3.建立一个vue的实列,当咱们安装完以后,在浏览器的内存中,就多了一个vue的构造函数(就能够new出来)
<script>
var vm=new Vue({
//表示当前咱们new的这个实列,要控制页面上的哪一个区域
el:'#app',
//控制数据
data:{
msg:'欢迎学习vue'
msg2:'<h1>欢迎学习vue</h1>'
mytitle:'这是一个自定义的属性'
},
//控制事件,定义当前vue实列的全部可用的方法
#在vm实列中想要获取data中的数据,或者调用method中的方法,必须经过 this.数据属性名 或 this.方法名 这里的this就表示咱们new出来的vm实列对象
methods:{
show(){
alert("我是一个事件")
}
},
filters:{},//过滤器
directives:{},//自定义
components:{}//组件
})
</script>
复制代码
1,v-cloak,v-text,v-html的基本使用java
v-cloaknode
#能够解决插值表达式闪烁的问题
<p v-clock>{{msg}}</p>
<style>
[v-clock]{
display:none;
}
</style>
复制代码
v-textreact
#和v-clock做用相同,
<p v-text="msg"></p>
//二者区别
1,插值表达式先后能够听任何内容
2,v-text会替换元素中的本来的内容,插值表达式不会
复制代码
v-htmljquery
#输出时不会带标签
<p v-text="msg2"></p>
复制代码
2,v-bind(绑定属性)webpack
v-bind绑定属性 (只能实现数据单行绑定 从vm---->v)
#后面能够任意拼接,如123
<input type="button" value="按钮" v-bind:title="mytitle+'123'">
#简写形式':'
<input type="button" value="按钮" :title="mytitle+'123'">
复制代码
v-on(绑定事件)
#method找show方法
<input type="button" value="按钮" v-on:click="show'">
#缩写形式“@”
#若是给事件加了小括号就能够传参了
<input type="button" value="按钮" @click="show'">
<input type="button" value="按钮" @click="show()'">
复制代码
v-model(双向数据绑定)
#能够实现“表单”的双向数据绑定,,,只能运用到表单元素中。列select,checkbox,textarea
<input type="button" value="按钮" v-model="msg'">
复制代码
v-for(for循环)
#i是下标值,item和i本身能够任意定义
#:key=“”能够防止出现问题进行数据绑定(key值是数字类型)
//遍历数组
<p v-for="(item,i) in list" :key="item.id">
<input >索引值: {{item}}---下标值:{{i}}
</P>
data:{
list:[1,2,3,4,5]
}
//遍历对象
<p v-for="(value,key,i) in user"></P>
data:{
user:{
id:1,
name:"名字",
gender:'男'
}
}
#注意事项
//还能够遍历一个方法search是一个方法(经过执行for循环,把全部符合搜索关键的数据,保存到类表中)
<p v-for="item in search(keywords)" :key="item.id"></P>
复制代码
v-if和v-show
#至关于删除(性能消耗比较高,元素频繁的切换最好不要使用)
<h3 v-if="flag">v-if控制的元素</h3>
#至关于display:none()
<h3 v-show="flag">v-show控制的元素</h3>
#data中
flag:true
复制代码
padStart(用于时间的补足) 字符串的方法不是字符串的要先.tostring()
#padStart(补充的位数,用什么来补充)-----在前面补充
obj.toSring().padStart(2,'0')
#padEnd(补充的位数,用什么来补充)-----在后面补充
obj.toSring().padStart(2,'0')
复制代码
定时器
var vm=new Vue({
//表示当前咱们new的这个实列,要控制页面上的哪一个区域
el:'#app',
//控制数据
data:{
intervalId:null
},
//控制事件,定义当前vue实列的全部可用的方法
#在vm实列中想要获取data中的数据,或者调用method中的方法,必须经过 this.数据属性名 或 this.方法名 这里的this就表示咱们new出来的vm实列对象
methods:{
action(){
this.intervalId=setInterval(()=>{
if(this.intervalId!=null) return;
执行的代码段...
},500)
}
//清除定时器
stop(){
clearInterval(this.intervalId)
this.intervalId=null
}
}
})
复制代码
class方式:
#方法一直接传递一个数组
<h1 :class="['第二个class类名','第二个class类名']"></h1>
#方法二(三元表达式?:)
#flag没有加单引号,说明他是vm中定义的data中的数据flag:true(flag为true会应用到页面。否之不会)
<h1 :class="['第二个class类名','第二个class类名',flag?'active':'']"></h1>
#方法三(在数组中使用对象的方式,提升代码的可读性)
<h1 :class="['第二个class类名','第二个class类名',{'active':flag}></h1>
#方法四
<h1 :class="{类名:true,类名:true}"></h1>
等价于下面
<h1 :class="classobj"></h1>
var vm=new Vue({
el:'#app',
data:{
classobj:{类名:true,类名:true}
},
复制代码
内联样式:(style)
#font-weight带有“-”因此要用引号引发来(同理能够写成在vm中定义)
<h1 :style="{color:"red","font-weight":"200"}"></h1>
#方法二应用多个
<h1 :style="[styleobj1,styleobj1]"></h1>
复制代码
全局过滤器:过滤器调用时候的格式{{ name | 过滤器名称(“过滤器参数 ”) }}
#定义过滤器的语法
//“|”就是管道符
//第一个参数已经被固定死了,永远都是过滤器,通道符前面传过来的数据
Vue.filter('过滤器的名称',function(msg,过滤器参数){
获取的是一个传过来的数据
})
复制代码
私有过滤器
#在methods下中定义
//filters能够定义多个过滤器 dataFormate就是其中一个过滤器
//过滤器采用就近原则,若是全局和私有重名,就会调用私有的
filters:{
dataFormate:function(){}
}
复制代码
自定义
1.x
#自定义按键修饰符(使用:列/按回车时,绑定事件)
//系统修饰键,按键修饰符有不少能够查文档
@keyup.键盘码或按键修饰符
@keyup.enter="add()"
#自定义全局按键修饰符(下面113是键盘码)
Vue.config.keyCodes.f2=113---------->@keyup.f2="add()"
2.x
复制代码
自定义全局指令(v-bind相似)
#使用Vue.directive()定义全局指令
//参数1:指令的名称,注意在定义的时候前面能够不加v-前缀,但调用时必须加v-
//参数2:是一个对象,是和指令相关的函数
//
Vue.directive('focus',{ ----------->调用时是v-focus
//钩子函数
bind:function(el){ ---------当绑定到元素上时会自动执行此函数 (一次)
//第一个参数永远都是el,这个el就是原生的js对象
//一个元素只有插入DOM中以后,才能获取焦点
#通常只有样式的才会写在这里
el.style.css.color="red"
},
inserted:function(el){
el.focus()
#通常js方法会写在这里
}--------当插入到DOM中时。,执行此函数(执行一次)
updated:function(){} --------当vnode更新时(执行屡次 )
})
复制代码
钩子函数
#自定义指令的时候,如何拿到参数值
<h1 :class="classobj" v-color="'blue'"></h1>
bind:function(el,binding){
//第一个参数永远都是el,这个el就是原生的js对象
//一个元素只有插入DOM中以后,才能获取焦点
#通常只有样式的才会写在这里
el.style.css.color=binding.value
},
#私有的指令
//在method中
directive:{
//和过滤器同理
bind:{
}
}
生命周期
复制代码
生命周期钩子=生命周期函数=生命周期事件
#这是第一步
beforeCreat(){}
//这是遇到的第一个生命周期函数,实列彻底建立出来以前,执行他
//在这个函数建立的时候,data和method尚未被初始化
#这是第二步
created(){}
//这是遇到的第二个生命周期函数,在这个函数中,data和method已经被初始化好了
#这是第三步
// 这里表示vue开始编辑模板
//把vue的代码中的那些命令进行执行,最终在内存中生成一个编译好的最终模板字符串
//而后把这个模板渲染到内存的dom中
//此时只是渲染到内存中,但并无渲染到页面
#这是第四步
beforeMonent(){ }
//这是遇到的第三个生命周期函数,表示模板已经 在内存中渲染完成,但并无渲染页面
//页面中的元素尚未真正被替换过来
#这是第五步
mounted(){}
//这是第四个生命周期函数,已经渲染到页面
//这是生命周期的最后一个函数,没有操做的话,就会在内存中一动不动
复制代码
运行阶段的钩子函数
#第一个
beforeUpdate(){}
//只要界面上有数据更新就会执行这个函数,
//执行此函数时,页面中现实的数据仍是旧的,data中的数据是最新的,页面还没有和最新的保持同步
#第二个
updated(){}
//界面中和data中的数据都是最新的
复制代码
销毁钩子函数
#第一个
beforeDestroy(){}
//此时从运行阶段进入销毁阶段
//实列身上的data,method以及过滤器均可用,尚未执行销毁过程
#第二个
destroy(){}
//组件已经被彻底销毁了,实列身上的data和方法都不可使用了
复制代码
用于数据的请求,还可使用"axios"的第三方包实现数据请求
首先须要安装vue-resource(先有vue),而后导入
#get请求的列子method中定义此方法
//.then返回的数据result中的数据在result.body中
//url是请求的服务器地址
{
this.$http.get(url,option).then(success(result))
}
//emulateJSON:time设置表单提交格式为,普通表单格式
this.$http.post(url,{},{emulateJSON:time}).then
复制代码
//设置全局做用域 #若是咱们经过全局配置了,请求了数据接口根域名,则,每次单独发起http请求的时候,请求的url路径,应该以相对路径开头,前面不能带/,不然不会启用根路径拼接 1.Vue.http.options.root='viruxkjv.com/'(请求的地址相对路径)
//全局启用emulateJSON选项 Vue.http.options.emulateJSON=true;
1. 元素的显示隐藏
```javascript
#不带过分效果的动画
data:{
flag:false
}
<input type="button" value="显示隐藏" @clic="flag=!flag">
<h3 v-if="flag">这是一个须要作动画的元素</h3>
#vue提供的动画
//第一步
//使用transition,把须要被动画的元素控制起来(name是用来控制不一样的transition块)
<transition name="v">
<h3 v-if="flag">这是一个须要作动画的元素</h3>
</transition>
//第二步
自定义两组样式,来控制transition内部元素实现动画
<style>
.v-enter,
.v-leave-to{
opacity:0px
}
.v-enter-active,
.v-leave-active{
transition:all 0.4s ease;
}
复制代码
#方法一
<transition enter-active-class="animated bounceIn" leave-active-class="animated bounceOut">
</transition>
#方法二 设置时间:duration(enter:200,leave:400)
<transition enter-active-class=" bounceIn" leave-active-class="bounceOut" :duration="200">
<h3 v-if="flag" calss="animated">这是一个须要作动画的元素</h3>
</transition>
复制代码
#javaScript钩子
//html中
<transition
@before-enter="beforeEnter"
@enter="enter"
@after-enter="afterEnter">
<div class="" v-show="flag"></div>
</transition>
//注意:动画钩子函数的第一个参数:·el·,表示要执行动画的哪一个DOM元素,是个原生js对象
//能够认为,el,是dodocument.getelementById('')方式获取的原生js对象
methods:{
//动画以前的初始样式,动画未开始
beforeEnter(el){el.style.transform="translate(0,0)"},
//动画开始以后的样子
enter(el,done){
#el.offsetWidth没有实际做用,但若是不写没有过渡效果(只要是和offset相关的均可以)
el.offsetWidth
el.style.transform="translate(150px,150px)"
#元素会当即消失,不会出现等一会的结果
//done()就是afterEnter的引用
done()
},
//动画结束以后
afterEnter(){}
}
复制代码
//在列表过分的时候,若果过分的元素,是经过v-for循环渲染出来的,不能使用transition包裹,须要使用transitionGroup
<style>
.v-enter,
.v-leave-to{
opacity:0px;
transform:translateY(80px);
}
.v-enter-active,
.v-leave-active{
transition:all 0.4s ease;
}
//下面两个属性配合使用,会让列表渐渐消失的结果
.v-move{
transition:all 0.6s ease
}
.v-leave-active{
position:absolute;
}
</style>
#appear,tag为设置渲染出来是什么元素,不设置为默认的span
//html,加入appear属性能够实现页面初始出现的动画效果
<transitionGroup appear tag="ul">
<li v-for="item:list" :key="item.id"
</li>
</transitionGroup>
复制代码
什么是组件?组件的出现是为了拆分vue实列的代码量的,可以让咱们以不一样的组件,来划分不一样的功能,须要什么组件直接去调用就行
组件的建立方式1
//html中
<my-com1></my-com1>
//js中
#1.1
var com1=Vue.extend({
//经过template属性,指定组件要展示的HTML结构
template:'<h3>这是veu.extend建立出来的</h3>'
})
#1.2
//Vue.component('组件名',建立出来的组件模板对象),组件名在定义时用的驼峰命名,到HTML中须要使用’-‘,列my-con1,若是没有用驼峰,那么直接是mycon1
Vue.component('myCon1',com1)----------<my-com1></my-com1>
Vue.component('mycon1',com1)----------<mycom1></mycom1>
||
||
Vue.component('myCon1',Vue.extend({
template:'<h3>这是veu.extend建立出来的</h3>'
}))
复制代码
组件的建立方式2
注意:不管是哪一种方式建立出来的组件,组建的template属性,只能有一个根元素包裹,如div
//html
<mycom2></mycom2>
//js
Vue.component('mycon2',{
template:'<h3>这是veu.component建立出来的</h3>'
)
复制代码
组建的建立方式3
//html中
<template id="temp1">
<div>//这是包裹
<h1>
这是经过template元素,这个方式,代码只能提示和高亮
</h1>
</div>
</div>
//js中
Vue.component('mycon3',{
template:'#temp1'
)
复制代码
//html
<login></login>
//js----下方也可利用建立方式3抽离出去
components:{
login:{
template:'<h3>这是私有组件</h3>'
}
}
复制代码
<script>
//组件
Vue.component('mycom1',{
tempalte:'<h3>这是全局组件{{msg}}</h3>',
data:function(){
return {
msg:'这是组件本身的数据'
}
}
methods:{}
})
//建立vue实列,获得viewMoodel
var vm=new vue({
el:'#app',
data:{},
methods:{}
})
</script>
复制代码
#方法1(缺点只能是两个切换)
<div class="app">
<a href='' @click.prevent="flage=true">登陆</a>
<a href="" @click.prevent="flage=true">注册</a>
<login v-if="flag"></login>
<register v-else="flag"></register>
</div>
#方法2(vue提供)
<a href='' @click.prevent="conName=‘login'">登陆</a>
<a href="" @click.prevent="conName=‘register'">注册</
//component是一个占位符。:is属性,能够用来指定要显示的组件名称
<component :is="'conName'"></component>
复制代码
js中
Vue.component('login',{
template:"登陆组件"
})
Vue.component('register',{
template:"登陆组件"
})
//建立vue实列,获得viewMoodel
var vm=new vue({
el:'#app',
data:{
conName:''//当前component中:is绑定的组件名称
flag:true
},
methods:{}
})
复制代码
<div id="app">
<com1 v-bind:parentmsg="msg"></com1>
</div>
复制代码
//建立vue实列,获得viewMoodel
var vm=new vue({
el:'#app',
data:{
msg:'我是父组件'
},
methods:{},
components:{
com1:{
//子组件中的data数据,是子组件本身全部,经过ajax,请求回来的数据,均可以放在这里(可读可写)
data(){
return{}
},
template:"我是子组件{{parentmsg}}",
props:['parentmsg'],
//把父组件传递过来的parentmsg属性,先在props数组中,定义一下,才能使用这个数据
//注意:组件中的全部props中的数据,都是经过,父组件传递给子组件的(只可读)
directives:{},
filters:{},
components:{},
menthod:{
}
}
}
})
复制代码
<div id="app">
//父组件向子组件 传递 方法,采用事件绑定机制v-on,当咱们自定义一个属性以后
<com2 v-on:func="show"></com2>
</div>
<template id="tmp1">
<div>
<h1>这是子组件</h1>
<input type="button" @click="myclick">
</div>
<template>
//js
<script>
var com2={
template:'#tmp1',
method:{
myclick(){
//emit愿意 发射调用
this.$emit('func')
}
}
}
//建立vue实列,获得viewMoodel
var vm=new vue({
el:'#app',
data:{
conName:''//当前component中:is绑定的组件名称
flag:true
},
methods:{
show(){
console.log("我是父组件的方法"),
}
}
components:{
com2
}
})
</script>
//传参数的状况
show(data,data2)------------this.$emit('func',参数1内容,参数2内容)
复制代码
ref
//html
<h3 id="myh3" ref="myh3">获取DOM</H3>
//js
methods:{
getElement(){
console.log(this.$refs.myh3.innerText)
//原生:document.getElementById('myh3').innerText
//ref就是单词 reference; 值类型和引用类型 reference
}
}
复制代码
vue-router
路由安装//安装方式1(会自动安装)
<script src='/path/to/vue.js'></script>
<script src='/path/to/vue-router.js'></script>
//安装方式2
//若是在模块化的工程中使用它(如:webpack),必须经过Vue.use()(手动安装)明确安装路由功能
npm install vue-router
import Vue form 'vue'
import VueRouter form 'vue-router'
Vue.use(VueRouter)
复制代码
复制代码
在建立一个路由对象以后,导入vue-router包以后,window全局对象中,就有了一个 构造函数,叫作VueRouter, 在 new 路由对象的时候,能够为构造函数,传递一个配置对象
<div id="app">
//必须带#(这种方式麻烦,官方提供router-link)
<a href="#/login">登陆</a>
//router-link控制跳转(tag="span"---改变标签属性)
<router-link to ="/login">登陆</router-link>
//vue-router提供的,专门用来当占位符的
<router-view></router-view>
</div>
复制代码
<script>
#组件模板对象
var login={
template:'登陆组件模板对象'
}
#组件应用名称
// Vue.component('login',{
//template:'登陆组件应用名称'
// })
#配置路由
var routerObj = new VueRouter({
//route//这个配置对象中的route表示【路由匹配规则】的意思
routes:[
//每一个路由规则,都是一个对像,必须有两个属性
//属性1:是path,表示监听的哪一个路由连接地址
//属性2:是component,表示path对应的component(组件必须是组件模板对象 不能是组件应用名称)
{path:'/login',component:login}
]
})
//建立vue实列,获得viewMoodel
var vm=new vue({
el:'#app',
data:{},
methods:{}
router:routerObj//将路由规则注册到vm实列上,用来监听url地址改变
)
</script>
复制代码
初始化界面展现哪一页面
routes:[
//这里的redirect和node中彻底不一样
{path:'/',redirect:'/login'}
]
复制代码
#方式1 style默认属性
默认a标签有一个<router-link>属性默认属性`router-link-active`css样式
#方式2 路由构造选项`linkActiveClass`
routes:[],
linkActiveClass:'myactive'-----配置完这个会在标签上多出这个类
复制代码
#第一步()包裹
-----mode表示过分效果
<transition mode="out-in">
<router-view></router-view>
</transition>
#第二部
style中写入类
复制代码
//在路由中,使用查询字符串,给路由传递参数,则不须要修改,路由规则的path属性
var login={
template:'登陆组件模板对象{{$route.query.id}}'
//组件中的生命周期钩子函数
created(){
console.log(this.$route.query.id)----获取到的id
}
}
复制代码
params方式传参
//html
<router-link to ="/login/12">登陆</router-link>
//js
routes:[
{path:'/login:id',component:login}
]
//组件对象中
created(){
console.log(this.$route.params.id)----获取到的id
}
复制代码
组件中包含路由跳转:
#html
<template>
<router-link to ="/count/login/">登陆</router-link>
</template>
routes:[
{path:'/count',
component:login,
//子路由 前面不加斜线,不然永远以根路径进行请求
children:[
path:'login'
]
}
]
复制代码
//放置对应name的组件
<router-view></router-view>
<router-view name="left"></router-view>
<router-view name="main"></router-view>
复制代码
var header ={
template:'头部区域'
}
var leftBox={
template:'左侧区域'
}
var mainBox={
template:'主体区域'
}
var router = new VueRouter({
//route//这个配置对象中的route表示【路由匹配规则】的意思
routes:[
{path:'/',components:{
'default':header,
'left':leftBox,
'main':mainBox
}
}
]
})
//建立vue实列,获得viewMoodel
var vm=new vue({
el:'#app',
data:{},
methods:{}
router//将路由规则注册到vm实列上,用来监听url地址改变
)
复制代码
@keyup="getfullname"
<input type="text " v-model="firstname">
复制代码
var vm = new Vue({
data:{
firstname='',
lastname='',
fullname=''
}
#方法1
watch:{//使用这个属性,能够监听data中的指定数据的变化,而后触发watch指定函数
//监听属性名 有横线必须加引号 'first-name',没有横线能够不加
//下面是监听firstname改变
firstname:function(){
this.fullname=this.firstname+'-'+this.lastname
}
}
#方法2
watch:{
'first-name':function(newvalue,oldvalue){
this.fullname=newvalue+'-'+this.lastname
}
}
})
复制代码
监听路由
watch监听路由改变$route.path
watch:{
'$route.path':function(newVal,oldVal){
if(newVal==='/login'){
console.log("登陆界面")
}else if(oldVal==='/register'){
console.log("注册界面")
}
}
}
复制代码
computed属性
这个属性和methods
同级 ,computed中能够定义一些属性,这些属性,叫作【计算属性】,计算属性的本质。就是一个方法,只不过,咱们在使用时是把他们的名称看成属性来使用
//把data上面的fullname删掉,在computed定义
#注意1:计算属性,在引用的时候,必定不要加(),当普通属性使用就行
#注意2:任何data中的属性发生改变,就会从新计算
#注意3:计算的结果会被缓存起来,方便下次使用
computed:{
'fullname':function(){
return this.firstname+'-'+this.la
}
}
复制代码
computed
会被缓存起来,看成属性使用,简单操做methods
方式表示一个具体操做,主要写业务逻辑watch
是computed和methods结合体安装:npm i nrm -g--------全局安装包
使用:nrm ls能够查看镜像列表,看当前使用的是哪一个镜像
使用:nrm use 镜像名
切换不一样的镜像源地址
注意 :nrm只是提供了几个经常使用的安装包地址,他只是改变下载报的URL地址 安装时仍是用npm
1. 箭头函数做用
- 改变this指向
2. 定时器 this的指向问题
3. switch(this.opt){
case'+':
this.result=parseInt(this.n1)+parseInt(this.n2)
break;
case'-':
this.result=parseInt(this.n1)-parseInt(this.n2)
break;
}
4. some(function(item,i){}):遍历返回一个boolean,(能够随时终止),返回true时就终止
findIndex(function(item,i){})找索引
5. foreach适用于只是进行集合或数组遍历,for则在较复杂的循环中效率更高。
6. indexOf() 若是要检索的字符串值没有出现,则该方法返回 -1。
7. foreEach some filter findIndex这些都属于数组的新方法(遍历)使用方式有点区别-------------ES6的新方法
8. jquery中搜索 :contains
9. replace(参数1,参数2) 第一个参数除了写字符串以外,还能够写正则
10. new Data()---------当前事件,当传入参数,就是参数的时刻
11. 模板字符串`${y}-${m}-${d}`字符串拼接(tab键上面的的符号包裹起来``)
复制代码
npm remove request
npm install requset
复制代码