Vue(二)---指令---属性---组件

一. 指令

补充Vue(一)里面没有写完的属性

1. v-on: 监听 DOM 事件

绑定事件监听器。事件类型由参数指定。表达式可以是一个方法的名字或一个内联语句,如果没有修饰符也可以省略。

格式

  • v-on:事件名字.修饰符

  • :事件名:页面加载完成,直接触发当前事件,只运行一次

  • @事件名:简写

修饰符:(一小部分)

  • left - (2.2.0) 只当点击鼠标左键时触发

  • right - (2.2.0) 只当点击鼠标右键时触发

  • once - 只触发一次回调。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<!-- 引入vue -->
		<script src="js/vue.global.js"></script>
	</head>
	<body>
		<div id="app">
			<button @click="add()">按钮</button>
			<button @click.once="yici()">一次</button>
			<button @click.left="left()">左键</button>
			<button @click.right="right()">右键</button>
		</div>
		<script>
			// 创建vue实例
			const  app = Vue.createApp({
				
				methods:{ //methods是一个属性用来声明函数(方法) 函数在声明的时候一般只使用第一种
					// 函数的声明 一
					add(){
						alert("这是一个按钮")
					},
					yici(){
						alert("不管点几次只出现一次");
					},
					left(){
						alert("左键出现");
					},
					right(){
						alert("右键出现");
					}
				}
			});
			// 将vue实例挂载到div id=app 上面
			// 如果不挂载 试图不会显示
			// app.mount("#app");
			const vm = app.mount("#app")
		</script>
	</body>
</html>

2. v-on   img: 点击切换图片

使用v-on监听事件完成图片轮播操作

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<!-- 引入vue -->
		<script src="js/vue.global.js"></script>
	</head>
	<body>
		<div id="app">
			<img :src="imgs[index]" width="300px" height="300px"/>
			<button @click="myimg()">切换</button>
		</div>
		<script>
			// 创建vue实例
			const  app = Vue.createApp({
				data() {
					return{
						imgs: ["img/1.png","img/2.png","img/3.png"],
						index:0,
					}
					
				},
				methods:{ 
					myimg(){
						/**
						 * 点击切换按钮的时候进行判断 如果 index 大于图片大于等于图片张数则赋值为0 
						 * 重新从第一种图片开始
						 */ 
						if(this.index>=this.imgs.length-1){
							this.index=0;
						}else{
							// 如果index的值不大于等于所拥有的图片 则加一 播放下一张
							this.index++;
						}
					}
					
				}
			});
			// 将vue实例挂载到div id=app 上面
			// 如果不挂载 试图不会显示
			// app.mount("#app");
			const vm = app.mount("#app")
		</script>
	</body>
</html>

3. 样式绑定

 绑定多个.class样式

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<!-- 引入vue -->
		<script src="js/vue.global.js"></script>
		<style>
			.myclass1{
				color: aqua;
			}
			.myclass2{
				background-color: black;
			}
		</style>
	</head>
	<body>
		<div id="app">
			<div :class="[aaa,bbb]">只是一个测试</div>
		</div>
		<script>
			// 创建vue实例
			const  app = Vue.createApp({
				data() {
					return{
						aaa:'myclass1',
						bbb:'myclass2'
					}
				}
			});
			// 将vue实例挂载到div id=app 上面
			// 如果不挂载 试图不会显示
			// app.mount("#app");
			const vm = app.mount("#app")
		</script>
	</body>
</html>

4. v-moduel 表单绑定 

在前端处理表单时,我们常常需要将表单输入框的内容同步给 JavaScript 中相应的变量。手动连接值绑定和更改事件监听器可能会很麻烦。v-model 指令在表单 及 `` 等元素上创建双向数据绑定

v-model 会根据控件类型自动选取正确的方法来更新元素。

v-model 会忽略所有表单元素的 value、checked、selected 属性的初始值,使用的是 data 选项中声明初始值。

v-model 在内部为不同的输入元素使用不同的属性并抛出不同的事件:

  • text 和 textarea 元素使用 value 属性和 input 事件;

  • checkbox 和 radio 使用 checked 属性和 change 事件;

  • select 字段将 value 作为属性并将 change 作为事件。

