上次与大家分享了Vue语法模板的部分,今天继续与大家分享。
目录
2、事件处理器的具体应用(.stop冒泡事件,.once只提交一次)
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>
-
- <a v-on:click.once="doThis">a>
Vue允许为v-on在监听键盘事件时添加按键修饰符:
-
- <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
冒泡事件就是指父元素和子元素有相同的事件,当触发子元素事件时,会向上冒泡,同时也会触发父元素事件
用一张图表示:
示例:
这四个div容器具有相同的事件,在最里面的容器中添加了.stop就能够阻止冒泡
不会设置动图所以这个效果无法直观的被看见
- <!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;
- }
- .orange{
- width: 300px;
- height: 300px;
- background-color: orange;
- }
- .blue{
- width: 200px;
- height: 200px;
- background-color: blue;
- }
- .pink{
- width: 100px;
- height: 100px;
- background-color: pink;
- }
- </style>
- </head>
- <body>
-
- <div id="app">
- {{msg}}
- <p>冒泡事件</p>
- <div
- class="red" @click="red">
- <div
- class="orange" @click="orange">
- <div
- class="blue" @click="blue">
- <div class="pink" @click.stop="pink"></div>
- </div>
- </div>
- </div>
- <p>提交答案</p>
- <button @click.once="dosub">提交</button>
- <p>按键修饰符</p>
- <input @keyup.enter="dosub"/>
- </div>
-
-
- <script>
- new Vue({
- el:"#app",
- data(){
- return {
- msg:'小猪猪'
- };
- },
- methods:{
- red(){
- alert('red');
- },
- orange(){
- alert('orange');
- },
- blue(){
- alert('blue');
- },
- pink(){
- alert('pink');
- },
- dosub(){
- alert('提交');
- }
-
-
-
-
- }
-
-
-
-
- })
-
- </script>
- </body>
- </html>
组件(Component)是Vue最强大的功能之一
组件可以扩展HTML元素,封装可重用的代码
组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽象为一个组件树
全局组件:Vue.component(tagName, options),tagName为组件名,options为配置选项。
局部组件: new Vue({el:'#d1',components:{...}})
注册后,我们可以使用以下方式来调用组件:
props是父组件用来传递数据的一个自定义属性。
父组件的数据需要通过props把数据传给子组件,子组件需要显式地用props选项声明 "prop"
- <body>
- <div id="app">
- {{msg}}
- <my-button m="小猪猪" @mymethod='aaa'></my-button>
-
- </div>
-
- <script>
- Vue.component('my-button',{
- props:'m',//定义组件中的变量
- //template代表了自定义组件在页面上展示的内容
- template:'',
- data:function(){
- return{
- n:1,
- }
- },
- methods:{
- incrn(){
- this.n++;
- }
-
-
- new Vue({
- el:"#app",
- data(){
- return{
-
- msg:'小猪猪',
- }
-
- },
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <title></title>
- <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
-
- </head>
- <body>
- <div id="app">
- {{msg}}
- <my-button m="小猪猪" @mymethod='aaa'></my-button>
-
- </div>
-
- <script>
- Vue.component('my-button',{
- props:'m',//定义组件中的变量
- //template代表了自定义组件在页面上展示的内容
- template:'',
- data:function(){
- return{
- n:1,
- }
- },
- methods:{
- incrn(){
- this.n++;
-
- var name = "熊二";
- var sex = "男";
- var age = 19;
- console.log(name);
- console.log(sex);
- console.log(age);
-
-
- this.$emit("mymethod",name,sex,age);//将子组件传递参数给父组件的关键字与自定义事件
-
- }
-
-
-
- }
-
-
- })
-
-
- new Vue({
- el:"#app",
- data(){
- return{
-
- msg:'小猪猪',
- }
-
- },
-
- methods:{
- aaa(a,b,c){
- console.log(a);
- console.log(b);
- console.log(c);
- }
- }
- })
-
-
- </script>
- </body>
- </html>
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <title></title>
- <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
-
- </head>
-
- <body>
- <div id="app">
- <h1>标题</h1>
- <ul>
- <li>
- <p>vue表单</p>
- <label>姓名:</label><input v-model="uname" /><br />
- <label>密码:</label><input v-model="upwd" type="password" /><br />
- <!-- 将用户的输入值转为 Number 类型 -->
- <label>年龄:</label><input v-model.number="age" /><br />
- <label>性别:</label>
- <input type="radio" v-model="sex" name="sex" value="1" />男
- <input type="radio" v-model="sex" name="sex" value="0" />女<br />
- <label>爱好:</label>
- <div v-for="h in hobby">
- <input type="checkbox" v-model="hobbies" v-bind:value="h.id" />{{h.name}}
- </div>
- <label>类别:</label>
- <select v-model="type">
- <option value="-1">===请选择===</option>
- <option v-for="t in types" v-bind:value="t.id">{{t.name}}</option>
- </select><br />
- <label>备注:</label>
- <textarea v-bind:value="mark"></textarea><br />
- 确认<input type="checkbox" v-model="flag" />
- <input type="submit" v-bind:disabled="show" v-on:click="doSubmit" />
- </li>
- </ul>
- </div>
- </body>
-
-
- <script type="text/javascript">
- new Vue({
- el: '#app',
- data() {
- return {
- uname: null,
- upwd: null,
- age: 10,
- sex: 1,
- hobby: [{
- id: 1,
- name: '篮球'
- }, {
- id: 2,
- name: '足球'
- }, {
- id: 3,
- name: '象棋'
- }],
- hobbies: [],
- types: [{
- id: 1,
- name: 'A'
- }, {
- id: 2,
- name: 'B'
- }, {
- id: 3,
- name: 'C'
- }],
- type: null,
- mark: '学生备注',
- flag: false
- }
- },
- computed: {
- show: function() {
- return !this.flag;
- }
- },
- methods: {
- doSubmit: function() {
- console.log('doSubmit')
- var obj = {
- uname: this.uname,
- upwd: this.upwd,
- age:this.age+10,
- sex: this.sex,
- hobbies:this.hobbies,
- type: this.type,
- mark: this.mark,
- }
- console.log(obj);
- }
- }
-
- })
- </script>
-
- </html>