vue模板语法(下)

发布于:2022-12-31 ⋅ 阅读:(284) ⋅ 点赞:(0)

一.事件处理器

事件监听可以使用v-on 指令  之前已学习

事件修饰符

  Vue通过由点(.)表示的指令后缀来调用修饰符,

  .stop

  .prevent

  .capture

  .self

  .once`

  <!-- 阻止单击事件冒泡 -->

  <a v-on:click.stop="doThis"></a>

  <!-- 提交事件不再重载页面 -->

  <form v-on:submit.prevent="onSubmit"></form>

  <!-- 修饰符可以串联  -->

  <a v-on:click.stop.prevent="doThat"></a>

  <!-- 只有修饰符 -->

  <form v-on:submit.prevent></form>

  <!-- 添加事件侦听器时使用事件捕获模式 -->

  <div v-on:click.capture="doThis">...</div>

  <!-- 只当事件在该元素本身(而不是子元素)触发时触发回调 -->

  <div v-on:click.self="doThat">...</div>

  <!-- click 事件只能点击一次 -->

  <a v-on:click.once="doThis"></a>

 什么是冒泡:

指事件的层级传播,一层会带着影响上一级

代码讲解:事件处理器html:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
		<title></title>
		<style>
			.red {
				width: 400px;
				height: 400px;
				background-color: red;
			}

			.yellow {
				width: 300px;
				height: 300px;
				background-color: yellow;
			}

			.blue {
				width: 200px;
				height: 200px;
				background-color: blue;
			}

			.green {
				width: 100px;
				height: 100px;
				background-color: green;
			}
		</style>
	</head>
	<body>
		<div id="app">
			<!-- 快捷键 tab-->
			<!-- .red>.yellow>.bule>.grenn -->
			<!-- 需要并列就不要>号 -->
			<!-- table>tr*3>td*3 -->
			<div class="red" @click="red">
				<div class="yellow" @click="yellow">
					<div class="blue" @click="blue">
						<div class="green" @click="green"></div>
					</div>
				</div>
			</div>
		</div>
	</body>
	<script>
		new Vue({
			el: '#app',
			data() {
				return {
					msg: 'hello vue!!!'
				}
			},
			methods: {
					red() {
						alert("red");
					},
					yellow() {
						alert("yellow");
					},
					blue() {
						alert("blue");
					},
					green() {
						alert("green");
					}
				}
			})
	</script>
</html>

我们在代码中给每一个颜色div模块都部署了它各自对应的点击弹窗事件,一层套一层,但是当我们点击最里面一层的模块时,它会先弹出自己的事件 其次会依次执行包含了自己的模块的事件

效果::先弹出了自己的模块的事件

接下来会依次弹出上层模块的事件

 

 

 此时我们就可以用事件修饰符

  .stop阻止单击事件冒泡

我们在@click后面加上.stop,

当事件传递到含有.stop修饰符的时候就会被阻断

当我们点击最里层的green模块时他就会只弹出对应的事件,不会向外传播了

.once只发送一次

 

 效果展示:多次点击后(如果这是用户对服务器的请求 那么一直提交请求也算一种恶意攻击了 所有我们需要组织)

 在@click后添加.once即可(只会提交一次)

 按键修饰符

Vue允许为v-on在监听键盘事件时添加按键修饰符:

  <!-- 只有在 keyCode 是 13 时调用 vm.submit() -->

  <input v-on:keyup.13="submit">

  Vue为最常用的按键提供了别名

  <!-- 同上 -->

  <input v-on:keyup.enter="submit">

  全部的按键别名:

  .enter

  .tab

  .delete (捕获 "删除" 和 "退格" 键)

  .esc

  .space

  .up

  .down

  .left

  .right

  .ctrl

  .alt

  .shift

  .meta      

例:使用较多的.enter修饰符(回车键相当于登陆)

效果:

二.自定义组件

vue中的重中之重 尤其是前端开发人员需要深入

用途:将vue进行封装

2.1 组件简介

      组件(Component)是Vue最强大的功能之一

      组件可以扩展HTML元素,封装可重用的代码

      组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽象为一个组件树

  2.2 全局和局部组件

      全局组件:Vue.component(tagName, options),tagName为组件名,options为配置选项。

      局部组件: new Vue({el:'#d1',components:{...}})

      注册后,我们可以使用以下方式来调用组件:

      <tagName></tagName>

  2.3 props

      props是父组件用来传递数据的一个自定义属性。

      父组件的数据需要通过props把数据传给子组件,子组件需要显式地用props选项声明 "prop"

我们一起来看看如何自定义组件

我们原本是没有 my-button的组件的,但是我们可以自己在<script>中定义

 组件传参(父组件 传参给 子组件)

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
		<title></title>
		
	</head>
	<body>
		<div id="app">
			<p>简单组件<p>
			<my-button>舒服</my-button>
			<p>父组件 传参 给 子组件</p>
			<my-button m='zhangsan' n='3' ></my-button>
		</div>
	</body>
	<script>
		Vue.component('my-button',{
			// template:'<button>我的按钮</button>'
			template:'<button>{{m}}点击了{{n}}次</button>',
			props:['m','n']
		})
		new Vue({
			el:'#app',
			data(){
				return{
				msg:'hello vue!!!'
				}
			}
		})
	</script>
</html>

效果展示:

三.组件通信

 子组件传参给父组件

定义组件:template

父传子:props

子传父:通过$emit注册事件名

this.$emit('事件名',.....)

代码展示:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
		<title></title>
		
	</head>
	<body>
		<div id="app">
			<p>父组件 传参 给 子组件</p>
			<!-- zhangsan点击了3次 -->
			<my-button m='zhangsan' n='3' @mymethod="xxx" ></my-button>
		</div>
	</body>
	<script>
		Vue.component('my-button',{
			// template:'<button>我的按钮</button>'
			template:'<button @click="sub">{{m}}点击了{{n}}次</button>',
			props:['m','n'],
			methods:{
				sub(){
					var name ="张三";
					var sex = "男";
					var age = 22;
					console.log(name);
					console.log(sex);
					console.log(age);
					//子组件 将参数传递给父组件的关键在于
					// 1.$emit 2.自定义事件
					this.$emit('mymethod',name,sex,age);
				}
			}
		})
		new Vue({
			el:'#app',
			data(){
				return{
				msg:'hello vue!!!'
				}
			},
			methods:{
				xxx(a,b,c){
					console.log(a);
					console.log(b);
					console.log(c);
				}
			}
		})
	</script>
</html>

 代码截图:

  效果展示:打印两次,传递成功

四,表单案例

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
		<title></title>
	</head>
	<body>
		<div id="app">
			<!-- 创建一个多功能菜单 -->
			<form>
				姓名:<input type="text" v-model="uname"/><br />
				密码:<input type="password" v-model="pwd" /><br />
				性别:
					<input name="sex"  type="radio" checked>
					<input name="sex"  type="radio" checked><br />
				爱好:
					<div v-for="l in likes">
						<input v-model="hobby" type="checkbox" :value="l.id"/>{{l.name}}
					</div><br/> 
				英语等级:
					<select v-model="selectedVal">
						<option v-for="e in englishs" :value="e.id">{{e.name}}</option>
					</select><br />
				<input @click="show" type="checkbox"/>	
				<input v-show="showFlag"@click="sub" type="button" value="ok" />
			</form>
		</div>
	</body>
	<script>
		new Vue({
			el:'#app',
			data(){
				return{
					uname:null,
					ped:null,
					sex:1,
					likes:[//爱好数据源 复选框
						{id:1,name:'篮球'},
						{id:2,name:'足球'},
						{id:3,name:'桌球'},
						{id:4,name:'乒乓球'}
					],
					englishs:[//数据源 下拉框
						{id:1,name:'优'},
						{id:2,name:'良'},
						{id:3,name:'差'}
					],
					hobby:[],//用来存放选中的爱好 1,3
					selectedVal:0,
					showFlag:false,
				}
			},
			methods:{
				show(){
					this.showFlag = true;
				},
				sub(){
					// 后续都是 json数据交互 向后台提交json对象
					var obj={
						uname:this.uname,
						pwd:this.pwd,
						sex:this.sex,
						hobby:this.hobby,
						level:this.selectedVal
					}
					console.log(obj);
				}
			}
		})
	</script>
</html>

运行结果:

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到