1.Vue的基础知识语法

v-cloak指令的用法:

1.提供样式:

[v-cloak]{
	display:none
}

2.在插值表达式所在的标签中添加v-cloak指令(解决闪动问题)

数据绑定指令:

v-text:填充纯文本 (相比插值表达式是更加简洁)

v-html:填充HTML片段(存在安全问题-XSS攻击)

v-pre:显示原始信息,跳过编译过程

v-once :只编译一次(显示内容之后不再具有响应式功能,可以提高性能)

v-model:双向数据绑定

<input type='text' v-model='uname'>

v-on指令:

<input type='button' v-on:click='num++'>
简写模式:
<input type='button' @click='num++'>

<input type='button' @click='handle' value='按钮'>

<input type='button' @click='handle1(123,456,$event)' value='点击'>

/*
	如果事件直接绑定函数名称,那么默认会传递事件对象作为事件函数的第一个参数
	如果事件绑定函数调用,那么事件对象必须作为最后一个参数显示传递,并且事件对象名称必须是$event

*/


事件修饰符:
//stop:阻止冒泡
<a v-on:click.stop="handle">跳转</a>

//prevent阻止默认行为
<a v-on:click.prevent="handle">跳转</a>


按键修饰符:
//enter回车键
<input v-on:keyup.enter='submit'>

//delete删除键
<input v-on:keyup.delete='handle'>

//自定义按键修饰符(按键对应的值通过event.keyCode获取)
Vue.config.keyCodes.f1 = 32

<script>
	var em = new Vue({
		el:'#app',
		data:{
			num:0
		},
		methods:{
			handle:function(event){
				console.log(event.target.innerHTML);//按钮  (类似this)
				this.num++;
				event.stopPropagation();//阻止冒泡
			},
			handle1:function(p,p1,event){
				console.log(p); //123
				console.log(p1); //456
				console.log(event.target.innerHTML);
			}
		}
	})
</script>

属性绑定v-bind:

<a v-bind:href='url'>点击</a>
//缩写
<a :href='url'>点击</a>


//样式绑定:
<style>
    .active{ 
        border:1px solid red
    }
    .error{
        background-color:blue
    }
</style>
对象语法:
<div v-bind:class="{active:isActive}"></div>

数组语法:
<div v-bind:class="[activeClass,errorClass]">
    
两者结合使用:
  <div v-bind:class="[activeClass,{active:isActive}]"></div>
    
  <div v-bind:class="objClass"></div>
    
    
    //style样式处理
   <div v-bind:style="{color:activeColoe,fontsize:Size}"></div>
    
    <div v-bind:style="[baseStyles,SizeStyles]"></div>
</div>
<script>
	var em = new Vue({
		el:'#app',
		data:{
			url:'http:www.baidu.com',
             isActive:true,
             activeClass:'active',
             errorClass:'error',
             objClass:{active:true,error:true}
		},
		methods:{
            handle:function(){
                this.url = 'http:www.bilibili.com'
            },
            handle:function(){
                this.isActive = !this.isActive;
                this.objClass.active = false;
            }
		}
	})
</script>


分支结构:

v-if
v-else-if
v-else
v-show (控制div显示与不显示)

循环结构

<li v-for='item in list'>{{item}}</li>

<li v-for='(item,index) in list'>{{item}} + '-----'+{{index}}</li>

key的作用:帮助Vue区分不同的元素,从而提高性能
<li :key='item.id' v-for='(item,index) in list'>{{item}} + '-----'+{{index}}</li>

v-for遍历对象
<div v-for='(value,key,index) in object'></div>

v-if和v-for结合使用
<div v-if='value === 12' v-for='(value,key,index) in object'></div>

表单域修饰符

  • number:转换为数值
  • trim:去掉开始和结尾的空格
  • lazy:将input事件切换为change事件
<input v-model.number='age'>

自定义指令

//自定义指令的语法规则(获取元素的焦点)
Vue.directive('focus',{
	inserted:function(el){
		//el表示指令所绑定的元素(获取元素的焦点)
		el.focus();
	}
})

