Vue入门常用指令

一.Vue 介绍

​ Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。 另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。

二.使用方法

下载到本地引用:

​ 开发版: https://cn.vuejs.org/js/vue.js

​ 生产版:https://cn.vuejs.org/js/vue.min.js

在线引用:

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>  

npm安装:

// 最新稳定版
npm install vue
// 安装vue-cli脚手架构建工具
npm install --global vue-cli

官网:https://cn.vuejs.org/

三.vue入门指令

vue实例创建

<body>
		<!--  定义id为app作为 锚点 -->
		<p id="app">
			<!-- vue 表达式{{}} 两个花括号 ,里面是数据名-->
			{{msg}}
		</p>
		<!-- 引入 vue.js -->
		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			// 创建 vue 实例
			new Vue({
				// el 代表的是 页面中的 id值
				el: '#app',
				// data 是数据 ,与json数据一样
				data: {
					msg: "hello vue",
				}
			})
			// 在页面就会显示 hello vue
		</script>
</body>

注意:vue 表达式语法是两个花括号{{msg}} 里面写实例中对应的数据名,数据名必须在对应的vue实例之下。

在写实例vue时 要注意 属性和 属性名之间的空格

  • 指令
    1. 本质就是自定义属性
    2. Vue中指令都是以 v- 开头

v-text指令

	<body>
		<div id="app">
			<!-- 在使用 v-text标签时就不需要{{}} 效果等同于{{msg}} -->
			<p v-text="msg"></p>
			<p>{{msg}}</p>
		</div>
		<!-- 导入vue.js -->
		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			// 在写实例vue时 要注意 属性和 属性名之间的空格
			new Vue({
				el: '#app',
				data: {
					msg: "v-text 测试"
				}
			})
		</script>
	    <!-- 页面效果 打印了两个 v-text 测试-->
	</body>

v-html指令

  • 用法和v-text 相似 但是他可以将HTML片段填充到标签中

  • 可能有安全问题, 一般只在可信任内容上使用 v-html永不用在用户提交的内容上

  • 它与v-text区别在于v-text输出的是纯文本,浏览器不会对其再进行html解析,但v-html会将其当html标签解析后输出。

<body>
	<div id="app">
		<!-- v-html 指令会将标签渲染解析 -->
		<p v-html="html"></p>
		<!-- 输出:<span>html标签在渲染的时候被源码输出</span> -->
		<p v-text="text"></p>
		<!-- msg 普通语法 -->
		<p>{{msg}}</p>
	</div>
	<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
	<script type="text/javascript">
		let app = new Vue({
			el: "#app",
			data: {
				msg: "<span >普通双标签不会解析span标签</span>",
				html: "<span>v-html指令可以渲染解析标签</span>",
				text: "<span>v-text 不会解析 标签 跟双花括号一样</span>"
			}
		})
	</script>
</body>

v-text 和 v-html相当于原生js中的 .text 和 .html 相同 是一样的性质

v-pre指令

  • 显示原始信息跳过编译过程
  • 跳过这个元素和它的子元素的编译过程。
  • 一些静态的内容不需要编译加这个指令可以加快渲染
<body>
	<div id="app">
		<!-- 
			使用v-pre 指令 会跳过vue的编译过程 
			所以p标签中的{{msg}} 不会被vue识别编译
			则页面会直接显示 {{msg}}
		 -->
		<p v-pre>{{msg}}</p>
	</div>
	<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
	<script type="text/javascript">
		new Vue({
			el: "#app",
			data: {
				msg: "v-pre 指令会使该语法表达式不会被识别"
			}
		})
	</script>
</body>

v-model指令

  • v-model是一个指令,限制在 <input>、<select>、<textarea>、components中使用

  • v-model是一个双向数据绑定指令

双向数据绑定
  • 当数据发生变化的时候,视图也就发生变化
  • 当视图发生变化的时候,数据也会跟着同步变化
<body>
	<div id="app">
		<span>{{msg}}</span>
		<br>
		<!-- 
			在页面测试时 当修改 input 内容,vue实例中的msg值会跟着改变
			上面的span标签中的值 也会跟随 vue实例中数据改变,v-model 双向
			绑定的好处已经很明显了
		 -->
		<input type="text" name="" id="" v-model="msg" />
	</div>
	<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
	<script type="text/javascript">
		let app = new Vue({
			el: "#app",
			data: {
				msg: "v-model指令测试"
			}
		})
	</script>
</body>

v-once指令

