【Vue】7 - 修饰符 modifires 、template 、 动态绑定样式(:class / :style)

1. 修饰符 modifires

修饰符可以帮我们处理一些事件、键盘码、事件源等一些问题

  1. .stop – 阻止默认冒泡、捕获等(阻止事件传播) 等于: e.propagation(); 或者 IE的 e.cancelBubble= true;

  2. .capture – 设置捕获 等于: xxx.addEventListener('click',fn,true);

  3. .prevent – 阻止默认行为 等于:e.preventDafault() / returnValue = false 阻止默认事件 – a标签,form表单的submit的默认行为

  4. .once – 只执行一次 等于: on('click') off('click')

  5. .self --判断事件源绑定事件 e.target / e.srcElement-只有点击自己的时候触发,不会经过冒泡或捕获触发

冒泡 和 捕获

冒泡:
1.父子关系,例如:点击grandson元素,会冒泡向上触发child 和parent的点击事件
2.阻止冒泡:给孙子添加事件源: e.propagation(); 或者 IE的 e.cancelBubble= true;,vue修饰符:.stop
3. 这个都算是处理事件细节的问题,我们可以使用修饰符
4.不想让孙子 点击的时候 冒泡,给孙子加@事件.stop ='fn'

捕获:和冒泡 相对的是捕获,默认是冒泡
1. 设置捕获:二级绑定 xxx.addEventListener('click',fn,true); //true 是捕获, false是冒泡,默认不写是false-冒泡
2. vue提供修饰符.capture, 给父级加 @事件.capture = 'fn' ,这样点击子级,它的父级会先捕获到先执行

捕获和冒泡那个先执行:
正常的点击孙子按照冒泡一层一层向上走,但若父级捕获了,点击孙子会先执行捕获的父级,然后执行孙子,然后向上冒泡执行没有捕获的

定义方法

 methods:{  
        parent(){alert('parent');},
        child(){alert('child');},
        grandson(){alert('grandson'); }
    }

冒泡:默认冒泡,点击孙子,会一层层向上触发点击事件,弹出grandson - child -parent

 <div class="parent" @click='parent'>parent
     <div class="child" @click='child'>child
         <div class="grandson" @click='grandson'>grandson</div>
         <!-- 冒泡:点击孙子,会一层层向上触发点击事件,弹出grandson - child -parent-->
     </div>
 </div>

捕获:添加修饰符.capture,点击孙子,会从上到下一层层向下触发点击事件,弹出parent- child -grandson

 捕获:添加修饰符`.capture`,点击孙子,会从上到下一层层向下触发点击事件,弹出parent- child -grandson 
<div class="parent" @click.capture='parent'>parent
    <div class="child" @click.capture='child'>child
        <div class="grandson" @click.capture='grandson'>grandson</div>
    </div>
</div>

捕获 和 冒泡先捕获,再冒泡;点击孙子,先执行有捕获的,然后按冒泡执行没有捕获的,弹出parent -grandson -child

捕获 和 冒泡:点击孙子,先执行有捕获的,然后按冒泡执行没有捕获的,弹出parent -grandson -child 
<div class="parent" @click.capture='parent'>parent
   <div class="child" @click='child'>child
       <div class="grandson" @click='grandson'>grandson</div>
   </div>
</div>

阻止捕获 或 冒泡(阻止事件传播): 点击孙子,跳出parent,然后就不再传播了

阻止捕获 或 冒泡(阻止事件传播): 点击孙子,跳出parent,然后就不再传播了
<div class="parent" @click.capture.stop='parent'>parent
<div class="child" @click='child'>child
    <div class="grandson" @click='grandson'>grandson</div>
</div>

阻止默认行为

修饰符: .prevent 等于原生的e.preventDafault() / returnValue = false 阻止默认事件

阻止a标签默认跳转行为,执行click弹出child,还可以阻止form表单中的summit提交按钮,会自己提交的默认行为

<a href="http://baidu.com" @click.prevent='child'>1111</a>

2. template

  1. template标签是vue提供给我们的,没有任何实际的意义,用来包裹元素用的
  2. v-show不支持template,只有v-if 可以放在template标签上
 <div v-if='false'>111</div>
 <div v-if='false'>222</div>
 <div v-if='false'>333</div>
 <div>hello</div>