//自定义指令的用法
<input type='text' v-focus>


//带参数的自定义指令(改变元素背景色)
Vue.directive('color',{
	bind:function(el,binding){
		el.style.backgroundColor = binding.value.color;
	}
})

//用法
<input type='text' v-color='{color:"orange"}'>


//局部指令语法
var vm = new Vue({
	directives:{
		color:{
			bind:function(el,binding){
				el.style.backgroundColor = binding.value.color;
			}	
		}
	},
	focus:{
		inserted:function(el){
			el.focus();
		}
	}
})

计算属性

<div id='app'>
    <div>
        {{reverseString}}
    </div>
</div>

<script>
	 var vm = new Vue({
         el:"#app",
         data:{
             msg:'Hello'
         },
         computed:{
             reverseString:function(){
                 return this.msg.split('').reverse().join('');
             }
         }
     })
	
</script>

计算属性与方法的区别:
计算属性是基于他们的依赖进行缓存的
方法不存在缓存

侦听器(数据变化时执行异步或开销较大的操作)

<script>
	var vm = new Vue({
        el:"#app",
        data:{
            firstName:'张',
            lastName:'三',
            fullName:'张三',
        },
        watch:{
            firstName:function(val){
                this.fullName = val + ' '+ this.lastName;
            },
            lastName:function(val){
                this.fullName = this.firstName + ' '+ val;
            }
        }
    })
</script>

过滤器

如:格式化数据,将日期转为指定格式
<script>
    /*全局过滤器*/
	Vue.filter('过滤器名称',function(val){
        //业务逻辑
    })
    
    /*局部过滤器*/
    var vm = new Vue({
        el:"#app",
        data:{
            msg:''
        },
        filters:{
            过滤器名称:fuction(){
            
        	}
        }
    })
</script>

//使用
<div>
    {{msg | 过滤器名称}}
    {{msg | 过滤器名称 | 过滤器名称}}
</div>

<div v-bind:id="id | 过滤器名称">
    
</div>


带参数的过滤器
<script>
	Vue.filter('format',function(value,arg){
        //arg就是过滤器传递过来的参数
    })
</script>
//使用
<div>
    {{date | format(123)}}
</div>


生命周期

1.主要阶段

  • 挂载(初始化相关属性)
    • beforeCreate(在实例初始化之后,数据观测和事件配置之前被调用)
    • created(在实例创建完成后被立即调用)
    • beforeMount(在挂载开始之前被调用)
    • mounted(被新创建的vm.$el替换,并挂载到实例上去之后调用该钩子)
  • 更新(元素或组件的变更操作)
    • beforeUpdate(数据更新时调用,发生在虚拟DOM打补丁之前)
    • updated(由于数据更改导致的虚拟DOM重新渲染和打补丁,在这之后会调用该钩子)
  • 销毁(销毁相关属性)
    • beforeDestroy(实例销毁之前调用)
    • destroyed(实例销毁后调用)