<!DOCTYPE html>
<html>
	<!-- 双向绑定 -->
	<head>
		<meta charset="utf-8" />
		<title></title>
		<!--  引入vue -->
		<script src="js/vue.global.js"></script>
	</head>
	<body>
		<div id="app">
		<input v-model="msg" placeholder="编辑我……"><br>
		{{msg}}<br><br><br>
		
		
		性别:<input type="radio" name="sex" value="男" v-model="sex" >男
		     <input type="radio" name="sex" value="女"  v-model="sex">女<br>
			 选中的性别:{{sex}}<br><br><br>
			 
			 
		兴趣爱好:
		     <input type="checkbox" name="inter" value="吃饭" v-model="inters" >吃饭
		     <input type="checkbox" name="inter" value="睡觉"  v-model="inters">睡觉
			 <input type="checkbox" name="inter" value="钓鱼" v-model="inters" >钓鱼
			 <input type="checkbox" name="inter" value="跳舞" v-model="inters" >跳舞<br>
			 兴趣爱好:{{inters}}<br><br><br>
			 
			 
		 下拉框:
		 <select v-model="xueli">
			 <!--  option没有设置value属性的时候  默认值 是标签中间的值-->
			 <!--  设置值了  设置的是什么就是什么-->
			 <!--  下拉框选中的是value的值-->
			 <option value="0">吃饭</option>
			 <option value="1">睡觉</option>
			 <option value="2">打篮球</option>
		 </select>
		 <br>
		 选中的下拉框的值是:{{xueli}}<br><br><br>
			 
			 
		 多选下拉框:
		 <select v-model="wangzhan" multiple>
				<option value="www.runoob.com">Runoob</option>
				<option value="www.google.com">Google</option>
				<option value="www.taobao.com">Taobao</option>		
		 </select>
		 <br>
		 选中的下拉框的值是:{{wangzhan}}<br><br><br>
		 
		 
		 多行文本框:<br>
		 <textarea v-model="content"></textarea>
		 <br />
		 {{content}}
		</div>
		
		<script>
			//创建vue实例
			const app = Vue.createApp({
				data(){
						
					return{
						msg:"dys",
						sex:"女",
						inters:["吃饭"],
						xueli:"",
						wangzhan:[],
						content:"我是dys"
					}
				}
			});
			
			// 将vue实例挂载到id=app上面
			// 如果不挂载 视图内容不会显示
			app.mount("#app"); 
		</script>
		
	</body>
</html>

二. 属性

1. 计算属性 computed

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="js/vue.global.js"></script>
	</head>
	<body>
		<div id="app">
			年龄: {{getAge()}}
			性别: {{sex}}
		</div>
		<script>
			const app = Vue.createApp({
				data() {
					return{
						idcard:"410727198802103418"
					}
				},
				methods:{
					getAge(){
						// 当前年份 - 出生的年份  每次运行都需要重新运行
						// 获取到当前年份
						let now = new Date().getFullYear();
						// 截取身份证的年份
 						let birthyear=this.idcard.substr(6,4);
						// 当前年份减去身份证年份 获取到年龄
						let age = now-birthyear;
						alert(age);
						return age;
					}
				},computed:{
					/**
					 * 计算属性
					 * 只要身份证不发生变化 性别就不会重新计算 提高效率
					 */
					sex(){
						let sex = this.idcard.substr(16,1);
						return sex%2==1?"男":"女";
					}
				}
			})
			const vm = app.mount("#app")
		</script>
	</body>
</html>

2. 监听属性 watch

监听属性,用来监听数据的变化,绑定数据变化时的相关操作

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="js/vue.global.js"></script>
	</head>
	<body>
		<div id="app">
			千米: <input type="text" v-model="kilometers"/>
			米: <input type="text" v-model="meters"/>
		</div>
		<script>
			const app = Vue.createApp({
				data() {
					return{
						kilometers:"1",
						meters:"1000"
					}
				},
				watch:{
					// 设置 米 跟随 千米 变化而变化
					kilometers(val1,val2){
						this.meters=val1*1000;
					},
					// 设置 千米 跟随 米 变化而变化
					meters(val1,val2){
						this.kilometers=val1/1000;
					}
				}
			})
			const vm = app.mount("#app")
		</script>
	</body>