<body>
		<div id="app">
			<!-- 
				使用v-pre 指令 会跳过vue的编译过程 
				所以p标签中的{{msg}} 不会被vue识别编译
				则页面会直接显示 {{msg}}
			 -->
			<p v-pre>{{msg}}</p>
		</div>
		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			new Vue({
				el: "#app",
				data: {
					msg: "v-pre 指令会使该语法表达式不会被识别"
				}
			})
		</script>
	</body>

mvvm概念

  • MVC 是后端的分层开发概念; MVVM是前端视图层的概念,主要关注于 视图层分离,也就是说:MVVM把前端的视图层,分为了 三部分 Model, View , VM ViewModel
  • m model
    • 数据层 Vue 中 数据层 都放在 data 里面
  • v view 视图
    • Vue 中 view 即 我们的HTML页面
  • vm (view-model) 控制器 将数据和视图层建立联系
    • vm 即 Vue 的实例 就是 vm

v-on指令

<body>
		<div id="app">
			<p>{{num}}</p>
			<!-- 绑定点击事件 每点击一下,num值++一下 一般不推荐这样操作-->
			<button type="button" v-on:click="num++">普通点击</button>
			<button type="button" v-on:click="handlel($event)" name="event测试">点击</button>
			<button type="button" v-on:click="handlel2(123,222,$event)">带参点击</button>
		</div>
		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			new Vue({
				el: "#app",
				data: {
					num: 0
				},
				methods: { // methods 存放调用的方法
					handlel: function(event) {
						console.log(event.target.innerHTML)
						console.log(event.target.name)
					},
					handlel2: function(p, p1, event) {
						console.log(p, p1)
						console.log(event.target.innerHTML)
						// this的指向为当前vue实例 this.num++ 就是将num的值++
						this.num++;
					}
				}
			})
		</script>
	</body>

拓展:$event 经过对参数的对比,发现 该event传入的是当前标签的对象,我们可以使用该对象获取参数类如获取文本内容 event.target.innerHTML 或者event.target.name

按键修饰符

​ 在做项目中有时会用到键盘事件,在监听键盘事件时,我们经常需要检查详细的按键。Vue 允许为 v-on 在监听键盘事件时添加按键修饰符

	<body>
		<div id="app">
			<!-- 当键盘每点击一次时触发事件调用submit方法-->
			<input v-on:keyup="submit($event)" value="键盘点击" />
			<!-- 指定特定的键盘键值 来调用 只有当点击小写a时才会触发 -->
			<input v-on:keyup.65="submit($event)" type="button" value="65" />
			<!-- 当鼠标键抬起时触发事件 调用 mouseup 方法 -->
			<input v-on:mouseup="mouseup($event)" type="button" value="鼠标点击" />
			<!-- 
					以上 是键盘鼠标事件的演示 ,还可以拓展其他的类似的操作、
					常用的按键修饰符
					.enter =>    enter键
					.tab => tab键
					.delete (捕获“删除”和“退格”按键) =>  删除键
					.esc => 取消键
					.space =>  空格键
					.up =>  上
					.down =>  下
					.left =>  左
					.right =>  右
			-->

		</div>

		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			new Vue({
				el: "#app",
				data: {

				},
				methods: {
					submit: function(event) {
						console.log(event.target.value);
					},
					mouseup: function(event) {
						console.log(event.target.value);
					}
				}
			})
		</script>
	</body>

自定义按键别名

  • 在Vue中可以通过config.keyCodes自定义按键修饰符别名
<body>
		<div id="app">
			<button type="button" v-on:keydown.fn="prompt($event)" value="我是自定义按键">我是自定义按键</button>
		</div>
		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			// 将 a 的 键值自定义成fn ,然后在控件中直接使用fn  一般情况下不会这样使用
			Vue.config.keyCodes.fn = 65;
			new Vue({
				el: "#app",
				methods: {
					prompt: function(event) {
						alert(event.target.value);
					}
				}
			})
		</script>
	</body>

keyCode值一览表