数组变异方法(修改原有数据)

  • push()向数组末尾添加元素,返回新的长度

  • unshift()向数组的开头添加一个或更多元素,并返回新的长度

  • pop()删除一个数组中的最后一个元素

  • shift()删除数组的第一个元素

  • splice()从数组中添加或删除项目

    • splice(index,howmany,item1…itemX)

    • index—必须,整数,规定添加/删除项目的位置,使用负数可以从数组结尾出规定位置

    • howmany—必须,要删除的项目的数量,如果设置0,则不会删除项目

    • item1…itemX,可选,向数组添加的新项目

    • eg1:删除元素
      let a = [1, 2, 3, 4, 5, 6, 7];
      let item = a.splice(0, 3); // [1,2,3]
      console.log(a); // [4,5,6,7]
      // 从数组下标0开始,删除3个元素
      let item = a.splice(-1, 3); // [7]
      // 从最后一个元素开始删除3个元素,因为最后一个元素,所以只删除了7
      
      eg2: 删除并添加
      let a = [1, 2, 3, 4, 5, 6, 7];
      let item = a.splice(0,3,'添加'); // [1,2,3]
      console.log(a); // ['添加',4,5,6,7]
      // 从数组下标0开始,删除3个元素,并添加元素'添加'
      let b = [1, 2, 3, 4, 5, 6, 7];
      let item = b.splice(-2,3,'添加1','添加2'); // [6,7]
      console.log(b); // [1,2,3,4,5,'添加1','添加2']
      // 从数组最后第二个元素开始,删除3个元素,并添加两个元素'添加1'、'添加2'
      
      eg3: 不删除只添加:
      let a = [1, 2, 3, 4, 5, 6, 7];
      let item = a.splice(0,0,'添加1','添加2'); // [] 没有删除元素,返回空数组
      console.log(a); // ['添加1','添加2',1,2,3,4,5,6,7]
      let b = [1, 2, 3, 4, 5, 6, 7];
      let item = b.splice(-1,0,'添加1','添加2'); // [] 没有删除元素,返回空数组
      console.log(b); // [1,2,3,4,5,6,'添加1','添加2',7] 在最后一个元素的前面添加两个元素
      
  • sort()数组排序

    • 参数可选,规定排序顺序的比较函数
    • 没有传比较函数的话,默认按字母升序
  • reverse()颠倒数组中元素的顺序

替换数组(生成新的数组)

  • filter()
  • concat()合并数组,返回新数组
  • slice()浅拷贝数组的元素
    • slice(begin,end)

修改响应式数据

Vue.set(vm.items,index,newValue)

vm.$set(vm.items,index,newValue)

  1. 参数一表示要处理的数组名称
  2. 参数二表示要处理的数组的索引
  3. 参数三表示要处理的数组的值

组件

全局组件注册语法

Vue.component(组件名称,{
	data: 组件数据,
	template: 组件模板内容
})

//示例(每个组件都是相互独立的)
<div id="app">
    <button-counter></button-counter>
</div>
<script>
    //注册组件
    Vue.component('button-counter',{
        data: function(){
            return {
                count : 0,
            }
        },
        //template: '<button @click="count++">点击了{{count}}次</button>',
        template: '<button @click="handle">点击了{{count}}次</button>',
        methods: {
            handle: function(){
                this.count++;
            }
        }
    })
	var vm = new Vue({
        el: "#app",
        data: {
            
        }
    })
</script>

组件注意事项:

  1. data必须是一个函数
  2. 组件模板内容必须是单个根元素
  3. 组件模板内容可以是模板字符串
  4. 使用驼峰命名组件,只能在字符串模板中用驼峰的方式使用组件,在普通的标签模板中,必须使用短横线的方式使用组件(HelloWord -------)

局部组件注册

<script>
    var HelloWord = {
        data: function(){
            return {
                msg: 'HelloWord'
            }
        },
        template: '<div>{{msg}}</div>'
    }
	var vm = new Vue({
        el: "#app",
        data: {
            
        },
        components: {
            hello-word : HelloWord
        }
    })
</script>

