Vue.js - 事件与表单处理

以下笔记皆基于 Vue 2

事件处理


v-on 指令

v-on 指令用于进行元素的事件绑定,简写方式 @事件类型。当事件程序代码较多时,可以在 methods 中设置函数,并设置为事件处理程序。

设置事件处理程序后,如果不设置形参,则可以从参数 event 中接收事件对象,如果设置形参,则需要在视图中通过传递 $event 实参来访问事件对象。

<body>
  <div id="app">
    <p>{{ content }}</p>
    <!-- v-on 指令语法 -->
    <button v-on:click="content='这是新的内容'">按钮</button>
    <!-- v-on 指令简写语法 -->
    <button @click="content='这是按钮2设置的内容'">按钮2</button>
    <!-- 函数形式 -->
    <button @click="fn">按钮3</button>
    <!-- 接收自定义参数,传递事件对象 -->
    <button @click="fn2(200, $event)">按钮4</button>
  </div>
  <script src="lib/vue.js"></script>
  <script>
    new Vue({
      el: '#app',
      data: {
        content: '这是默认内容'
      },
      methods: {
        fn(event) {
          console.log(event);
          this.content = '这是按钮3设置的内容';
        },
        fn2(value, event) {
          console.log(value, event);
        }
      }
    })
  </script>
</body>

表单输入绑定


v-model 指令

v-model 指令用于给 <input> 、<textarea> 及 <select> 元素设置双向数据绑定。

输入框绑定

输入框分为单行输入框 input 与多行输入框 textarea:

<body>
  <div id="app">
    <p>input 输入框的内容为: {{ value1 }}</p>
    <input type="text" v-model="value1">

    <p>textarea 输入框的内容为: {{ value2 }}</p>
    <textarea v-model="value2"></textarea>
  </div>
  <script src="lib/vue.js"></script>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        value1: '',
        value2: ''
      }
    });
  </script>
</body>

单选按钮绑定

单选按钮的双向数据绑定方式如下:

<body>
  <div id="app">
    <p>radio 的内容为: {{ value3 }}</p>
    <input type="radio" id="one" value="1" v-model="value3">
    <label for="one">选项1</label>

    <input type="radio" id="two" value="2" v-model="value3">
    <label for="two">选项2</label>
  </div>
  <script src="lib/vue.js"></script>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        value3: ''
      }
    });
  </script>
</body>

复选框绑定

复选框绑定分为单个选项与多个选项两种情况,书写方式不同。单个复选框 data 数据为单个字符串,且绑定的值为布尔类型,而多个复选框则为数组,数组内的值为选项的 value 值。

<body>
  <div id="app">
    <!-- 单个复选框进行双向数据绑定的演示 -->
    <p>单个复选框的值: {{ value4 }}</p>
    <input 
      type="checkbox" 
      value="选项内容" 
      id="one" 
      v-model="value4">
    <label for="one">选项内容</label>


    <!-- 多个复选框进行双向数据绑定的演示 -->
    <p>多个复选框的值:{{ value5 }}</p>
    <input 
      type="checkbox"
      id="cb1"
      value="选项1"
      v-model="value5"
      >
    <label for="cb1">选项1</label>
    <input 
      type="checkbox"
      id="cb2"
      value="选项2"
      v-model="value5"
      >
    <label for="cb2">选项2</label>
    <input 
      type="checkbox"
      id="cb3"
      value="选项3"
      v-model="value5"
      >
    <label for="cb3">选项3</label>
  </div>
  <script src="lib/vue.js"></script>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        value4: '',
        value5: []
      }
    });
  </script>
</body>

选择框绑定

选择框绑定分为单选绑定与多选绑定两种情况,书写方式不同。

<body>
  <div id="app">
    <!-- 单选选择框 -->
    <p>单选选择框的内容: {{ value6 }}</p>
    <select v-model="value6">
      <option value="">请选择</option>
      <option value="1">选项1</option>
      <option value="2">选项2</option>
      <option value="3">选项3</option>
    </select>

    <!-- 多选选择框 -->
    <p>多选选择框的内容:{{ value7 }}</p>
    <select v-model="value7" multiple>
      <option value="1">选项1</option>
      <option value="2">选项2</option>
      <option value="3">选项3</option>
    </select>
  </div>
  <script src="lib/vue.js"></script>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        value6: '',
        value7: []
      }
    });
  </script>
</body>

v-model 指令小结

  • input 输入框:绑定字符串值。
  • textarea 输入框:绑定字符串值。
  • radio:绑定字符串值。
  • checkbox:单个绑定布尔值,多个绑定数组。
  • select:单选绑定字符串,多选绑定数组。

修饰符


修饰符是以点开头的指令后缀,用于给当前指令设置特殊操作。