虚拟键 十六进制值 十进制值 相应键盘或鼠标键
VK_LBUTTON 01 1 鼠标左键
VK_RBUTTON 02 2 鼠标右键
VK_CANCEL 03 3 Ctrl-Break键
VK_MBUTTON 04 4 鼠标中键
VK_BACK 08 8 Backspace键
VK_TAB 09 9 Tab键
VK_CLEAR 0C 12 Clear键
VK_RETURN 0D 13 Enter键
VK_SHIFT 10 16 Shift键
VK_CONTROL 11 17 Ctrl键
VK_MENU 12 18 Alt键
VK_PAUSE 13 19 Pause键
VK_CAPITAL 14 20 Caps Lock键
VK_ESCAPE 1B 27 Esc键
VK_SPACE 20 32 Space键
VK_PRIOR 21 33 Page Up键
VK_NEXT 22 34 Page Down键
VK_END 23 35 End键
VK_HOME 24 36 Home键
VK_LEFT 25 37 ←键
VK_UP 26 38 ↑键
VK_RIGHT 27 39 →键
VK_DOWN 28 40 ↓键
VK_SELECT 29 41 Select键
VK_PRINT 2A 42 Print键
VK_EXECUTE 2B 43 Execute键
VK_SNAPSHOT 2C 44 Print Screen键
VK_INSERT 2D 45 Ins键
VK_DELETE 2E 46 Del键
VK_HELP 2F 47 Help键
VK_0 0x30 48 0键
VK_1 0x 31 49 1键
VK_2 0x 32 50 2键
VK_3 0x 33 51 3键
VK_4 0x 34 52 4键
VK_5 0x 35 53 5键
VK_6 0x 36 54 6键
VK_7 0x 37 55 7键
VK_8 0x 38 56 8键
VK_9 0x 39 57 9键
VK_A 41 65 A键
VK_B 42 66 B键
VK_C 43 67 C键
VK_D 44 68 D键
VK_E 45 69 E键
VK_F 46 70 F键
VK_G 47 71 G键
VK_H 48 72 H键
VK_I 49 73 I键
VK_J 4A 74 J键
VK_K 4B 75 K键
VK_L 4C 76 L键
VK_M 4D 77 M键
VK_N 4E 78 N键
VK_O 4F 79 O键
VK_P 50 80 P键
VK_Q 51 81 Q键
VK_R 52 82 R键
VK_S 53 83 S键
VK_T 54 84 T键
VK_U 55 85 U键
VK_V 56 86 V键
VK_W 57 87 W键
VK_X 58 88 X键
VK_Y 59 89 Y键
VK_Z 5A 90 Z键
VK_LWIN 5B 91 左Windows键
VK_RWIN 5C 92 右Windows键
VK_APPS 5D 93 应用程序键
VK_SLEEP 5F 95 休眠键
VK_NUMPAD0 60 96 小数字键盘0键
VK_NUMPAD1 61 97 小数字键盘1键
VK_NUMPAD2 62 98 小数字键盘2键
VK_NUMPAD3 63 99 小数字键盘3键
VK_NUMPAD4 64 100 小数字键盘4键
VK_NUMPAD5 65 101 小数字键盘5键
VK_NUMPAD6 66 102 小数字键盘6键
VK_NUMPAD7 67 103 小数字键盘7键
VK_NUMPAD8 68 104 小数字键盘8键
VK_NUMPAD9 69 105 小数字键盘9键
VK_MULTIPLY 6A 106 乘号键
VK_ADD 6B 107 加号键
VK_SEPARATOR 6C 108 分割键
VK_SUBSTRACT 6D 109 减号键
VK_DECIMAL 6E 110 小数点键
VK_DIVIDE 6F 111 除号键
VK_F1 70 112 F1键
VK_F2 71 113 F2键
VK_F3 72 114 F3键
VK_F4 73 115 F4键
VK_F5 74 116 F5键
VK_F6 75 117 F6键
VK_F7 76 118 F7键
VK_F8 77 119 F8键
VK_F9 78 120 F9键
VK_F10 79 121 F10键
VK_F11 7A 122 F11键
VK_F12 7B 123 F12键
VK_F13 7C 124 F13键
VK_F14 7D 125 F14键
VK_F15 7E 126 F15键
VK_F16 7F 127 F16键
VK_F17 80 128 F17键
VK_F18 81 129 F18键
VK_F19 82 130 F19键
VK_F20 83 131 F20键
VK_F21 84 132 F21键
VK_F22 85 133 F22键
VK_F23 86 134 F23键
VK_F24 87 135 F24键
VK_NUMLOCK 90 144 Num Lock键
VK_SCROLL 91 45 Scroll Lock键
VK_LSHIFT A0 160 左Shift键
VK_RSHIFT A1 161 右Shift键
VK_LCONTROL A2 162 左Ctrl键
VK_RCONTROL A3 163 右Ctrl键
VK_LMENU A4 164 左Alt键
VK_RMENU A5 165 右Alt键