</html>

 3.区别

  1. 计算属性是用来解决模板语法冗余的, 侦听器是用来侦听data中某一数据的变化(功能不同)

  2. 计算属性有缓存机制, 侦听器没有

  3. 计算属性不支持异步操作, 侦听器支持

  4. 计算属性可以给vue新增属性, 侦听器必须是data中已有的属性

  5. 计算属性只要使用了就会立即执行一次, 侦听器默认只有当数据第一次改变才会执行, 需要设置immediate属性来控制是否立即执行一次

三. Vue组件

1.根组件

一旦写了在 createApp 中传入了 template 则就构成了当前应用的根组件 (告诉 vue 如何去渲染根组件相关页面)

不声明template,默认使用挂载点作为根组

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<!--  引入vue -->
		<script src="js/vue.global.js"></script>
	</head>
	<body>
		
		
		
		<div id="app"></div>
		
		<script>
			//创建vue实例
			const app = Vue.createApp({
				// 根组件
				//  createApp 的时候 template 成为根组件   无需调用即可显示到界面中
				template:"<h1>DYS------</h1>"
			});
			
			// 将vue实例挂载到id=app上面
			// 如果不挂载 视图内容不会显示
			app.mount("#app"); 
		</script>
		
	</body>
</html>

2.全局组件

1.注册多个全局组件 

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<!--  引入vue -->
		<script src="js/vue.global.js"></script>
<!-- 		<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script> -->
	</head>
	<body>
		
		
		
		<div id="app">
			<my-com></my-com>
			<my-com2></my-com2>
		</div>
		
		<script>
			//创建vue实例
			const app = Vue.createApp({
				
			});
			/**
			 * 注册全局组件
			 * vue对象.component("组件名字",{具体内容})
			 */
			// 第一个全局组件
			app.component("my-com",{
				template:"<h1>DYS~~~~~~</h1>"
			})
			// 第二个全局组件
			app.component("my-com2",{
				template:"<h1>AaAaAaAaA</h1>"
			})
			
			
			// 将vue实例挂载到id=app上面
			// 如果不挂载 视图内容不会显示
			app.mount("#app"); 
		</script>
		
	</body>
</html>

2.组件的复用性 

即同一个组件有点像 api , 它是可以被重复用的, 和小工具一样, 而且互相之间是隔开的, 举个栗子如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<!--  引入vue -->
		<script src="js/vue.global.js"></script>
<!-- 		<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script> -->
	</head>
	<body>
		
		
		
		<div id="app">
            <!-- 组件可重复调用并别之间互不影响< -->
			<my-btn></my-btn>
			<my-btn></my-btn>
			<my-btn></my-btn>
		</div>
		
		<script>
			//创建vue实例
			const app = Vue.createApp({
				
			});
			app.component("my-btn",{
				data(){
					return{
						count:1
					}
				},
				template:'<div @click="count += 1">按钮:{{count}}</div>'
			})
			// 将vue实例挂载到id=app上面
			// 如果不挂载 视图内容不会显示
			app.mount("#app"); 
		</script>
		
	</body>
</html>

缺点

只要通过 app.component ( ) 注册的组件即为全局的, 在任何地方都能用, 很方便. 但同时也会一直挂载在 app 上, 则会占用其资源, 性能也是有很多损耗

3.局部组件 

与全局组件相比是相对的, 要注册后才会挂载, 在实际工作中基本都是局部组件的方式来拆分功能。 从代码来看, 自定义一个局部组件就是一个对象而已。然后通过在父组件中进行注册 (component) 即可使用。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="js/vue.global.js"></script>
	</head>
	<body>
			<div id="app">
				<my-jubu></my-jubu>
				<my-jubu2></my-jubu2>
			</div>
			
			<script>
				const app = Vue.createApp({
					components:{
						"my-jubu":{
							template:"<h1>DYS</h1>"
						},
						"my-jubu2":{
							template:"<h1>DYS2</h1>"
						}
					}
				})
				
				const vm = app.mount("#app")
			</script>
	</body>
</html>

  • 27
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值