zoukankan      html  css  js  c++  java
  • 10.vue框架

    vue框架
    易用、灵活、高效

    https://cn.vuejs.org/

    mvc

    M model 数据 模型

    V view 视图 dom操作

    C controller 控制器 路由

    C

    oBtn.onclick = function(){
    		$.ajax(...
    		
    			success:function(data){//data M
    			
    					//DOM操作  V
    				
    			}
    		);
    }
    

    mvc mvvm mvp mv*

    http://www.ruanyifeng.com/blog/2015/02/mvcmvp_mvvm.html


    指令

    v-开头的自定义属性

    v-model 数据
    v-text 纯文本 简写 {{数据}}
    v-html 会转义html标签

    exp:

    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>无标题文档</title>
    <script src="vue.js"></script>
    <script>
    
    window.onload = function(){
    	var vm = new Vue({
    		el:"#div1", //选择器
    		data:{
    			a:"abc"	//定义
    		}
    	});
    };
    
    </script>
    </head>
    
    <body>
    
    <div id="div1">
        <input v-model="a" type="text" value=""/><br />
        <span v-text="a"></span> <br />
         <span v-html="a"></span> <br />
        {{a}}
    </div>
    </body>
    </html>
    
    
    v-text/{{}}区别

    {{}} 如果使用过程中出现错误,会显示花括号, v-text不会显

    想要不想显示{{}}
    1、把所有的{{}}——> v-text 不推荐
    2、v-cloak 需要和样式进行配合
    外层div设置[v-cloak]{display:none;}

    网络延迟的问题也会显示 {{}}

    如果在使用vue的过程中没有出现错误,vue会把v-cloak给删除

    推荐用花括号 {{xxx}}


    v-bind 操纵属性
    注意: el不能选择body或者html

    v-bind:
    属性名称="值" 简写 :属性名称="值"
    跟对象:v-bind="对象"


    data:{
    	a:"200px; heigth:200px;background:red"
    }
    
    v-bind:style="a"
    v-bind:style="'200px; heigth:200px;background:red'"
    
    json
    
    v-bind:style="{'200px', heigth:'200px',;background:'red'}"
    
    
    数组
    
    data:{
    	{"200px"},
    	heigth:{heigth:"200px"},
    	background:{background:"200px"},
    }
    v-bind:style="[width,height,background]"
    

    class

    data:{
    	a:"box1 box2 box3"
    }
    
    v-bind:class="a"
    v-bind:class="'box1 box2 box3'"
    
    json: 必须跟布尔值
    data:{
    	box1:true,
    	box2:false,
    	box3:"dsafsa"
    }
    v-bind:class="{box1:box1,box2:box2,box3:box3}"
    
    数组,元素是变量名
    data:{
    	box1:"box1",
    	box2:"box2",
    	box3:"abc"
    }
    v-bind:class="[box1,box2,box3]"
    

    方法:

    methods:{
    		方法名(){
    		
    		}
    }
    

    事件:

    v-on:click="方法名" 简写 @click="方法名"

    显示隐藏:

    v-show: 控制的是style:none/block
    v-if: 控制的真实dom节点的创建和删除


    v-if 条件判断

    v-if
    v-else-if
    v-else

    exp:

    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>无标题文档</title>
    <style>
    #div1{200px; height:200px; background:#ccc;}
    </style>
    <script src="vue.js"></script>
    
    </head>
    <body>
    
    <div id="app">
    	<span v-if="a==1">1</span>
    	<span v-else-if="a==2">2</span>
    	<span v-else>其他</span>
    </div>
    <script>
    var vm = new Vue({
    	el:"#app",
    	data:{
    		a:1
    	}	
    });
    </script>
    </body>
    </html>
    

    循环:v-for/v-of

    数组

    v-for="item in arr"
    v-for="(v,k) in arr"
    v-for="v,k in arr"
    exp:

    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>无标题文档</title>
    <style>
    #div1{200px; height:200px; background:#ccc;}
    </style>
    <script src="vue.js"></script>
    <script>
    /*
    for in
    for of
    */
    window.onload = function(){
    	var vm = new Vue({
    		el:"#app",
    		data:{
    			arr:["aaa","bbb","ccc"]
    		}
    	});
    }; 
    
    </script>
    </head>
    
    <body>
    
    <div id="app">
    	<ul>
        	<li v-for="item in arr">{{item}}</li>
        </ul>
    	<ul>
        	<li v-for="item of arr">{{item}}</li>
        </ul>
    	
    </div>
    
    </body>
    </html>
    

    res:
    image

    对象

    v-for="item in json"
    v-for="(v,k,i) in json"
    v-for="v,k,i in json"

    exp:

    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>无标题文档</title>
    <style>
    #div1{200px; height:200px; background:#ccc;}
    </style>
    <script src="vue.js"></script>
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
    <script>
    /*
    for in
    for of
    */
    window.onload = function(){
    	var vm = new Vue({
    		el:"#app",
    		data:{
    			json:{
    				name:"翠花",
    				age:18,
    				sex:0	
    			}
    		}
    	});
    }; 
    
    </script>
    </head>
    
    <body>
    
    <div id="app">
    	<ul>
        	<li v-for="item in json">{{item}}</li>
        </ul>
    	<ul>
        	<li v-for="v,k,i of json">{{v}}----{{k}}----{{i}}</li>
        </ul>
    	 
    </div>
    
    </body>
    </html>
    

    res:
    image


    数据更新

    数组

    arr.push/pop/shift/unshift/splice....

    直接操纵索引 无效 vm.arr[index] = xxxx;

    vm.$set(vm.arr/json,index/key,value);
    Vue.set(vm.arr/json,index/key,value);

    vm.arr[index] = xxxx; 无效
    强制更新:
    vm.$forceUpdate();

    对象

    必须先定义 再修改!


    事件对象

    @click="函数名" 事件函数的第一个参数就是事件对象ev
    @click="函数名($event)" 在函数里面可以直接使用ev

    exp:

    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>无标题文档</title>
    <script src="vue.js"></script>
    <script>
    window.onload = function(){
    	var vm = new Vue({
    		el:"#app",
    		data:{},
    		methods:{
    			show(ev){
    				alert(ev.clientX);	
    			}	
    		}
    		
    	});
    };
    </script>
    </head>
    
    <body>
    <div id="app">
    	<input @click="show($event)" type="button" value="按钮" />
    </div>
    
    </body>
    </html>
    
    原生

    onclick="show(event)"


    冒泡:

    子元素的事件可以传播到父元素上,最终传播到document

    var oEvent = ev || event;
    oEvent.cancelBubble = true;
    oEvent.stopPropagation();
    
    vue阻止事件冒泡:

    @click.stop="btn"

    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>无标题文档</title>
    <script src="vue.js"></script>
    <script>
    window.onload = function(){
    	var vm = new Vue({
    		el:"#app",
    		data:{},
    		methods:{
    			div(){
    				alert("div");	
    			},
    			btn(){
    				//var oEvent = ev || event;
    				//oEvent.cancelBubble = true;
    				//oEvent.stopPropagation();
    				alert("btn");
    			}	
    		}	
    	});	
    };
    </script>
    </head>
    
    <body>
    
    <div id="app">
    	<div id="div1" @click="div" >
        	div1
        	<input @click.stop="btn" type="button" value="按钮" />
        </div>
    </div>
    
    </body>
    </html>
    
    默认事件

    浏览器自带的行为就是默认事件

    原生:
    ev.preventDefault();
    //return false;
    
    vue:
    (原生和.prevent都可以)
    @click.prevent="show"
    
    vue阻止默认事件:

    @click.prevent="show"

    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>无标题文档</title>
    <script src="vue.js"></script>
    <script>
    window.onload = function(){
    	var vm = new Vue({
    		el:"#app",
    		data:{},
    		methods:{
    			show(ev){
    				alert(1);
    				//ev.preventDefault();
    				//return false;
    			} 
    		}	
    	});	
    };
    </script>
    </head>
    
    <body>
    
    <div id="app">
    <!--vue阻止默认事件-->
    	<a @click.prevent="show" href="http://www.baidu.com/">百度</a>
    </div>
    
    </body>
    </html>
    
    事件修饰符:

    https://cn.vuejs.org/v2/guide/events.html

    exp:

    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>无标题文档</title>
    <script src="vue.js"></script>
    <script>
    Vue.config.keyCodes.enter = 37;将将回车设成37
    window.onload = function(){
    	var vm = new Vue({
    		el:"#app",
    		data:{},
    		methods:{
    			left(){
    				 alert("left");
    			},
    			right(){
    				 alert("right");
    			} 
    		}	
    	});	
    };
    </script>
    </head>
    
    <body>
    
    <div id="app">
    	 <!--
    	 @click.left鼠标左键,
    	 @click.right鼠标右键,
    	 @click.right.prevent阻止右键默认事件
    	 -->
    	<input @click.left="left" type="button" value="left" />
    	<input @click.right.prevent="right" type="button" value="right" />
       
    </div>
    
    </body>
    </html>
    

    模板:template

    模板里面只能有一个根节点,不能有兄弟节点

    new Vue({
    	template:" 选择器"、oTmp
    });
    
    <div id="tmp" style="display:none">
    	模板内容
    </div>
    
    <template id="tmp" >
    	模板内容
    </template>
    
    
    
    type="text/x-template" 
    type="x-template" 
    
    <script id="tmp" type="text/x-template" >
    	模板内容
    </script>
    

    生命周期 【created/mounted】/updated/destroyed

    https://cn.vuejs.org/v2/guide/instance.html#生命周期图示

    8 个函数

    1、初始化

    vm.beforeCreate 没有 $el/$data
    vm.created 没有 $el 有 $data

    2、挂载

    vm.beforeMount 有 $el 原始dom 有 $data
    vm.mounted 有 $el 虚拟dom 有 $data

    3、数据更新

    vm.beforeUpdate
    vm.updated

    4、销毁

    vm.beforeDestroy
    vm.destroyed

    生命周期图示

    下图展示了实例的生命周期。你不需要立马弄明白所有的东西,不过随着你的不断学习和使用,它的参考价值会越来越高。
    image

    exp:

    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>无标题文档</title>
    <script src="vue.js"></script>
    </head>
    <body>
    <div id="app">
    	 
    </div>
    <script>
    var vm = new Vue({
    	//el:"#app",
    	data:{a:12,b:5},
    	template:`<span> {{a}}---{{b}}</span>`,
    	beforeCreate(){// undefined   undefined
    		console.log("beforeCreate",this.$el,this.$data);	
    	},
    	created(){//undefined {数据}
    		console.log("created",this.$el,this.$data);	
    	},
    	beforeMount(){ //原始dom  {数据}  
    		console.log("beforeMount",this.$el,this.$data);	
    	},
    	mounted(){//虚拟dom {数据} 
    		console.log("mounted",this.$el,this.$data);	
    	},
    	//vm.a = xxxx;
    	beforeUpdate(){
    		console.log("beforeUpdate");	
    	},
    	updated(){
    		console.log("updated");	
    	},
    	////vm.$destroy();
    	beforeDestroy(){
    		console.log("beforeDestroy");	
    	},
    	destroyed(){
    		console.log("destroyed");	
    	},
    
    });
    
    vm.$mount("#app");
    </script>
    </body>
    </html>
    
  • 相关阅读:
    gitLab、docker
    Spring源码分析
    Tomcat堆内存分析
    Kafka入门一
    Java NIO
    spring注解
    websocket即时通讯
    pycharm安装dlib库
    python+opencv人脸识别是否戴口罩
    2021年暑假周总结1
  • 原文地址:https://www.cnblogs.com/zhongchao666/p/9462991.html
Copyright © 2011-2022 走看看