v-bind指令

  • v-bind 指令被用来响应地更新 HTML 属性
		<style type="text/css">
			/* 定义几组样式 */
			.p1Color {
				color: blue;
			}

			.p2Color {
				color: darkred;
			}

			.p1Text {
				font-size: 18px;
			}

			.p1Text {
				font-size: 10px;
			}
		</style>
	</head>
	<body>
		<div id="app">
			<!-- 绑定 p1Color 并选择isColor isColor定义为true 也可以直接写true-->
			<p v-bind:class="{p1Color:isColor}">
				学习 v-bind 指令
			</p>
			<button v-on:mouseup="changeColor">{{chgColor}}</button>
			<p></p>
			<p></p>
		</div>
		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			new Vue({
				el: "#app",
				data: {
					isColor: true,
					isText: true,
					color: "yellow",
					size: "14px",
					chgColor: "关闭样式"
				},
				methods: {
					changeColor: function() {
						// 点击事件 关闭开启 p标签的样式
						if (this.isColor === true) {
							this.isColor = false;
							this.chgColor = "开启样式"
						} else {
							this.isColor = true;
							this.chgColor = "关闭样式"
						}
					}
				}
			})
		</script>
	</body>
v-bind绑定class
		<style type="text/css">
			/* 定义几组样式 */
			.p1Color {
				color: blue;
			}

			.p2Color {
				color: darkred;
			}

			.p1Text {
				font-size: 18px;
			}

			.p1Text {
				font-size: 10px;
			}
		</style>
	</head>
	<body>
		<div id="app">
			<!-- 将 样式 定义在vue实例中,然后 绑定到DOM上 -->
			  <!-- :class 等同于 v-on:calss -->
			<p :class="[colorA,textA]">
				学习 v-bind 指令
			</p>
			<button v-on:mouseup="changeAColor">{{chgColor}}</button>
			
			<p v-bind:class="[colorB,textB]">
				学习 v-bind 指令绑定 class
			</p>
			<button v-on:mouseup="changeBColor">{{chgColor}}</button>
			<p></p>
		</div>
		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			new Vue({
				el: "#app",
				data: {
					colorA: "p1Color",
					colorB: 'p2Color',
					textA: 'p1Text',
					textB: 'p2Text',
					chgColor: "切换样式"
				},
				/*定义 两个 方法切换样式 */
				methods: {
					changeAColor: function() {
						if ("p1Color" === this.colorA) {
							this.colorA = 'p2Color';
						} else {
							this.colorA = 'p1Color';
						}
					},
					changeBColor: function() {
						if ("p2Color" === this.colorB) {
							this.colorB = 'p1Color';
						} else {
							this.colorB = 'p2Color';
						}
					}
				}
			})
		</script>
	</body>
绑定对象和绑定数组 的区别
  • 绑定对象的时候 对象的属性 即要渲染的类名 对象的属性值对应的是 data 中的数据
  • 绑定数组的时候数组里面存的是data 中的数据
绑定style v-bind:style
<body>
		<div id="app">
			<!-- :style 等同于 v-bind:style -->
			<p :style="{ color:colorB, fontSize:fontSize}">
				v-bind:style 样式绑定 内联样式
			</p>
			<p v-bind:style="[styleB, styleA]">
				v-bind:style 样式绑定 数组绑定
			</p>
		</div>

		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			new Vue({
				el: "#app",
				data: {
					/* 在data里面定义几组 样式数据 */
					styleObject: {
						color: "green",
						fontSize: "18px"
					},
					
					colorB:"green",
					fontSize:"18px",
					
					styleA: {
						color: "red"
					},
					styleB: {
						fontSize: "28px"
					}
				}
			})
		</script>
	</body>

分支循环

v-if指令

<body>
		<div id="app">
			<!-- 使用v-if 指令来判断flag -->
			<p v-if="flag === true">
				{{msg}}
			</p>
			<p v-if="flag === false">
				{{msg2}}
			</p>
			<button type="button" @click="changeClick">点我</button>
		</div>

		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			new Vue({
				el: "#app",
				data: {
					flag: true, // 设置标志 为true 用于页面判断
					msg: "我出来了",
					msg2: "我消失了"
				},
				methods: {
					changeClick: function() {
						if (this.flag === true) {
							this.flag = false;
						} else {
							this.flag = true;
						}
					}
				}
			})
		</script>
	</body>

v-show指令

<body>
		<div id="app">
			<p v-show="1===1">v-show判断为true时我显示了</p>
			<p v-show="1===2">v-show为flase时我隐藏</p>
			<!-- 使用 v-show 指令来判断flag -->
			<p v-show="flag === true">
				{{msg}}
			</p>
			<p v-show="flag === false">
				{{msg2}}
			</p>
			<button type="button" @click="changeClick">点我</button>
		</div>

		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			new Vue({
				el: "#app",
				data: {
					flag: true, // 设置标志 为true 用于页面判断
					msg: "我出来了",
					msg2: "我消失了"
				},
				methods: {
					changeClick: function() {
						if (this.flag === true) {
							this.flag = false;
						} else {
							this.flag = true;
						}
					}
				}
			})
		</script>
	</body>