组件间数据交互

  1. 父组件向子组件传值

    1. 组件内部通过props接收传递过来的值

    2. Vue.conponent('menu-item',{
      	props: ['title'],
      	template: '<div>{{title}}</div>'
      })
      
    3. 父组件通过属性将值传递给子组件

    4. <menu-item title="来自父组件的数据"></menu-item>
      //动态传值
      <menu-item :title="title"></menu-item>
      
    5. props属性名规则

      1. 在props中使用驼峰形式,模板中需要使用短横线的形式
      2. 字符串形式的模板中没有这个限制
    6. props属性值类型

      1. 字符串String
      2. 数值Number
      3. 布尔值Boolean
      4. 数组Array
      5. 对象Object
    7. props是单向数据流

  2. 子组件向父组件传值

    1. 子组件通过自定义事件向父组件传递信息

    2. <button v-on:click='$emit("text")'> //text是事件名称
          测试
      </button>
      
      //带参数
      <button v-on:click='$emit("text",0.1)'> //text是事件名称
          测试
      </button>
      
    3. 父组件监听子组件的事件

    4. <menu-item v-on:text='fontSize += 0.1'></menu-item>
      
      //接受带参数
      <menu-item v-on:text='fontSize += $event'></menu-item>//$event就是子组件传递过来的参数(固定写法)
      
  3. 非父子组件之间传值

    1. 单独的事件中心管理组件间的通信

    2. var eventHub = new Vue()
      
    3. 监听事件与销毁事件

    4. eventHub.$on('方法名',方法体) //监听
      eventHub.$off('方法名') //销毁事件
      //触发事件
      eventHub.$emit('方法名',参数)
      
  4. 组件插槽

    1. 父组件向子组件传递内容

    2. 组件插槽基本用法

    3. Vue.component('alert-box',{
      	template: '
              <div>
                  <strong>Error:</strong>
                  <slot></slot> //名字固定
                  <slot>可有默认内容</slot>
              </div>
      	'
      })
      
      <alert-box>有错误</alert-box>
      
    4. 具名插槽用法

    5. Vue.component('base-layout',{
      	template: '
              <div>
                  <header>
                  	<slot name='header'></slot>
                  </header>
                   <main>
                  	<slot></slot>
                  </main>
                   <footer>
                  	<slot name='footer'></slot>
                  </footer>
              </div>
      	'
      })
      
      //使用
      <div id='app'>
          //用法一
          <base-layout>
          	<p slot='header'>头部</p>
          	<p>内容</p>
          <p slot='footer'>底部</p>
          </base-layout>
          
          //用法二
          <base-layout>
          	<template slot='header'>
              	<p>标题1</p>
      			<p>标题2</p>
              </template>
              <template slot='footer'>
              	<p>底部1</p>
      			<p>底部2</p>
              </template>
          </base-layout>
      </div>
      
    6. 作用域插槽(应用场景:父组件对子组件的内容进行加工处理)

    7. <script>
      	Vue.component('fruit-list',{
              props: ['list'],
              template: '
              	<div>
          			<li :key='item.id' v-for='item in list'>
          				<slot :info='item'>
          					{{item.name}}
          				</slot>
          			</li>
          		</div>
              '
          })
          
          var vm = new Vue({
              el: '#app,'
              data: {
              	list: [
                      {
                          id: 1,
                          name: 'apple'
                      },
                       {
                          id: 2,
                          name: 'orange'
                      },
                       {
                          id: 1,
                          name: 'bannea'
                      },
                  ]
          	}
          })
      </script>
      
      <div id='app'>
          <fruit-list :list='list'>
          	<template slot-scope='slotProps'>
              	<strong v-if='slotProps.info.id==2' class='current'>
                      {{slotProps.info.name}}					
                  </strong>
      			<span v-else>{{slotProps.info.name}}</span>
              </template>
          </fruit-list>
      </div>
      

      前后端交互

      promise用法
      • promise是异步编程的一种解决方案,从语法上讲,promise是一个对象,从它可以获取异步操作的消息
      • 可以避免多层异步调用嵌套问题(回调地狱)
      • promise对象提供了简洁的API,使得控制器异步操作更加容易

      基本语法:

      <script>
      	var p = new Promise(function(resolve,reject){
              //这里实现异步任务
              //成功时调用resolve()
              resolve('成功');
              //失败时调用reject()
              reject('出错了');
          })
          p.then(function(ret){
              //从resolve得到正常结果
              console.log(ret);//成功
          },function(ret){
              //从reject得到错误信息
              console.log(ret);//出错了
          })
      </script>
      

      基于promise发送Ajax请求

      <script>
      	function queryData(url){
              var p = new Promise(function(resolve,reject){
                  $.ajax({
                      url : url,
                      data: '',
                      type : 'post',
                      dateType : 'json',
                      success:function(res){
                          resolve(res);
                      },
                      error: function(res){
                          reject(res);
                      }
                  })
          	})
              return p;
          }
          //发送多个ajax请求并保证顺序
          queryData(url1);
          .then(function(data){
              console.log(data);//url1数据
              return queryData(url2);
          })
          .then(function(data){
              console.log(data);//url2数据
              return queryData(url3);
          })
          .then(function(data){
              console.log(data);//url3数据
          })
          
          //then参数中的函数返回值
          1.返回promise示例对象
              返回的该示例对象会调用下一个then
          2.返回普通值
              返回的普通值会直接传递给下一个then,通过then参数中函数的参数接收值
      </script>
      
      promise常用的API
      1. 实例方法

        1. p.then() 得到异步任务的正确结果

        2. p.catch() 获取异常信息

        3. p.finally() 成功与否都会执行(尚且不是正式标准)

        4. <script>
          	function queryData(url){
                  var p = new Promise(function(resolve,reject){
                      $.ajax({
                          url : url,
                          data: '',
                          type : 'post',
                          dateType : 'json',
                          success:function(res){
                              resolve('success');
                          },
                          error: function(res){
                              reject('error');
                          }
                      })
              	})
                  return p;
              }
              queryData(url);
              .then(function(data){
                  console.log(data);//success
              })
              .catch(function(data){
                  console.log(data);//error
              })
              .finally(function(){
                  console.log('finished');
              })
          </script>
          
      2. 对象方法

        1. Promise.all() 并发处理多个异步任务,所有任务都执行完成才能得到结果

        2. Promise.race() 并发处理多个异步任务,只要有一个任务完成就能得到结果

        3. <script>
          	function queryData(url){
                  var p = new Promise(function(resolve,reject){
                      $.ajax({
                          url : url,
                          data: '',
                          type : 'post',
                          dateType : 'json',
                          success:function(res){
                              resolve('success');
                          },
                          error: function(res){
                              reject('error');
                          }
                      })
              	})
                  return p;
              }
              var p1 = queryData(url1);
              var p2= queryData(url2);
              var p3 = queryData(url3);
              Promise.all([p1,p2,p3]).then(function(result){
                  console.log(result);//[url1,url2,url3数据]
              })
              
              Promise.race([p1,p2,p3]).then(function(result){
                  console.log(result);//url1数据
              })
          </script>
          

    接口调用-fetch用法

    1. 基本特性

      1. 更加简单的数据获取方式,功能强大,更灵活,可以看做是xhr的升级版
      2. 基于Promise实现
    2. 语法结构

      1. <script>
        	fetch('/data').then(function(data){
                //text()方法属于fetchAPI的一部分,返回一个Promise实例对象,用于获取后台返回数据
                return data.text();
            }).then(function(data){
                //这里得到最终的数据
                console.log(data);
            })
        </script>
        
    3. 请求参数

      1. 常用配置选项

        1. method(String):HTTP请求方法,默认为GET(GET、POST、PUT、DELETE)

        2. body(String):HTTP的请求参数

        3. headers(Object):HTTP的请求头,默认为{}

        4. <script>
              //传统get请求传参 (DELETE)
          	fetch('/data?id=123',{
                  method:'get'
              }).then(function(data){
                  return data.text();
              }).then(function(data){
                  console.log(data);
              })
              
              fetch('/data/123',{
                  method:'get'
              }).then(function(data){
                  return data.text();
              }).then(function(data){
                  console.log(data);
              })
              
              //post请求传参
              fetch('/data',{
                  method: 'post',
                  body:'uname=lisi&pwd=123',
                  headers:{
                      'Content-Type':'application/x-www-form-urlencoded'
                  }
              }).then(function(data){
                  return data.text();
              }).then(function(data){
                  console.log(data);
              })
              
               fetch('/data',{
                  method: 'post',
                  body:JSON.stringify({
                      uname : '张三',
                      pwd: '456'
                  }),
                  headers:{
                      'Content-Type':'application/json'
                  }
              }).then(function(data){
                  return data.text();
              }).then(function(data){
                  console.log(data);
              })
              
              //PUT请求
               fetch('/data/123',{
                  method: 'put',
                  body:JSON.stringify({
                      uname : '张三',
                      pwd: '456'
                  }),
                  headers:{
                      'Content-Type':'application/json'
                  }
              }).then(function(data){
                  return data.text();
              }).then(function(data){
                  console.log(data);
              })
          </script>
          
        5. fetch响应结果

          1. 响应数据格式

            1. text():将返回体处理成字符串类型

            2. json():返回结果和JSON.parse()一样

            3. <script>
              	 fetch('/data/123',{
                      method:'get'
                  }).then(function(data){
                      return data.json();
                  }).then(function(data){
                      console.log(data);
                  })
              </script>
              

    接口调用-axios用法

    1. 基本特性

      1. 支持浏览器和node.js
      2. 支持promise
      3. 能拦截请求和响应
      4. 自动转换JSON数据
    2. 响应结果属性

      1. data: 实际响应回来的数据
      2. headers: 响应头信息
      3. status: 状态码
      4. statusText:响应状态信息
    3. <script>
          //需引入axios.js
          //get请求(delete请求一样)
      	axios.get('/data?id=123').then(function(ret){
              //data属性是固定用法,用于获取后台实际数据
              console.log(ret.data);
          })
          axios.get('/data/123').then(function(ret){
              console.log(ret.data);
          })
          axios.get('/data',{
              params: {
                  id: 123
              }
          }).then(function(ret){
              console.log(ret.data);
          })
          
          axios.delete('/data',{
              params: {
                  id: 123
              }
          }).then(function(ret){
              console.log(ret.data);
          })
          
          //post请求
          //传递的是json形式
          axios.post('/data',{
              uname: 'tom',
              pwd: 123
          }).then(function(ret){
              console.log(ret.data);
          })
          //通过URLSearchParams传递参数(传递的是字符串形式   uname=tom&pwd=123)
          var params = new URLSearchParams();
          params.append('uname','tom');
          params.append('pwd',123);
          axios.post('/data',params).then(function(ret){
              console.log(ret.data);
          })
          
          //put请求(和post请求一样)
          axios.put('/data/123',{
              uname: 'tom',
              pwd: 123
          }).then(function(ret){
              console.log(ret.data);
          })
      </script>
      
    4. axios的全局配置

      1. axios.defaults.timeout = 3000;//超时时间

      2. axios.defaults.baseURL = ‘http://localhost’; //默认地址

      3. axios.defaults.headers[‘mytoken’] = ‘djsjlaqqwol’; //设置请求头

      4. <script>
        	axios.defaults.baseURL = 'http://localhost:80/';
            //自动拼接路径 (http://localhost:80/data)
            axios.post('data',{
                uname: 'tom',
                pwd: 123
            }).then(function(ret){
                console.log(ret.data);
            })
        </script>
        
    5. axios拦截器

      1. 请求拦截器(在请求发出之前设置一些信息)

      2. <script>
        	axios.interceptors.request.use(function(config){
                //在请求发出之前进行一些信息设置
                console.log(config.url);
                config.headers.mytoken = 'hello';
                return config;
            },function(err){
                //处理响应的错误信息
            })
        </script>
        
      3. 响应拦截器(在获取数据之前对数据做一些加工处理)

      4. <script>
        	axios.interceptors.response.use(function(res){
                //对返回数据处理
                var data = res.data;
                return data;
            },function(err){
                //处理响应的错误信息
            })
        </script>
        

    接口调用async/await用法

    • 基本语法

    • async/await是e7引入的新语法,可以更加方便的进行异步操作
      async关键字用于函数上(async函数的返回值是Promise实例对象)
      await关键字用于async函数当中,(await可以得到异步的结果)
      <script>
      	async function queryData(id){
              const ret = await axios.get('/data');
              console.log(ret.data);
              return ret.data;
          }
          queryData().then(function(data){
              console.log(data);
          })
          
          //处理多个异步请求
          async function queryData(id){
              const info = await axios.get('/data');
              var ret = await axios.get('data1?info=' + info.data);
              return ret.data;
          }
          queryData().then(function(data){
              console.log(data);
          })
      </script>
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值