事件修饰符

  • .prevent 修饰符
    该修饰符用于阻止默认事件行为,相当于 event.preventDefault()。
    <body>
      <div id="app">
        <!-- <a @click.prevent="fn" >链接</a> -->
        <a @click.prevent >链接</a>
      </div>
      <script src="lib/vue.js"></script>
      <script>
        new Vue({
          el: '#app',
          data: {
          },
          methods: {
            fn() {
              console.log('这是 a 标签的点击事件')
            }
          }
        });
      </script>
    </body>
    
  • .stop 修饰符
    用于阻止事件传播,即可以阻止事件冒泡,相当于 event.stopPropagation()。Vue.js 中允许修饰符进行连写,例如:@click.prevent.stop
    <body>
      <div id="app">
        <div @click="fn1">
          <button @click.stop="fn2">按钮</button>
          <a @click.prevent.stop="fn3" >链接</a>
        </div>
      </div>
      <script src="lib/vue.js"></script>
      <script>
        new Vue({
          el: '#app',
          data: {
          },
          methods: {
            fn1 () {
              console.log('div 的点击事件');
            },
            fn2 () {
              console.log('button 的点击事件');
            }
            fn3 () {
              console.log('a 的点击事件');
            }
          }
        })
      </script>
    </body>
    
  • .once 修饰符
    该修饰符用于设置事件只会触发一次。
    <body>
      <div id="app">
        <button @click="fn">按钮1</button>
        <button @click.once="fn">按钮2</button>
    
      </div>
      <script src="lib/vue.js"></script>
      <script>
        new Vue({
          el: '#app',
          data: {
          },
          methods: {
            fn () {
              console.log('按钮被点击了');
            }
          }
        })
      </script>
    </body>
    

按钮修饰符

  • 按键码:指的是将按键的按键码作为修饰符使用以标识按键的操作方式,可以通过事件参数 event 查看按键的按键码。除了普通按键还有特殊按键,指的是键盘中类似 esc、enter、delete 等功能按键, 为了更好的兼容性,应首选内置别名。
<body>
  <div id="app">
    <!-- 键盘弹起事件 -->
    <input type="text" @keyup="fn">
    <!-- 当按下 a 键之后触发,a 键的 key 值为 a,keyCode 值为 49 -->
    <input type="text" @keyup.49="fn">
    <input type="text" @keyup.a="fn">
    <!-- esc 特殊按键 -->
    <input type="text" @keyup.esc="fn">
    <!-- 按键码可以串写,表示或,即按下 a 键 或 b 键 或 c 键之后触发 -->
    <input type="text" @keyup.a.b.c="fn">
  </div>
  <script src="lib/vue.js"></script>
  <script>
    new Vue({
      el: '#app',
      data: {
      },
      methods: {
        fn (event) {
          console.log(event);
          console.log('输入了对应内容');
        }
      }
    });
  </script>
</body>

系统修饰符

系统按键指的是 ctrl 、alt 、shift 等按键,单独点击系统操作符无效,通常与其他按键组合使用。

<body>
  <div id="app">
    <!-- 直接串写按键码没法实现组合效果 -->
    <!-- <input type="text" @keyup.17.q="fn"> -->

    <input type="text" @keyup.ctrl.q="fn" v-model="inputValue">
  </div>
  <script src="lib/vue.js"></script>
  <script>
    new Vue({
      el: '#app',
      data: {
        inputValue: ''
      },
      methods: {
        fn (event) {
          // console.log(event);
          this.inputValue = '';
        }
      }
    });
  </script>
</body>

鼠标按键修饰符

用于设置点击事件由鼠标哪个按键来完成。

  • .left 修饰符(按下鼠标左键)
  • .right 修饰符(按下鼠标右键)
  • .middle 修饰符(按下鼠标中键)
<body>
  <div id="app">
    <button @click.left="fn">按钮1</button>
    <button @click.right="fn">按钮2</button>
    <button @click.middle="fn">按钮3</button>
  </div>
  <script src="lib/vue.js"></script>
  <script>
    new Vue({
      el: '#app',
      data: {
      },
      methods: {
        fn() {
          console.log('点击了元素');
        }
      }
    });
  </script>
</body>

v-model 修饰符

  • .trim 修饰符:用于自动过滤用户输入内容首尾两端的空格。
  • .lazy 修饰符:用于将 v-model 的触发方式由 input 事件触发更改为 change 事件触发,也就是将每次输入数据就进行更新的方式更改为当失去焦点时才更新。
  • .number 修饰符:用于自动将用户输入的值转换为数值类型,如无法被 parseFloat() 转换,则返回原始内容。
<body>
  <div id="app">
    <!-- <input type="text" v-model.trim="inputValue">
    <p>{{ inputValue }}</p> -->

    <!-- <input type="text" v-model.lazy="inputValue">
    <p>{{ inputValue }}</p> -->

    <input type="text" v-model.number="inputValue">
    <p>{{ inputValue }}</p>
  </div>
  <script src="lib/vue.js"></script>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        inputValue: ''
      }
    });
  </script>
</body>
最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容