<template v-if='false'>  
    <div>111</div>
    <div>222</div>
    <div>333</div>
</template>

<div>hello</div>

切换标签:

<button @click='flag = !flag'>切换</button>
<template v-if='flag'>
   <label for="">登录</label>
   <input type="text" key='1'>
   <!-- 默认情况下再切换dom时相同的结构会被复用,如果不需要复用,需要加key -->
   <!--  :key='1'  有冒号,里面时变量,这是数字1,    key='1'  没有冒号就是字符串1-->
</template>
<template v-else>
    <label for="">注册</label>
    <input type="text" key='2'>
 </template>

3.动态绑定样式

v-bind: 动态绑定’属性’, class 或style 使用两种方式写:对象 或 数组

:class = “对象/数组”

class:

  1. :class绑定的样式 和 class绑定的不冲突 ,:class的值可以是对象或者数组
  2. 对象写法::class="{z:flag,y:true}" 注意{}放在“”里,值true生效
  3. 数组: :class="[class1,class2,'m']" class1/class2是变量,m不是变量,就是类名
         <!-- v-bind: 动态绑定'属性',class 或style 使用两种方式写:对象 或 数组 -->
        
         <div class="font1" :class="flag ? 'red':'' ">111</div>
         <!-- :class绑定的样式 和 class绑定的不冲突 ,:class的值可以时对象或者数组 -->
        
         <div class="font2" :class="{font1:flag,green:true}">222</div>
         <div class="font2" :class="{true:'font1 green',false:'blue'}[true]">333</div>
        <!-- 对象: :class="{z:flag,y:true}"   注意{}放在“”里,值true生效 -->

         <div :class="[class1,class2,'blue']">444</div>
         <div :class="[class1,class2,{red:false}]">555</div>
        <!-- 数组: :class="[class1,class2,'m']"    class1/class2是变量,m不是变量,就是类名 -->
        
        <hr>
        <!-- 隔行换色 -->
        <ul>
            <li v-for='(a,index) in 10' :class='{red:index%2}'>{{a}}</li>
        </ul>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="shortcut icon" href="#" type="image/x-icon">
    <style>
        .red{
        background: red;
        }
        .blue{
        background: blue;
        }
        .green{
        background: green;
        }
        .font1{
            font-weight: 900;
        }
        .font2{
            color:palevioletred;
        }
    </style>
</head>
<body>
    <div id="app">   
         <!-- v-bind: 动态绑定'属性',class 或style 使用两种方式写:对象 或 数组 -->
        
         <div class="font1" :class="flag ? 'red':'' ">111</div>
         <!-- :class绑定的样式 和 class绑定的不冲突 ,:class的值可以时对象或者数组 -->
        
         <div class="font2" :class="{font1:flag,green:true}">222</div>
         <div class="font2" :class="{true:'font1 green',false:'blue'}[true]">333</div>
        <!-- 对象: :class="{z:flag,y:true}"   注意{}放在“”里,值true生效 -->

         <div :class="[class1,class2,'blue']">444</div>
         <div :class="[class1,class2,{red:false}]">555</div>
        <!-- 数组: :class="[class1,class2,'m']"    class1/class2是变量,m不是变量,就是类名 -->
        
        <hr>
        <!-- 隔行换色 -->
        <ul>
            <li v-for='(a,index) in 10' :class='{red:index%2}'>{{a}}</li>
        </ul>

        <!-- ------------style------------ -->
        <div style='font-size:18px;' :style="{backgroundColor:'red',color:'#fff'}">style样式</div>
        <div :style="[style1,style1,{fontSize:'14px;'}]">style 222</div>
    </div>
    <script src="node_modules/vue/dist/vue.js"></script>
    <script>
        let vm = new Vue({ 
        el:'#app',
        
        data:{
            class1:'font1',
            class2:'font2',
            style1:{backgroundColor:'blue'},
            style2:{color:'green'},
            flag:true,
        }
    })
    </script>
</body>
</html>

:style =“对象 / 数组”

  1. 属性名要使用小驼峰命名
<div style='font-size:18px;' :style="{backgroundColor:'red',color:'#fff'}">style样式</div>

<div :style="[style1,style1,{fontSize:'14px;'}]">style 222</div>
发布了57 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Eva3288/article/details/104238371