Vue常见的修饰符

1.事件修饰符

(1) stop
阻止事件冒泡。
(2) prevent
阻止事件默认行为
(3) once
事件只触发一次。

<!-- 点击事件将只会触发一次 -->
<a v-on:click.once="doThis"></a>

(4) capture
使用事件的捕获模式。一般事件默认都是在冒泡阶段执行的,这个内容详细见https://blog.youkuaiyun.com/fageaaa/article/details/145704595

<!-- 准备好一个容器 -->
    <div id="root">
      <!-- 开始捕获模式 -->
      <div class="normal-div">
        <div class="box1" @click.capture="showInfo('outer')">
          box1
          <div class="box2" @click="showInfo('inner')">box2</div>
        </div>
      </div>
    </div>
    <script type="text/javascript">
      const vm = new Vue({
        el: "#root",
        data() {
          return {
            address: "杭州市",
          };
        },
        methods: {
          <!-- 开始捕获模式 -->
          showInfo(text) {
            //先打印outer后打印inner
            //box1元素上的click事件开启了捕获模式。在捕获阶段就会被执行
           //box2元素上的click事件没开启了捕获模式。默认在冒泡阶段才会被执行
            console.log(text); 
          },
        },
      });
    </script>

(5) self
只有event.target是当前元素时候才会触发该事件

  <div id="root">
    <!-- 只有event.target是当前操作的元素时候才触发该事件 -->
    <div class="normal-div">
      <div class="box1" @click.self="showInfo">
        <button>点我打印信息</button>
      </div>
    </div>
  </div>
  
  <script type="text/javascript">
    const vm = new Vue({
      el: "#root",
      data() {
        return {
          address: "杭州市",
        }
      },
      methods:{
        //点击box1区域内的按钮,box1的方法showInfo不会触发;
        //点击box1区域内的按钮之外的区域  box1的方法showInfo才会触发
        showInfo(event){
          console.log("点击了!!!")
        },
      }
    })
  </script>

(6) passive

事件的默认行为立即执行,而无需等待事件回调完成才执行。

<div class="list" @wheel.passive="test">
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
</div>
//有这个passive和没有passive是有区别的,
//没有passive的时候,如果滚动滚轮,当test方法里面的事件没有执行完毕时候,滚动条是不会滚动的;
//只要test里面完全执行完毕,才会执行事件的默认行为;
 test(){
   for(let i=0;i<100000;i++){
      console.log("#")
    }
},

2.鼠标修饰符

修饰的是鼠标左键、中键、右键点击。如下:

  • click.left
  • click.right
  • click.middle
    <button @click.left="shout1(1)"
    @click.right="shout2(2)" @click.middle="shout3(3)">左键</button>

3.键盘修饰符

用于修饰键盘事件。如:

  • enter
  • .tab
  • .delete (捕获删除退格键)
  • .esc
  • .space
  • .up
  • .down
  • .left
  • .right
    <input type="text" @keyup.enter="search()">

4.v-bind修饰符

4.1 sync修饰符

可以对props进行一个双向数据绑定。如下:

//父组件文件中
<comp :myMessage.sync = "bar"></comp>

//子组件文件中
this.$emit('update:myMessage', params);

相当于下面这样子:

//父组件文件
<comp :myMessage="bar" @update:myMessage="func"></comp>
func(e){
  this.bar = e;
}
//子组件文件
func2(){
  this.$emit('update:myMessage',params);
}

总结:sync实现了props的双向绑定,它其实就是一种简写方式。在大多数时候,我们经常是在父组件文件中对子组件通过v-bind绑定数据,然后在子组件文件中用props接收数据,同时在子组件文件中通过emit将数据的值传递给父组件,父组件再触发相应的方法来改变传递给子组件的值,父组件值改变又会触发子组件中的值。现在可以直接在父组件给传递的值绑定sync修饰符,在子组件直接按相应的格式书写就可以,无需通过props接受数据。

4.2 props修饰符

v-bind默认绑定在dom节点的attribute上,使用.prop修饰符后会绑定在property(非自定义属性),并且在浏览器检查界面元素时候,会不显示。

<div id="box" class="box" :school="school"  :data.prop="data" @click="clickDiv()">
...
 data() {
   return {
      address: "杭州市",
      data:111,
      school: 2222,
      boxName:123,
   }
},
methods:{
    clickDiv(){
       let box=document.querySelector(".box")
       console.log(box.attributes)//只有id,school和class
       console.log(box.data)//111(propery需要打点才能获取属性,property获取的是元素的非自定义属性)
       console.log(box.class)//undefined(这个比较特殊)
       console.log(box.className)//box
       console.log(box.id)//非自定义属性 box
       console.log(box.school)//自定义属性 undefined
    }
}

我们可以右键或者F12检查网页元素,如下:
在这里插入图片描述
如图,不管是自定义还是非自定义属性都会显示在浏览器元素中.但如果用了prop修饰符,则可以避免暴露数据。

问题:这里要搞清楚attribute和property的区别?
通过attribute可以获取元素的自定义属性和非自定义属性(如idsrchref等);而property则是非自定义属性,只能通过打点获取。

4.3 camel修饰符

具体用法可查https://v2.cn.vuejs.org/v2/api/#v-bind

5.表单修饰符

  • v-model.lazy
    在默认情况下,v-model 在每次input事件触发后将输入框的值与数据进行同步 (除了上述输入法组合文字时)。你可以添加lazy修饰符,从而转为在change事件之后进行同步:
  • v-model.number
    如果想自动将用户的输入值转为数值类型,可以给 v-model 添加 number 修饰符。这通常很有用,因为即使在type="number" 时,HTML输入元素的值也总会返回字符串。如果这个值无法被 parseFloat() 解析,则会返回原始的值
  • v-model.trim
    如果要自动过滤用户输入的首尾空白字符,可以给 v-model 添加trim修饰符:
<!-- 在“change”时而非“input”时更新 -->
<input v-model.lazy="msg">

<input v-model.number="age" type="number">

<input v-model.trim="msg">
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太阳与星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值