VUE 知识点总结

vue 特色 https://cn.vuejs.org/v2/guide/

	mvvm(前端)   m:model(数据)  v:view(视图)  
	vm:viewmodel 数据和视图的桥梁
	m---->mv----->v
	m<----mv<-----v

双向数据绑定

	angular  mvc(后端)      m:model(数据)  v:view(视图)  c:controller(控制器)
	v--->c--->m
	m--->v

优点

		轻量级
		高效率
		上手快
		简单易学
		文档全面简洁

. vue指令

2.1. v-model 双向数据绑定

        ref(https://www.cnblogs.com/goloving/p/9404099.html)
 	<input type="text" ref="name" @keyup="show"/>
       console.log(this.$refs.name.value);//作用2:获取DOM元素
       this.msg=this.$refs.name.value;

2.2.v-for 数组,对象,数值 最后一位是索引

		<li v-for="(value,index) in arr">{{value}}---{{index}}</li>
		<li v-for="(value,key,index) in obj">{{value}}--{{key}}----{{index}}</li>
		<h1 v-for="i in 10">{{i}}</h1>
        <template v-for="a in arr">
				<h1>a</h1>
				<a href="">a</a>
		</template>
	1. **当在组件中使用** v-for 时,key 现在是必须的。
	
	2.  当Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用 “**就地复用**” 策略。如果数据项的顺序被改变,
		Vue将**不是移动 DOM 元素来匹配数据项的顺序**, 而是**简单复用此处每个元素**,并且确保它在特定索引
		下显示已被渲染过的每个元素。
		
	3.  为了给 Vue 一个提示,**以便它能跟踪每个节点的身份,从而重用和重新排序现有元素**,你需要为每项提
		供一个唯一 key 属性。

2.3.v-bind 绑定属性

		<a v-bind:href="ahref">baidu</a>

简写:

 		<a :href="ahref">baidu</a>
      :style="{width:length+'%','background-color':'#ccc'}"
      :class="[aa,bb,cc]"    变量
      :class="{aa:true,bb:true,cc:false}"  
      <img v-for="v in src" :src="'img/'+v"/>

2.3.1样式的使用

使用class样式

		1. 数组
				<h1 :class="['red', 'thin']">这是一个邪恶的H1</h1>
		2. 数组中使用三元表达式
				<h1 :class="['red', 'thin', isactive?'active':'']">这是一个邪恶的H1</h1>
		3. 数组中嵌套对象
				<h1 :class="['red', 'thin', {'active': isactive}]">这是一个邪恶的H1</h1>
		4. 直接使用对象
				<h1 :class="{red:true, italic:true, active:true, thin:true}">这是一个邪恶的H1</h1>

使用内联样式

注意:font-size这样的一定要加 (‘ ’)

  1. 直接在元素上通过 :style 的形式,书写样式对象
		<h1 :style="{color: 'red', 'font-size': '40px'}">这是一个善良的H1</h1>
  1. 将样式对象,定义到 data 中,并直接引用到 :style

     加在data上定义样式:
    
		data: {
			h1StyleObj: { color: 'red', 'font-size': '40px', 'font-weight': '200' }
		}
	加在元素中,通过属性绑定的形式,将样式对象应用到元素中:
		<h1 :style="h1StyleObj">这是一个善良的H1</h1>
  1. :style 中通过数组,引用多个 data 上的样式对象+ 在data上定义样式:
		data: {
			 h1StyleObj: { color: 'red', 'font-size': '40px', 'font-weight': '200' },
			 h1StyleObj2: { fontStyle: 'italic' }
		}
	加在元素中,通过属性绑定的形式,将样式对象应用到元素中:
		<h1 :style="[h1StyleObj, h1StyleObj2]">这是一个善良的H1</h1>  

2.4.v-html 将含有标签的字符串转化成为标签

2.5.v-text 等同于{{}} {{}}闪烁一下,再出数据 ,无法用于属性,前后可以添加内容,会被覆盖

2.6.v-show 显示和隐藏(display:none;) true显示 false 隐藏 可以判断 可以赋值 <h3 v-show="a==baba">3333</h3>

2.7.v-if 隐藏:不会渲染该标签 相当于js中的if

      	v-else
     	v-else-if
 		<div v-if="num>=90">
            优秀
        </div>
        <div v-else-if="num>=60">
            良好
         </div>
         <div v-else>
            不及格
         </div>

2.8.v-once <p v-once>{{num}}</p> 不会跟着改变的值

2.9.v-cloak {{}}闪烁一下,再出数据 ,无法用于属性,前后可以添加内容

 		<h1  v-cloak>{{msg}}</h1>
 		<style>
			[v-cloak]{
				display:none;
			}
		</style>

2.10 v-on 事件

		<h1 v-on:click="show">{{msg}}</h1>

简写:

 		<h1 @click="show">{{msg}}</h1>
        取消右键菜单 
         		@contextmenu.prevent="down()"

        事件修饰符:
                https://www.cnblogs.com/xuqp/p/9406971.html  
                 
                .stop:等同于JavaScript中的event.stopPropagation(),防止事件冒泡
                
				.prevent:等同于JavaScript中的event.preventDefault(),阻止事件默认行为
				
				.capture:与事件冒泡的方向相反,事件捕获    由外到内(先触发) 
				
				.self:只会触发自己(内容文本)范围内的事件,不包含子元素(标签),该冒泡还是要冒泡
				
				.once:只会触发一次,相当于把自己绑定的事件删除
				
				.passive  不阻止事件默认行为
				
				@click.self.prevent  自己   取消默认行为
				
				@click.prevent.self  所有取消默认行为   自己

          按键修饰符:
                .enter:回车键
                
				.tab:制表键
				
                .delete:含delete和backspace键
                
				.esc:返回键
				
				.space: 空格键
				
				.up:向上键
				
				.down:向下键
				
				.left:向左键
				
				.right:向右键 
				
	用按键修饰符
			<input type="text"  @keyup.down="showTwo()"/>

用 KeyCode

			<input  @keydown.67="show()" /> 

可以直接写键盘码值或用自己的名称,替换可以keyCode

			<input  @keydown.c="show()" />
				Vue.config.keyCodes.c = 67;	

组合版(单按a,b,c)

			<input type="text" @keyup.a.b.c="showa"/>	

鼠标修饰符:

            .left:鼠标左键
			.middle:鼠标中间滚轮
			.right:鼠标右键

右键单击不出菜单栏,出效果

		<div class="one" @mousedown.right="show"></div>

		<div class="one" @contextmenu.prevent="down()"></div>
         修饰键:
                .ctrl    .ctrl.67   67-->c
				.alt
				.shift
				.meta
		<input  @keydown.ctrl.67="ctr" />
		<input  @keydown.ctrl="ctrs($event)" />
         注意:在Mac系统键盘上,meta对应命令键 (⌘)。
              在Windows系统键盘meta对应windows徽标键(⊞)。
              在Sun操作系统键盘上,meta对应实心宝石键 (◆)。
              在其他特定键盘上,尤其在MIT和Lisp键盘及其后续,
              比如Knight键盘,space-cadet键盘,meta被标记为“META”。
              在Symbolics键盘上,meta被标记为“META” 或者 “Meta”。 

3.表单

       text,password,textarea----->v-model---》value
       radio,checkbox,select----->v-model checked/v-bind:value

表单修饰符:

    .lazy:失去焦点(change事件同步)或者回车的时候才会同步数据
    .number:变成数值
	.trim:去掉前后空格,不会去掉中间空https://www.cnblogs.com/xiaobaiv/p/9153020.html

4.网址

	ajax  http://www.runoob.com/vue2/vuejs-ajax.html
 	axios  https://blog.csdn.net/sinat_38328891/article/details/80312965  
 	https://segmentfault.com/a/1190000010902115
  	https://www.kancloud.cn/yunye/axios/234845(中文网)

4.1. vue-resource发送请求步骤

4.2.

	 params:跟在url后面传参
	 this.$http.get(url,{params:{user:”li”}}).then(res=>{},rej=>{})
	 emulateJSON:设置请求体的类型为application/x-www-form-urlencoded
	 this.$http.post(url,{user:”li”},{emulateJSON:true}).then(res=>{},rej=>{})
	 jsonp:"callback"  设置callback的名称  this.$http.jsonp(url,{params:{},jsonp:"callback"}).then(res=>{},rej=>{})

//可以代替get和post

 	this.$http({
	       url:,
	       data:,
	       method:get/post,
	       jsonp:"callback"
	  }).then(res=>{},rej=>{})

全局配置 htpp://…/api/1.html

	Vue.http.options.root=”http://...”     --->使用 api/1.html
	Vue.http.options.emulateJSON=true;

4.3.

  	https://www.kancloud.cn/yunye/axios/234845
    https://www.cnblogs.com/jiangxifanzhouyudu/p/9102908.html
    https://blog.csdn.net/xjtarzan/article/details/80040646

4.3.1.<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

4.3.2. axios

	axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
	    axios({
		  method: 'post',
		  url: '/user/12345',
		  data: {
		    firstName: 'Fred',
		    lastName: 'Flintstone'
		  }
	});

// 发送 GET 请求(默认的方法)

    axios('/user/12345');

    axios.get(url[,options]).then(res=>{},rej=>{})

// 为给定 ID 的 user 创建请求

	axios.get('/user?ID=12345')
		.then(function (response) {
		
			}).catch(function (error) {
	});

// 可选地,上面的请求可以这样做

	axios.get('/user', {
		params: {
			ID: 12345
		}
	}).then(function (response) {
	
	}).catch(function (error) {
		
	});
 axios.post(url,data,[options]).then(res=>{},rej=>{})
	      axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
	      axios.post('/user', {
		    firstName: 'Fred',
		    lastName: 'Flintstone'
		 })
		  .then(function (response) {
		   
		  })
		  .catch(function (error) {
		  
		  });

4.3.3.

		Axios.defaults.baseURL = 'https://api.example.com';//配置你的接口请求地址
		Axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;//配置token,看情况使用
		Axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';//配置请求头信息。
		// 超时时间
		Axios.defaults.timeout = 5000;
	
     2 将axios添加到Vue的原型对象中
     
    	 Vue.prototype.$axios = axios;
    	 
     3.使用this.$axios.post(url,{"name":this.name}).then()

4.3.4.在请求或响应被 then 或 catch 处理前拦截它们。

		// 添加请求拦截器
		axios.interceptors.request.use(function (config) {
		    // 在发送请求之前做些什么
		    return config;
		  }, function (error) {
		    // 对请求错误做些什么
		    return Promise.reject(error);
		  });
		
		// 添加响应拦截器
		axios.interceptors.response.use(function (response) {
		    // 对响应数据做点什么
		    return response;
		  }, function (error) {
		    // 对响应错误做点什么
		    return Promise.reject(error);
		  });
		如果你想在稍后移除拦截器,可以这样:
		
		var myInterceptor = axios.interceptors.request.use(function () {/*...*/});
		axios.interceptors.request.eject(myInterceptor);

		Axios跨域  https://www.cnblogs.com/wancheng7/p/8987694.html
		
		https://blog.csdn.net/jikangjian/article/details/80798677

如何使用proxyTable

还是拿之前使用过的vue-cli举例。我们首先要在项目目录中找到根目录下config文件夹下的index.js文件。由于我们是在开发环境下使用,自然而然是要配置在dev里面:
dev: {
			  env: require('./dev.env'),
			  port: 8080,
			  autoOpenBrowser: true,
			  assetsSubDirectory: 'static',
			  assetsPublicPath: '/',
			  proxyTable: {
			    '/api': {
			      target: 'http://www.abc.com',  //目标接口域名
			      changeOrigin: true,  //是否跨域
			      pathRewrite: {
			        '^/api': '/api'   //重写接口
			      }
			    },
			  cssSourceMap: false
			}

5.生命周期函数(钩子函数)

https://segmentfault.com/a/1190000008010666
https://segmentfault.com/a/1190000011381906

https://cn.vuejs.org/v2/guide/instance.html#%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E5%9B%BE%E7%A4%BA(图)

八个钩子函数

         beforeCreate:组件实例刚被创建,无属性
         created:组件实例创建完成,有属性,没有DOM(el没有被挂载),data已经完成,el生成了,还没有挂载。

         beforeMount:模板编译之前,有DOM,并没有把DOM挂载
         mounted:模板编译之后,数据都加载到页面上

         beforeUpdate:组件更新之前,数据已经更新了,但是没有挂载
         updated:组件更新之后,数据已经更新了,并且挂载

         activated:  keep-alive,组件被激活时
         deactivated:  keep-alive,组件被激活完成

         beforeDestroy:销毁之前,实例仍然完全可用
         destroyed:销毁完成,调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁

执行了destroy操作,原来样式保留,后续就不再受vue控制了。

6.computed和watch,methods

https://segmentfault.com/a/1190000012948175  
https://www.cnblogs.com/fengxiongZz/p/8074731.html
https://blog.csdn.net/lhban108/article/details/82465547

watchcomputedmethods之间的对比

  1. computed(多个值变化,影响到一个结果) 属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算。他是函数主要当作属性来使用,逻辑简单。

  2. methods方法表示一个具体的操作,主要书写业务逻辑;

  3. watch(一个值变化,影响到多个结果改变)一个对象,键是需要观察的表达式,值是对应回调函数。主要用来监听某些特定数据的变化(watch监控路由对象‘$route’),从而进行某些具体的业务逻辑操作;可以看作是computedmethods的结合体;

计算属性 computed (多个值变化,影响到一个结果) 原来没有属性(结果),创建可计算属性(get/set,一个默认get体)

 	computed:{//前面的数值变化影响到结果---》get
//		'fullname':function(){
//					return this.firstname+this.lastname;
//					}
					fullname(){
						return this.firstname+this.lastname;
					}
		}
       

       fullname:{ //双向数值修改(前面变化影响到后面,后面变化影响到前面)  get+set
					get:function(){
						return this.firstname+"-"+this.lastname;
					},
					set:function(newval){
						//console.log(newval);
						var arr=newval.split('-');
						//console.log(arr);
						this.firstname=arr[0];
						this.lastname=arr[1];
					}
				}

侦听属性 watch(变化的值) (一个值变化,影响到多个结果改变) 检测以有属性

		computed是属性调用,而methods是函数调用
		computed带有缓存功能,而methods不是
		computed可以监控对象,而methods不是
		
		watch可以监控对象,而methods不是
	vm.$watch( expOrFn, callback, [options] )

			var unwatch = vm.$watch('a', cb)
			// 之后取消观察
			unwatch()

			vm.$watch('someObject', callback, {
			  deep: true//深度监听,但是结果一样
			})
			
			vm.$watch('a', callback, {
			  immediate: true // true: 初始化时就会先执行一遍该监听对应的操作
			})

            Watch:{
            'obj':{
						handler(newval){
							console.log(newval);
						},
						deep:true,
						immediate: true
					}
	}
		// 立即以 `a` 的当前值触发回调
		//初始化之前,先监听一下操作,以原始的值回调
		
		watch和computed均可以监控程序员想要监控的对象,
		当这些对象发生改变之后,可以触发回调函数做一些逻辑处理
		
		watch监控自身属性变化(重新编译,性能差)   vm.$watch()
		watch监控路由对象(一个值变化,影响到多个结果改变)
		数据变化时来执行异步操作,这时watch是非常有用的。
		
		计算属性computed的特点(多个值变化,影响到一个结果)
		计算属性会依赖于他使用的data中的属性,
		只要是依赖的属性值有改变,
		则自动重新调用一下计算属性;
		如果他所依赖的这些属性值没有发生改变,
		那么计算属性的值是从缓存中来的,
		而不是重新编译,那么性能要高一些,
		所以vue中尽可能使用computed替代watch。
	<div id="app">
			姓:<input type="text" v-model="firstname"/>
			名:<input type="text" v-model="lastname"/>
			
			总称:{{fullname}}
			
			<input type="text" v-model="obj.a"/>
	</div>
	<script>
			var vm = new Vue({
				el:"#app",
				data:{
					firstname:"li",
					lastname:"bao",
					fullname:"li bao",
					obj:{a:"1111"}
				},
				watch:{
//                  obj(){//无法监测到里面数值的变化
//                  	console.log(this.obj.a);
//                  },
//                  'obj':{
//                  	handler(oldVal,newVal){
//                  		console.log(oldVal,newVal);//结果一样,都是新值
//						},
//						immediate: true,//初始化时就会先执行一遍该监听对应的操作
//						deep:true//console.log打印的结果,
//						//发现oldVal和newVal值是一样的,
//						//所以深度监听虽然可以监听到对象的变化,
//						//但是无法监听到具体对象里面那个属性的变化
//                  },
                    "obj.a":{
                    	handler(oldVal,newVal){
                    		console.log(oldVal,newVal);//结果会不一样
						},
						immediate: true
                    },
                    firstname(){//普通的就可以用这种方式检测,无法添加检测属性
                    	console.log(this.firstname);
                    }
				}
			})
			
	</script>
		vm.$watch("obj.a",function(oldVal,newVal){
				console.log(oldVal,newVal);
			})

7.vue实例的简单属性和方法

	https://www.cnblogs.com/wspblog/p/9876723.html

属性

1.this.$data/vm.$data====>data
  vm.a=100;
  vm.$data.a=100;   直接使用数据   实例的数据对象
  
 2. this.$el/==vm.$el==>el   指定要绑定的元素
  
 4. vm.$options.aa/this.$options.aa  访问自定义属性
 
 6.  获取所有ref属性的标签(获取DOM元素)
		<h1 ref="hOne">11111</h1>
		console.log(this.$refs.hOne.innerHTML);

方法

 1. vm.$mount("#box")=====>手动挂载 el   可以替换原来的挂载
 2. this.$set(要修改的数据,属性名,属性值)/Vue.set(vm.jsona,'sex', '男')/vm.$set(要修改的数据,属性名,属性值)====>任何时候添加对象属性

 3.vm.$destroy()/this.$destroy();====>销毁 destoryed/beforeDestroy
 4.vm.$delete(vm.jsona,属性名)/
	Vue.delete(vm.jsona,"a")/
	this.$delete(this.jsona,"a")====>删除对象属性
 5. vm.$forceUpdate()/this.$forceUpdate(); 更新==》
	(与updated/beforeUpdate相对较多)     
 	this.$forceUpdate();有时候你会碰到数据已经更新了但是组件还是没有刷新
6.vm.$watch(data,callback[,options])  

7. vm.$nextTick(fn)/this.$nextTick()===>(原生DOM)
 
     this.$nextTick(()=>{
      console.log(this.$el.getElementsByTagName("span")[0].innerHTML)
     })
     
     Vue.nextTick().then(function(){
        console.log(vm.$el.getElementsByTagName("span")[0].innerHTML)
     })

1.在created()钩子函数执行的时候DOM 其实并未进行任何渲染,而此时进行DOM操作无异于徒劳,所以此处一定要将DOM操作的js代码放进Vue.nextTick()的回调函数中。

与之对应的就是beforeMount()、mounted()钩子函数,因为该钩子函数执行时所有的DOM挂载和渲染都已完成,此时在该钩子函数中进行任何DOM操作都不会有问题 。

2.在数据变化后要执行的某个操作,而这个操作需要使用随数据改变而改变的DOM结构的时候,这个操作都应该放进Vue.nextTick()的回调函数中

其他属性和方法(组件)

		$parent
		$children
		$emit
		$on
		$root
		$refs

8.自定义过滤器/自定义指令/自定义键盘信息/解除事件绑定

1.0版 vue过滤器

	https://www.cnblogs.com/crazycode2/p/6736189.html
	capitalize 首字母大写
	uppercase 全部大写
	lowercase 全部小写
	currency 输出金钱以及小数点
	pluralize 输出复数的形式
	debounce 延期执行函数
	limitBy 在 v-for 中使用,限制数量
	filterBy 在 v-for 中使用,选择数据
	orderBy 在 v-for 中使用,排序

2.0版本后,1.0过滤器都废弃,都需自定义
自定义过滤器

<!-- 在双花括号中 -->
	{{ message | capitalize }}

<!-- 在 `v-bind` 中 -->
	<div v-bind:id="rawId | formatId"></div>

    {{msg|toDo("12","5")}}
    
    {{msg|toDoa|toDob}}
    
全局过滤器:Vue.filter('capitalize',function (val){
             let firstcap=val.slice(0,1).toUpperCase();
             let lastcap=val.slice(1);
 
             return firstcap+lastcap;
         })
      
本地过滤器:  filters:{
				capitalize(val){//局部过滤器
					 let firstcap=val.slice(0,1).toUpperCase();
	                 let lastcap=val.slice(1);
	     
	                 return firstcap+lastcap;
				}
			}
		<div id="app">
			{{msg | capitalize('aaa','123')}}
			{{msg | capitalize}}
		</div>
		<div id="app2">
			{{msg | capitalize}}
		</div>
	<script>
//			2.0全局过滤器---->可以作用在任何vue实例上
			 Vue.filter('capitalize',function (val,str="",num=""){
                 let firstcap=val.slice(0,1).toUpperCase();
                 let lastcap=val.slice(1);
     
                 return firstcap+lastcap+str+num;
             })
	        
			var vm=new Vue({
				el:"#app",
				data:{
					msg:"apple"
				},
				methods:{
					
				}
//				,
//				filters:{//局部过滤器--->只能作用在自己的vue实例上
//					capitalize(val,str="",num=""){
//						 let firstcap=val.slice(0,1).toUpperCase();
//		                 let lastcap=val.slice(1);
//		     
//		                 return firstcap+lastcap+str+num;
//					}
//				}
			})
			
			var vm2=new Vue({
				el:"#app2",
				data:{
					msg:"orange"
				},
				methods:{
					
				}
			})
	</script>

注意:过滤器不能用于v-model 等

自定义指令

	    http://www.cnblogs.com/ilovexiaoming/p/6840383.html
	    https://www.jianshu.com/p/c2bef47439ab
	    https://www.imooc.com/article/42891
	    https://blog.csdn.net/Myinlg/article/details/81092974

8.1、自定义指令:使用Vue.directive(id,definition)注册全局自定义指令,使用组件的directives选项注册局部自定义指令。

	Vue.directive(“focus”,{
	    bind:function(){
	    },
	    inserted:function(){
	    },...
	})

简写指令:

在 bind 和 update 钩子上做重复动作,并且不想关心其它的钩子函数
	Vue.directive("focus",function(){
						
		})

8.2、钩子函数:

指令定义函数提供了几个钩子函数(可选):

	bind:只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
	
	inserted:被绑定元素插入DOM(父节点)时调用(父节点存在即可调用,不必存在于 document 中)。
	
	update:第一次是紧跟在 bind 之后调用,获得的参数是绑定的初始值,之后被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
	
	componentUpdated:被绑定元素所在模板完成一次更新周期时调用。
	
	unbind:只调用一次, 指令与元素解绑时调用。

8.3、钩子函数的参数:(el, binding, vnode, oldVnode)

	el:指令所绑定的元素,可以用来直接操作 DOM 。
	
	binding:一个对象,包含以下属性

    name:指令名,不包含v-的前缀;

    value:指令的绑定值;例如:v-my-directive="1+1",value的值是2;

    oldValue:指令绑定的前一个值,仅在update和componentUpdated钩子函数中可用,无论值是否改变都可用;

    expression:绑定值的字符串形式;例如:v-my-directive="1+1",expression的值是'1+1';

    arg:传给指令的参数;例如:v-my-directive:foo,arg的值为 'foo';

    modifiers:一个包含修饰符的对象;例如:v-my-directive.a.b,modifiers的值为{'a':true,'b':true}

	vnode:Vue编译的生成虚拟节点;
	
	oldVnode:上一次的虚拟节点,仅在update和componentUpdated钩子函数中可用。

            <span v-bgcolor="1+1">11111</span>
            
            <h1 v-bgcolor="‘blue’">
				111
			<i>333</i>

全局 简写:(bind update)

    			Vue.directive("bgcolor",function(el,binding,vnode){
				//console.log(el);//设置的目标元素
				//console.log(binding);//设置值的相关信息
//				console.log(binding.value);//2,结果
//				console.log(binding.expression);//1+1 过程
				//console.log(vnode);//所有信息,包含子元素
			
		  		  el.style.background=binding.value;
		})

局部

		directives: {
		  focus: {
		    // 指令的定义
		    inserted: function (el) {
		      el.focus()
		    }
		  }
		}

自定义键盘信息 只有全局

    <input type="text" @keydown.ct="show()"/>
    Vue.config.keyCodes.ct=17;//ctrl

vue.js怎样移除绑定的点击事件

第一种方法一定要加()

第二种方法

	<button v-if="!unbind" v-on:click="addClick">点击</button>
  	<button v-else >点击</button>

然后在data里添加unbind=false属性,需要解绑的时候将其设置为true

9.组件(创建的时候可以用驼峰,使用的时候用- myCom )
组件除了没有el 和 data 变成函数之外,其他的跟new vue一样,还多了一个template,template就相当于new vue的视图

9.1 全局组件

  Vue.component("myCom",{
				data(){
					return{
						msghead:"首页"
					}
				},
				methods:{
					
				},
				template:`<h1>{{this.msghead}}</h1>`
			})

创建模板 :template(如果tempalte内容复杂,可以创建模板)

<template id="footer">
		<div> 多个内容要加div
			<ul>
				<li v-for="v in arr"><a href="">{{v}}</a></li>
			</ul>
			<p>这是尾部组件</p>
		</div>
	</template>
<script type="x-template" id="con">
			<div> 多个内容要加div
			    <h1>中心内容</h1>
			</div>
		</script>
			
		Vue.component("afoot",{   //全局
				template:"#footer"
		})

9.2 局部组件(也可以创建模板,这里没有演示,更全局方法一样)局部组件创建 方法1 Vue.extend({})

	1.var cona=Vue.extend({//来创建组建
				data(){
					return{
						
					}
				},
				methods:{
					
				},
				template:`<h1>xjnsxjnsdxsdx</h1>`
			})
	
			new Vue({
				el:"#box1",
				components:{//挂载
					con:cona
				}
			})

局部组件简写应用:<mycom></mycom>

2.局部组件创建 方法2 直接写在compontents里面

new Vue({
					el:"#box2",
					components:{
						"conb":{
							data(){
								return{
									msg:"hello"
								}
							},
							methods:{
								
							},
							template:`<h1>{{this.msg}}</h1>`
						},
						"conc":{}
					}
				})

3.局部组件创建 方法3 使用{}

var conc={
						data(){
							return{
								
							}
						},
					methods:{
						
					},
					template:`<h1>xjnsxjnsdxsdx</h1>`
				}
			
				new Vue({
					el:"#box1",
					components:{
						con:conc
					}
				})

局部组件简写应用:<mycom></mycom>

9.2.1名称的使用
组件挂载名称========>页面使用
myCom <my-com></my-com>

mycom <mycom></mycom>

9.3组件传参

1.	父组件向子组件传递参数(还可以传递函数)  ====》props
	父组件通过自定义属性的方式传给子组件(:parentmsg=”msg”),子组件用props接受(props:[“parentmsg”])
        <ahead :foo="mag"></ahead>
        
        new Vue({   //父组件
			el:"#box1",
			data:{
				mag:"首页"
			}
		})
		
		Vue.component("ahead",{   //子组件
			props:["foo"],//{}
			template:`<div>
						   <span><</span>
							<i>{{foo}}</i>
							<u>+</u>
					  </div>`
		})

https://segmentfault.com/q/1010000017479096

如果你想看到错误,你要用vue的非压缩版

Vue.component("example", {
				 props: {
				  // 基础类型检测, null意味着任何类型都行
				  propA: Number,
				  // 多种类型
				  propB: [String, Number],
				  // 必传且是String
				  propC: {
				   type: String,
				   required: true
				  },
				  // 数字有默认值
				  propD: {
				   type: Number,
				   default: 101
				  },
				  // 数组、默认值是一个工厂函数返回对象
				  propE: {
				   type: Object,
				   default: function() {
				    console.log("propE default invoked.");
				    return { message: "I am from propE." };
				   }
				  },
				  // 自定义验证函数
				  propF: {
				   isValid(validator): function(value) {return value > 100;
				   }
				  }
				 }
				});

2.子组件向父组件传递参数(还可以传递函数)===》$emit/自定义事件方式

事件绑定机制:父组件通过自定义事件的方式向子组件传递方法(@mymsg=“show”),子组件用this. e m i t ( ) 接 受 ( t h i s . emit()接受(this. emit()(this.emit(fun,参数1,参数2)),参数可以是子组件的,顺便传给父组件,实现子组件向父组件传值

         <aaa @mymsg="get"></aaa>
         
         //子组件
         var a={
				 data(){
						return {
							msg:"子组件数据"
						}
					},
					methods:{
						send(){
							this.$emit('mymsg', this.msg,this.msg2);
						}
					},
					template:`<div>
								<h1>子组件</h1>	
								<input type="button" @click="send()" value="send"/>
							</div>`
				}
			}
		
		
		//父组件
         new Vue({
			el:"#box",
			data:{
				msg:"hello",
				msg2:"world"
			},
			methods:{
				show(m){
					alert(m);
					this.msg2=m;
				}
			},
			components:{
				aaa:a

}
})

3.组件之间相互传参 原生事件法

    var Event=new Vue();
    Event.$emit(自定义事件名,参数1,参数2...)  发送参数
	Event.$on(自定义事件名,()=>{})  接收参数
 全局:
	var Event=new Vue();

	组件1:
	methods:{
				   send(){
							Event.$emit("mymsgone",this.msgone);
						}
				},
	
	 组件2:methods:{
						send(){
							Event.$emit("mymsgtwo",this.msgtwo);
						}
					},
	
     组件3:
	            mounted(){//created(){
						Event.$on("mymsgone",(one)=>{
							console.log(this);
							this.getone=one;
						})
	
	                //console.log(this);
						Event.$on("mymsgtwo",function(two){
							console.log(this);
							this.gettwo=two;
						}.bind(this));					
					},
  1.  $parent 获取父元素的数据/方法
     $root    获取根组件的数据/方法
     $children  获取子元素的数据/方法(mounted钩子函数,要有下标)
     $refs      获取子组件的方法和数据/作用2:获取DOM元素
     (一定要使用 ref属性)
    
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script src="js/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<ahead ref="one"  @click.native="show"></ahead>
			<hr />
			<h1>内容</h1>
			<button @click="getchild">获取子元素</button>
		</div>
		
		<template id="head">
			<div>
				<h1>{{msgh}}</h1>
				{{numh}}
				<button @click="getfar">获取父元素</button>
			</div>
		</template>
		
		<script>
			var ahead={
				data(){
					return{
						msgh:"hahaha,我是头",
						numh:""
					}
				},
				methods:{
					getfar(){
						//console.log(this.$parent.num);
						this.numh=this.$parent.num;
						this.$parent.show();
						
						console.log(this.$root);
						console.log(this.$parent);
					}
				},
				template:"#head"
			}
			var vm=new Vue({
				el:"#app",
				data:{
					num:100,
					arr:[1,2,3,4,5,6],
					str:"hello"
				},
				methods:{
					show(){
						alert("我是父组件");
					},
					getchild(){
						//console.log(this.$children[0].msgh);
						console.log(this.$refs.one);
					}
				},
				components:{
					ahead
				}
			})
		</script>
	</body>
</html>
  1. native 子组件上添加事件(父组件),触发事件,没有.native无法触发无法在组件直接使用事件,需要加修饰符来实现 根元素上监听原生事件
    (把vue组件转化成一个普通的HTML标签,并且对普通的HTML标签是没有任何作用的)

6.为什么组件里的data是函数?
在组件中,因为可能在多处调用同一组件,为了不让多处的组件共享同一data对象,只能返回函数。
data为对象的话会报错,为了理解这种机制,我们假设data为一个对象,那么这同一个对象有可能被很多实例共享,一个实例改变其它也会跟着变,这明显是不对的。而通过data函数,每新建一个实例,都会调用data来return一组新的原始数据。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script src="js/vue.min.js"></script>
	</head>
	<body>
		<div id="app">
			<zfoot></zfoot>
			<hr />
			<zfoot></zfoot>
			<hr />
			<zfoot></zfoot>
			<hr />
			<zfoot></zfoot>
		</div>
		
		<template id="foot">
			<div>
				{{num}}
				<button @click="num++">add</button>
			</div>
		</template>
		
		<script>
			var obj={num:10};
//				data:{
//					num:10
//				}
			
			var zfoot={
				data(){
					return obj;
//					return {
//						num:10
//					}
				},
				methods:{
				},
				template:"#foot"
			};
			
			
			var vm=new Vue({
				el:"#app",
				data:{
				
				},
				components:{
					zfoot
				}
			})
		</script>
		

	</body>
</html>
  1. 插槽v-sort (3种)https://segmentfault.com/a/1190000012996217?utm_source=tag-newest

    slot以前2.6.0以后v-slot,vue3以前的slot被废弃

     1.普通插槽
         <aaa>
      		<h1>1111111</h1>
         </aaa>
         
         <template id="one">
      		<div>
      			<h3>{{m}}</h3>
      			<slot></slot>
      			<h5>{{myOne}}</h5>
      		</div>
        </template>
     2.有名插槽(有name属性)
    
         <aaa>
      		<h1>1111111</h1>
      		<p slot="aa">pppp</p>
         </aaa>
         
         <template id="one">
      		<div>
      		    <slot name="aa"></slot>
      			<h3>{{m}}</h3>
      			<slot></slot>
      			<h5>{{myOne}}</h5>
      		</div>
        </template>
        
        新:
         <aaa>
            <template v-slot:aa>
      		<p>pppp</p>
      	  </template>
         </aaa>
         
         <template id="one">
      		<div>
      		    <slot name="aa"></slot>
      			<h3>{{m}}</h3>
      			<h5>{{myOne}}</h5>
      		</div>
        </template>
        
     3.作用域插槽
         1.自定义属性(带数据的插槽)
         2.使用template 
         3.slot-scope/v-slot
    
<div id="box">
			<aaa>
                <template slot-scope="user">
			        <ul>
			          <li v-for="item in user.da">{{item}}</li>
			        </ul>
			    </template>
								        新版:
							 <template v-slot:default="user">   
								  <ul>
			                       <li v-for="item in user.da">{{item}}</li>
			                     </ul>
							 </template>
			</aaa>
		</div>
		<template id="one">
			<div>
		         <h1>{{m}}</h1>
		         <slot  :da="test"></slot>
			</div>
		</template>
		<script>
			new Vue({
				el:"#box",
				data:{
				},
				components:{
					"aaa":{
						template:"#one",
						data(){
							return {
								test:[1,2,3,4]
							}
						}
					}
				}
			})
		</script>

10.组件的切换效果

	<div id="box">
		<input type="button" @click="a='aaa'" value="aaa"/>
		<input type="button" @click="a='bbb'" value="bbb"/>
		<component :is="a"></component>
 	</div>
new Vue({
			el:'#box',
			data:{
				a:"aaa"
			},
			components:{
				"aaa":{
					template:"<h1>aaa</h1>"
				},
				"bbb":{
					template:"<h1>bbb</h1>"
				}
			}
		});

10.动画

	https://cn.vuejs.org/v2/guide/transitions.html
	https://cloud.tencent.com/developer/article/1468992
	https://segmentfault.com/q/1010000007738500

10.1使用过渡类名

v-enter:定义进入过渡的开始状态。在元素被插入之前生效,在元素被插入之后的下一帧移除。
v-enter-active:定义进入过渡生效时的状态。在整个进入过渡的阶段中应用,在元素被插入之前生效,在过渡/动画完成之后移除。这个类可以被用来定义进入过渡的过程时间,延迟和曲线函数。
v-enter-to: 2.1.8版及以上 定义进入过渡的结束状态。在元素被插入之后下一帧生效 (与此同时 v-enter 被移除),在过渡/动画完成之后移除。
v-leave: 定义离开过渡的开始状态。在离开过渡被触发时立刻生效,下一帧被移除。
v-leave-active:定义离开过渡生效时的状态。在整个离开过渡的阶段中应用,在离开过渡被触发时立刻生效,在过渡/动画完成之后移除。这个类可以被用来定义离开过渡的过程时间,延迟和曲线函数。
v-leave-to: 2.1.8版及以上 定义离开过渡的结束状态。在离开过渡被触发之后下一帧生效 (与此同时 v-leave 被删除),在过渡/动画完成之后移除。
  1. HTML结构:
    使用name="fade"属性,来设置多个动画的名称
	<div id="app">
	    <input type="button" value="动起来" @click="myAnimate">
	    <!-- 使用 transition 将需要过渡的元素包裹起来 -->
	    <transition name="fade">
	      <div v-show="isshow">动画哦</div>
	    </transition>
	  </div>
  1. VM 实例:
    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
    el: ‘#app’,
    data: {
    isshow: false
    },
    methods: {
    myAnimate() {
    this.isshow = !this.isshow;
    }
    }
    });
    2.定义两组类样式:

/* 定义进入和离开时候的过渡状态 */
.fade-enter-active,
.fade-leave-active {
transition: all 0.2s ease;
position: absolute;
}

/* 定义进入过渡的开始状态 和 离开过渡的结束状态 */
.fade-enter,
.fade-leave-to {
  opacity: 0;
  transform: translateX(100px);
}

10.2 使用第三方 CSS 动画库
duration:过渡持续时间 (以毫秒计)

https://www.cnblogs.com/cntian/p/13292041.html
注意:vue 和 animate.css 版本兼容性问题导致动画不起作用
Vue 官网引用的是 animate.css 3.5 版本
不能引用 animate.css 最新版本 例如:(4.0)

yarn add animate.css(添加)/ yarn remove animate.css(删除)
https://blog.csdn.net/yunchong_zhao/article/details/107207600

Vue-cli

  1. 安装 npm i animate.css@3.7.2 yarn add animate.css@3.7.2

  2. 导入
    //引入animate.css
    import animated from ‘animate.css’
    //使用animated
    Vue.use(animated)

    3.重新启动项目 npm run serve / yarn serve

    4.按官网规则使用

https://www.worldlink.com.cn/osdir/animatecss.html
https://www.cnblogs.com/fang-1207/p/animationfang.html

  1. 导入动画类库:
2. 定义 transition 及属性:
动画哦

注意:同时使用过渡和动画

但是,在一些场景中,你需要给同一个元素同时设置两种过渡动效,比如 animation 很快的被触发并完成了,而 transition 效果还没结束。在这种情况中,你就需要使用 type 特性并设置 animation 或 transition 来明确声明你需要 Vue 监听的类型。
https://www.haoht123.com/2330.html

10.3使用动画钩子函数(半场动画)
https://blog.csdn.net/weixin_30423977/article/details/95577829
v-on:before-enter=“beforeEnter”入场动画之前执行beforeEnter方法
v-on:enter=“enter”入场过程中执行的方法
v-on:after-enter=“afterEnter”入场后执行的方法
v-on:enter-cancelled=“enterCancelled”入场动画取消的时候执行方法(进入取消)进入过渡被打断时
v-on:before-leave=“beforeLeave”离场动画之前执行beforeLeave方法
v-on:leave=“leave”离场动画过程中执行的方法
v-on:after-leave=“afterLeave”离场结束后执行的方法
v-on:leave-cancelled=“leaveCancelled”离场动画取消时执行的方法离开过渡被打断时

  1. 定义 transition 组件以及三个钩子函数:

10.4 可以通过 appear 特性设置节点在初始渲染的过渡(页面入场效果)

  • {{item}}
  • 10.5 过渡模式 in-out:新元素先进行过渡,完成之后当前元素过渡离开。 out-in:当前元素先进行过渡,完成之后新元素过渡进入。

    <button @click=“md=‘aa’”>a
    <button @click=“md=‘bb’”>b
    <button @click=“md=‘cc’”>c

    		<transition name="bbb"   mode="out-in">
    		  <component :is="md"></component>
    		</transition>
    

    10.6 v-for 的列表过渡

    1. 定义过渡样式:
    1. 定义DOM结构,其中,需要使用 transition-group 组件把v-for循环的列表包裹起来:
    3. 定义 VM中的结构: // 创建 Vue 实例,得到 ViewModel var vm = new Vue({ el: '#app', data: { txt: '', list: [1, 2, 3, 4] }, methods: { add() { this.list.push(this.txt); this.txt = ''; } } });

    10.7 列表的排序过渡

    默认转化为span,通过tag属性转化成为其他标签

    <transition-group> 组件还有一个特殊之处。不仅可以进入和离开动画,还可以改变定位。要使用这个新功能只需了解新增的 v-move 特性,它会在元素的改变定位的过程中应用
    v-movev-leave-active 结合使用,能够让列表的过渡更加平缓柔和:
    .v-move{
    transition: all 0.8s ease;
    }
    .v-leave-active{
    position: absolute;
    }

    11.路由 https://router.vuejs.org/zh/

    什么是路由(https://blog.csdn.net/aaaaa1994/article/details/88294681)

    1. 对于普通的网站,所有的超链接都是URL地址,所有的URL地址都对应服务器上对应的资源;

    2. 对于单页面应用程序来说,主要通过URL中的hash(#号)来实现不同页面之间的切换,同时,hash有一个特点:HTTP请求中不会包含hash相关的内容;所以,单页面程序中的页面跳转主要用hash实现.

    3. 在单页面应用程序中,这种通过hash改变来切换页面的方式,称作前端路由(区别于后端路由);

    11.1在 vue 中使用 vue-router

    1. 导入 vue-router 组件类库:
    1. 使用 router-link 组件来导航

    登录
    注册

    1. 使用 router-view 组件来显示匹配到的组件

    1. 创建使用Vue.extend创建组件
      // 4.1 使用 Vue.extend 来创建登录组件
      var login = Vue.extend({
      template: ‘

      登录组件


      });

      // 4.2 使用 Vue.extend 来创建注册组件
      var register = Vue.extend({
      template: ‘

      注册组件


      });

    2. 创建一个路由 router 实例,通过 routers 属性来定义路由匹配规则
      // 5. 创建一个路由 router 实例,通过 routers 属性来定义路由匹配规则
      var router = new VueRouter({
      routes: [
      { path: ‘/login’, component: login },
      { path: ‘/register’, component: register }
      ]
      });

    3. 使用 router 属性来使用路由规则
      // 6. 创建 Vue 实例,得到 ViewModel
      var vm = new Vue({
      el: ‘#app’,
      router: router // 使用 router 属性来使用路由规则

    简写:router
    });

    11.2 设置路由高亮和重定向

    1. .router-link-active{
      color: red;
      font-weight: 800;
      font-style: italic;
      font-size: 80px;
      text-decoration: underline;
      background-color: green;
      }
      2…myactive {
      color: red;
      font-weight: 800;
      font-style: italic;
      font-size: 80px;
      text-decoration: underline;
      background-color: green;
      }

    var routerObj = new VueRouter({
    routes: [
    // { path: ‘/’, component: login },
    { path: ‘/’, redirect: ‘/login’ }, //路由重定向/的页面
    { path: ‘*’, redirect: ‘/login’ }, //路由重定向所有页面
    { path: ‘/login’, component: login },
    { path: ‘/register’, component: register }
    ],
    linkActiveClass: ‘myactive’//统一设置一个class,二级路由也可以用
    })

    1. const router = new Router({
      routes: [
      {
      path: “/”,
      name: “首页”,
      redirect: ‘/home’
      },
      {
      path: ‘/login’,
      name: ‘Login’,
      component: Login
      },
      { path: ‘*’, component: NotFoundComponent }
      ],
      linkActiveClass: “active-router”,
      //模糊匹配 /user /user/1 /user/aa=1
      linkExactActiveClass: “exact-router”//精准匹配 /user
      })
      https://blog.csdn.net/meikaied/article/details/85322278

    11.3使用别名(alias)和给router-link修改原来的默认标签

    Alias
    {path:"/login",component:Login,alias:’/lo’}

    router-link原来的默认标签是,通过 tag=”span” 修改
    登陆页面

    11.4 设置路由切换动效

    .v-enter,
    .v-leave-to {
      opacity: 0;
      transform: translateX(140px);
    }
    
    .v-enter-active,
    .v-leave-active {
      transition: all 0.5s ease;
    }
    



    11.5 vue-router 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载。
    如果不想要很丑的 hash,我们可以用路由的 history 模式,这种模式充分利用 history.pushState API 来完成 URL 跳转而无须重新加载页面
    const router = new VueRouter({
    mode: ‘history’,
    routes: […]
    })

    11.6 在路由规则中定义参数(动态路由)

    Query:
    登录
    1.在规则中定义参数:
    { path: ‘/login’, component: login }

    1. 通过 this.$route.query来获取路由中的参数:
      var register = Vue.extend({
      template: <h1>登录 --- {{ this.$route.query.id }} --- {{ $route.query.name }}</h1>//this可以加可以不加

      });

    //methods里必须加this

    Params:
    登录

    1. 在规则中定义参数:
      { path: ‘/register/:id’, component: register }
    2. 通过 this.$route.params来获取路由中的参数:
      var register = Vue.extend({
      data(){
      return{
      aid:""
      }
      },
      created(){
      this.show();
      },
      methods:{
      show(){
      //console.log(this. r o u t e . p a r a m s . i d ) ; t h i s . a i d = t h i s . route.params.id); this.aid=this. route.params.id);this.aid=this.route.params.id;//必须加this
      }
      },
      template: <h1>注册组件 --- {{$route.params.id/this.$route.params.id}}</h1>
      //this可以加可以不加
      });

    11.7 r o u t e 和 route和 routerouter路由跳转https://www.jianshu.com/p/fa0b5d919615
    https://www.cnblogs.com/hwldyz/p/9204346.html
    1 $route
    1.1 r o u t e 表 示 ( 当 前 路 由 信 息 对 象 ) 表 示 当 前 激 活 的 路 由 的 状 态 信 息 , 包 含 了 当 前 U R L 解 析 得 到 的 信 息 , 还 有 U R L 匹 配 到 的 r o u t e r e c o r d s ( 路 由 记 录 ) 。 路 由 信 息 对 象 : 即 route 表示(当前路由信息对象) 表示当前激活的路由的状态信息,包含了当前 URL 解析得到的信息,还有 URL 匹配到的 route records(路由记录)。 路由信息对象:即 route()URLURLrouterecordsroute会被注入每个组件中,可以利用它进行一些信息的获取。
    1. r o u t e . p a t h ∗ ∗ 字 符 串 , 对 应 当 前 路 由 的 路 径 , 总 是 解 析 为 绝 对 路 径 , 如 " / f o o / b a r " 。 ∗ ∗ 2. route.path** 字符串,对应当前路由的路径,总是解析为绝对路径,如 "/foo/bar"。 **2. route.path"/foo/bar"2.route.params
    一个 key/value 对象,包含了 动态片段 和 全匹配片段,
    如果没有路由参数,就是一个空对象。
    3.$route.query
    一个 key/value 对象,表示 URL 查询参数。
    例如,对于路径 /foo?user=1,则有 r o u t e . q u e r y . u s e r = = 1 , 如 果 没 有 查 询 参 数 , 则 是 个 空 对 象 。 ∗ ∗ 4. route.query.user == 1, 如果没有查询参数,则是个空对象。 **4. route.query.user==14.route.hash**
    当前路由的 hash 值 (不带 #) ,如果没有 hash 值,则为空字符串。锚点
    5. r o u t e . f u l l P a t h ∗ ∗ 完 成 解 析 后 的 U R L , 包 含 查 询 参 数 和 h a s h 的 完 整 路 径 。 ∗ ∗ 6. route.fullPath** 完成解析后的 URL,包含查询参数和 hash 的完整路径。 **6. route.fullPathURLhash6.route.matched
    数组,包含当前匹配的路径中所包含的所有片段所对应的配置参数对象。
    **7. r o u t e . n a m e 当 前 路 径 名 字 ∗ ∗ ∗ ∗ 8. route.name 当前路径名字** **8. route.name8.route.meta 路由元信息

    1.2. route object 出现在多个地方:
    (1)在组件内,即 this.$route
    (2)在 $route 观察者回调内 router.match(location) 的返回值
    (3)导航守卫的参数:
    router.beforeEach((to, from, next) => {
    // to 和 from 都是 路由信息对象
    })
    watch: {
    $route(to, from) {
    // to 和 from 都是 路由信息对象
    }
    }

    1. $router对象
      全局的路由实例,是router构造方法的实例。
      在 Vue 实例内部,你可以通过 r o u t e r 访 问 路 由 实 例 2.1 全 局 挂 载 路 由 实 例 / / 全 局 注 册 的 路 由 V u e . u s e ( V u e R o u t e r ) 2.2 路 由 实 例 方 法 p u s h h t t p s : / / b l o g . c s d n . n e t / w e i x i n 3 8199437 / a r t i c l e / d e t a i l s / 83030010 / / 字 符 串 t h i s . router 访问路由实例 2.1 全局挂载路由实例 // 全局注册的路由 Vue.use(VueRouter) 2.2 路由实例方法push https://blog.csdn.net/weixin_38199437/article/details/83030010 // 字符串 this. router访2.1//Vue.use(VueRouter)2.2pushhttps://blog.csdn.net/weixin38199437/article/details/83030010//this.router.push(‘home’)// 对象
      this. r o u t e r . p u s h ( p a t h : ′ h o m e ′ ) / / 命 名 的 路 由 t h i s . router.push({ path: 'home' })// 命名的路由 this. router.push(path:home)//this.router.push({ name: ‘user’, params: { userId: 123 }})// 带查询参数,变成 /register?plan=123
      this. r o u t e r . p u s h ( p a t h : ′ r e g i s t e r ′ , q u e r y : p l a n : ′ 12 3 ′ ) p u s h 方 法 其 实 和 < r o u t e r − l i n k t o = " . . . " > 是 等 同 的 。 注 意 : p u s h 方 法 的 跳 转 会 向 h i s t o r y 栈 添 加 一 个 新 的 记 录 , 当 我 们 点 击 浏 览 器 的 返 回 按 钮 时 可 以 看 到 之 前 的 页 面 。 2.2 路 由 实 例 方 法 g o / / 页 面 路 由 跳 转 前 进 或 者 后 退 t h i s . router.push({ path: 'register', query: { plan: '123' }}) push方法其实和<router-link to="...">是等同的。 注意:push方法的跳转会向 history 栈添加一个新的记录,当我们点击浏览器的返回按钮时可以看到之前的页面。 2.2 路由实例方法go // 页面路由跳转 前进或者后退this. router.push(path:register,query:plan:123)push<routerlinkto="...">pushhistory2.2go//退this.router.go(-1) // 后退
      this. r o u t e r . g o ( 0 ) / / 刷 新 t h i s . router.go(0)//刷新 this. router.go(0)//this.router.go(1)//前进
      this.$router.go(3)//前进3步
      2.3 路由实例方法replace
      //push方法会向 history 栈添加一个新的记录,而replace方法是替换当前的页面,不会向 history 栈添加一个新的记录

    05

    // 一般使用replace来做404页面
    this.$router.replace(’/’)

    11.8 使用 children 属性实现路由嵌套(二级路由)
    https://www.cnblogs.com/lwming/p/11282674.html

    Account

    11.9命名路由
    有时候,通过一个名称来标识一个路由显得更方便一些,特别是在链接一个路由,或者是执行一些跳转的时候。你可以在创建 Router 实例的时候,在 routes 配置中给某个路由设置名称。

    const router = new VueRouter({
    routes: [
    {
    path: ‘/user/:userId’,
    name: ‘user’,
    component: User
    }
    ]
    })
    要链接到一个命名路由,可以给 router-link 的 to 属性传一个对象:

    User
    这跟代码调用 router.push() 是一回事:

    router.push({ name: ‘user’, params: { userId: 123 }})
    这两种方式都会把路由导航到 /user/123 路径。

    11.10响应路由参数的变化
    提醒一下,当使用路由参数时,例如从 /user/foo 导航到 /user/bar,原来的组件实例会被复用。因为两个路由都渲染同个组件,比起销毁再创建,复用则显得更加高效。不过,这也意味着组件的生命周期钩子不会再被调用。

    复用组件时,想对路由参数的变化作出响应的话,你可以简单地 watch (监测变化) $route 对象:

    const User = {
    template: ‘…’,
    watch: {
    ‘$route’ (to, from) {
    // 对路由变化作出响应…
    }
    }
    }
    或者使用 2.2 中引入的 beforeRouteUpdate 导航守卫:

    const User = {
    template: ‘…’,
    beforeRouteUpdate (to, from, next) {
    // react to route changes…
    // don’t forget to call next()
    }
    }

    11.11 命名视图实现经典布局(组件复用)

    1. 标签代码结构:
    1. JS代码:
    1. CSS 样式:

    11.12路由进阶https://router.vuejs.org/zh/guide/advanced/navigation-guards.html

    路由懒加载
    https://www.cnblogs.com/yzq-fighting/p/7731545.html https://blog.csdn.net/mzrxLXR/article/details/81484676

    使用Bootstrap
    https://www.cnblogs.com/shengnan-2017/p/8094134.html

    12.vue-cli 2.0
    https://cli.vuejs.org/guide/installation.html----》3.0
    https://www.cnblogs.com/blcorder/p/12015715.html—》4.0

    1.只在本电脑安装一次
    1.安装nodejs(https://nodejs.org/en/) 验证 node -v(version) 使用npm
    2.安装vue npm install vue
    3.安装vue-cli npm install vue-cli -g 验证 vue -V 使用vue

    2.多次使用 ===>创建工程
    本身集成很多项目模板:
    simple 个人觉得一点用都没有
    webpack 可以使用(大型项目)
    Eslint 检查代码规范,
    单元测试
    webpack-simple 个人推荐使用, 没有代码检查 √

    		browserify	->  自己看
    		browserify-simple
    		
    		
    	cd C:\Users\admin\Desktop\vuecli	
        
        切换到G:盘      G:
        打开vueaa文件夹   cd vueaa
        返回上级目录  cd..
    		
    	4.vue init webpack vuethree   创建项目
    	5.cd vuethree
    	6.npm run dev
    	
    	4.vue init webpack-simple vuethree   创建项目
    	5.cd vuethree
    	6.npm install
    	7.npm run dev
    

    3.想要安装 vue-resource====》使用

    	1.cd C:\Users\admin\Desktop\vuecli\vuethree
    	2.npm install vue-resource --save
    	3.npm run dev
    	4.打开main.js
    	          写入:import  VueResource  from 'vue-resource'
    	         Vue.use(VueResource) 
    

    4 vue-cli使用插件
    –save 和 --save -dev 的区别
    https://blog.csdn.net/sunhuaqiang1/article/details/85249656

    1.按装插件 npm install vue-resource --save(生产环境)/–save -dev(开发环境) /空
    2.先引入,在use
    import vueResource from ‘vue-resource’
    Vue.use(vueResource)
    3.看文档,使用

    5.变化
    index.html ====>Index.vue

    	template--->html
    	script---->js
    	style---->css
    

    axios

    https://www.kancloud.cn/yunye/axios/234845

    keep-alive https://www.jianshu.com/p/4b55d312d297
    https://juejin.im/post/5a69894a518825733b0f12f2

    时间插件
    http://momentjs.cn/
    Npm install moment -S import moment from “moment”
    import moment from ‘moment’
    Vue.filter(‘dateFormat’, function (dataStr, pattern = “YYYY-MM-DD HH:mm:ss”) {
    return moment(dataStr).format(pattern)
    })

    配置全局请求网址前半部分
    Vue.http.options.root = ‘http://vue.studyit.io’;

    Mock数据
    Iview 主要是写后台管理系统
    Reset-css https://www.npmjs.com/package/reset-css
    import “reset-css”
    初始化样式设置

    环境配置
    1.Nodejs
    2.mySQL https://dev.mysql.com/downloads/mysql/5.1.html#downloads
    配置和安装 https://blog.csdn.net/qq_37350706/article/details/81707862#%E5%85%88%E5%8E%BB%E5%AE%98%E7%BD%91%E4%B8%8B%E8%BD%BD%E7%82%B9%E5%87%BB%E7%9A%84MySQL%E7%9A%84%E4%B8%8B%E8%BD%BD%E2%80%8B
    初始账号和密码 root@localhost: >arjf*ayq30S

    其他
    设置密码https://blog.csdn.net/numberseven7/article/details/99548745
    查看是否有sql服务 sc query mysql
    删除重新创建https://www.cnblogs.com/zhaocundang/p/8540746.html
    端口占用https://blog.csdn.net/qq_32332777/article/details/89359661
    2059错误链接https://blog.csdn.net/Long861774/article/details/82701487

    3.Navicat Premium 12
    4.启动服务node app.js
    5.构建页面 写项目

    安装yarn(https://classic.yarnpkg.com/zh-Hans/docs/usage)
    npm install -g yarn
    查看版本:yarn --version

    Vue 如何使用 swiper
    (npm命令https://blog.csdn.net/qq407949480/article/details/79988354)

    1. 6.0.0 版本以上,会存在一些功能失效的问题
      以下是使用规则:https://github.com/surmon-china/vue-awesome-swiper

    2.换成低版本
    你已经运行了下面命令
    npm install swiper vue-awesome-swiper --save

    or

    yarn add swiper vue-awesome-swiper

    解决:yarn add swiper@^5.2.0 npm install swiper@^5.2.0 --save

    在 main.js中添加
    import VueAwesomeSwiper from ‘vue-awesome-swiper’
    import ‘swiper/css/swiper.css’
    Vue.use(VueAwesomeSwiper, /* { default global options } */)

    使用:

    http://a.itying.com/upload/20180417/1523969206225.jpg
    循环加载图片https://www.cnblogs.com/SamWeb/p/8519735.html

    Axios
    http://www.axios-js.com/
    https://www.jianshu.com/p/e36956dc78b8
    1.安装
    npm install axios
    cnpm install axios
    yarn add axios
    2.在 mian.js 中引入
    import axios from ‘axios’
    3.在 mian.js 中配置(还有其他配置,这里没讲)
    Vue.prototype. h t t p = a x i o s 4. 使 用 t h i s . http= axios 4.使用 this. http=axios4.使this.http
    methods: {
    show() {
    this.$http({
    method: ‘get’,
    url: ‘/user’,
    data: {
    name: ‘virus’
    }
    })
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值