v-show 和 v-if的区别

  • v-show本质就是标签display设置为none,控制隐藏
    • v-show只编译一次,后面其实就是控制css,而v-if不停的销毁和创建,故v-show性能更好一点。
  • v-if是动态的向DOM树内添加或者删除DOM元素
    • v-if切换有一个局部编译/卸载的过程,切换过程中合适地销毁和重建内部的事件监听和子组件

v-for循环指令

<body>
		<div id="app">
			<!-- 循环遍历 data中 items 数据 -->
			<p v-for="item in items">
				<span>id: {{item.id}} </span>
				<span>name: {{item.name}} </span>
				<span>age: {{item.age}} </span>
				<br>
			</p>

			<!-- 页面中将会循环遍历
			 id: 1 name: 李四 age: 20
			 
			 id: 2 name: 王五 age: 19
			 
			 id: 3 name: 张飞 age: 33
			 -->
		</div>
		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			new Vue({
				el: "#app",
				// 准备 循环模拟数据
				data: {
					items: [{
							id: 1,
							name: "李四",
							age: 20
						},
						{
							id: 2,
							name: "王五",
							age: 19
						},
						{
							id: 3,
							name: "张飞",
							age: 33
						},
					]
				}
			})
		</script>
	</body>

注意点:

  • 不推荐同时使用 v-ifv-for
  • v-ifv-for 一起使用时,v-for 具有比 v-if 更高的优先级。

"="和""和"="的区别

<body>
		<!-- 一个等号 是赋值的意思 主要用于js里面 -->
		<div id="app">
			<!-- 使用双等时 -->
			<p v-if="num == '1' ">我是双等于 双等于 不严谨 普通的数字1可以等于字符串"1"</p>
			<!-- 使用三等时 由于strNum定义为字符型1 所以不等于数字型1-->
			<p v-if="strNum==='1'">我是双等于 双等于 不严谨 普通的数字1可以等于字符串"1"</p>

			<!-- 同样使用于其他类型数据 eg Boolean和string的ture相对比 -->
		</div>
		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			new Vue({
				el: "#app",
				data: {
					// 定义一个普通的1 一个字符类型的1
					num: 1,
					strNum: '1'
				},
			})
		</script>
	</body>

四.Vue选项卡案例

<body>
		<!-- 选项卡主体 -->
		<div id="app" class="tableCard">
			<div id="" class="tableHead">
				<ul>
					<!-- 取选项卡数据 遍历标题 -->
							<!-- defaultStyle 如果标志id等于遍历id则加上默认样式 -->
					<li v-for="title in tableLists" :class="title.id===flagId?'defaultStyle':''">
						<!-- 绑定点击事件change 传入对应数据id -->
						<span v-on:click='change(title.id)'>{{title.title}}</span>
					</li>
				</ul>
			</div>
			<div id="" class="tableBody">
				<!-- 取选项卡数据 遍历图片路径 -->
				<ul v-for="img in tableLists">
					<!-- 数据id等于标志id 则让改图片显现 -->
					<li v-if="img.id === flagId">
						<img :src="img.path" v-bind:style="showImg">
					</li>
					<!--不等于的就隐藏 -->
					<li v-else>
						<img :src="img.path">
					</li>
				</ul>
			</div>
		</div>
		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<!-- vue 实例-->
		<script type="text/javascript">
			new Vue({
				el: "#app",
				// 定义图片样式
				data: {
					flagId: 1,
					showImg: "display: block;",
					tableLists: [{
						id: 1,
						title: "选项卡1",
						path: "img/3Dbg01.jpg"
					}, {
						id: 2,
						title: "选项卡2",
						path: "img/3Dbg02.jpg"
					}, {
						id: 3,
						title: "选项卡3",
						path: "img/3Dbg03.jpg"
					}, ]
				},
				methods: {
					// 每点击一次修改flagId的值为传入的值
					change: function(titleId) {
						this.flagId = titleId;
					}
				}
			})
		</script>
	</body>

参考demo

giteehttps://gitee.com/li_shang_shan/vue-entry-instruction-demo

posted @ 2020-11-29 18:25  一生的风景  阅读(377)  评论(0编辑  收藏  举报