vue指令与事件修饰符

一.条件渲染指令

  vue中提供了两个指令可以用于判断是否要显示元素,分别是v-if和v-show。

  实例:

<!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>
    <script src="js/vue.js"></script>
</head>
<body>
    <div id="app">
        <p v-if='is_login==true'>欢迎登陆</p>
        <p v-else><a href="">登录</a><a href="">注册</a></p>
        <!-- v-else不能单独使用,只能跟着v-if或者跟着v-else-if后面,表示或者的意思
        v-else会使用上一个v-if作为条件判断,并且v-else和v-if必须紧密相连 -->


                <!-- 一次只会出现一个结果
        v-else-if可以有多个,但是和v-else一样,必须紧跟这v-if后面,不能单独使用 -->
        
        <p v-if='num%3==0'>这个数可以被3整除</p>
        <p v-else-if='num%5==0'>这个数可以被5整除</p>
        <p v-else-if='num%7==0'>这个数可以被7 整除</p>
        <p v-else>这个数比较特别</p>



        <!-- v-show只能单独使用,后面无法跟v-else -->
        <p v-show="num>10">num大于10</p>
        <p v-show="num<=10">num小于等于10</p>
    </div>





    <script>
        let vm=new Vue({
            el:'#app',
            data:{
                is_login:false,
                num:5
  
            },


        })
    
    
    </script>
    
</body>
</html>
代码

总结:

1.  v-if 的特点:每次都会重新删除或创建元素 

2.  v-show 的特点: 每次不会重新进行DOM的删除和创建操作,只是切换了元素的 display:none 样式 

3. v-if 有较高的切换性能消耗 

4. v-show 有较高的初始渲染消耗 

5. 如果元素涉及到频繁的切换,最好不要使用 v-if, 而是推荐使用 v-show 

6. 如果元素可能永远也不会被显示出来被用户看到,则推荐使用 v-if 

7. v-if后面可以跟else,v-show后面不能跟else

 

二.列表渲染指令(v-for)

  1.在vue中,可以通过v-for指令可以将一组数据渲染到页面中,数据可以是数组或者对象(python中的字典)。

  实例一:

<!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>
  <script src="./lib/vue-2.4.0.js"></script>
</head>

<body>
  <div id="app">
    <p v-for="(item, i) in list">索引值:{{i}} --- 每一项:{{item}}</p>
  </div>

  <script>
    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {
        list: [1, 2, 3, 4, 5, 6]
      },
      methods: {}
    });
  </script>
</body>

</html>
列表

  实例二:

<!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>
  <script src="./lib/vue-2.4.0.js"></script>
</head>

<body>
  <div id="app">
    <p v-for="(user, i) in list">Id:{{ user.id }} --- 名字:{{ user.name }} --- 索引:{{i}}</p>
  </div>

  <script>
    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {
        list: [
          { id: 1, name: 'zs1' },
          { id: 2, name: 'zs2' },
          { id: 3, name: 'zs3' },
          { id: 4, name: 'zs4' }
        ]
      },
      methods: {}
    });
  </script>
</body>

</html>
对象

  实例三:

<!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>
  <script src="./lib/vue-2.4.0.js"></script>
</head>

<body>
  <div id="app">
    <!-- 注意:在遍历对象身上的键值对的时候, 除了 有  val  key  ,在第三个位置还有 一个 索引  -->
    <p v-for="(val, key, i) in user">值是: {{ val }} --- 键是: {{key}} -- 索引: {{i}}</p>
  </div>

  <script>
    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {
        user: {
          id: 1,
          name: '托尼·屎大颗',
          gender: ''
        }
      },
      methods: {}
    });
  </script>
</body>

</html>
带索引的对象

  实例四:循环数字从1开始,是一个闭区间

<!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>
  <script src="./lib/vue-2.4.0.js"></script>
</head>

<body>
  <div id="app">
    <!-- in 后面我们放过  普通数组,对象数组,对象, 还可以放数字 -->
    <!-- 注意:如果使用 v-for 迭代数字的话,前面的 count 值从 1 开始,还是一个闭区间 -->
    <p v-for="count in 10">这是第 {{ count }} 次循环</p>
  </div>

  <script>
    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {},
      methods: {}
    });
  </script>
</body>

</html>    
数字

  实例五:v-forkey的使用

<!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>
  <script src="./lib/vue-2.4.0.js"></script>
</head>

<body>
  <div id="app">

    <div>
      <label>Id:
        <input type="text" v-model="id">
      </label>

      <label>Name:
        <input type="text" v-model="name">
      </label>

      <input type="button" value="添加" @click="add">
    </div>

    <!-- 注意: v-for 循环的时候,key 属性只能使用 number获取string -->
    <!-- 注意: key 在使用的时候,必须使用 v-bind 属性绑定的形式,指定 key 的值 -->
    <!-- 在组件中,使用v-for循环的时候,或者在一些特殊情况中,如果 v-for 有问题,必须 在使用 v-for 的同时,指定 唯一的 字符串/数字 类型 :key 值 -->
    <p v-for="item in list" :key="item.id">
      <input type="checkbox">{{item.id}} --- {{item.name}}
    </p>
  </div>

  <script>
    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {
        id: '',
        name: '',
        list: [
          { id: 1, name: '李斯' },
          { id: 2, name: '嬴政' },
          { id: 3, name: '赵高' },
          { id: 4, name: '韩非' },
          { id: 5, name: '荀子' }
        ]
      },
      methods: {
        add() { // 添加方法
          this.list.unshift({ id: this.id, name: this.name })
        }
      }
    });
  </script>
</body>

</html>
key的使用

 

三.事件修饰符

  .stop阻止事件冒泡

  .prevent阻止自身事件

  .self只有自身事件才会触发

  .capture:捕获事件

  实例:

<!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>
    <script src="js/vue.js"></script>
    <style>
        .inner{
            background: blue;
            height: 150px;
        }
    
        .outer{
            background:yellow;
            padding:40px; 

        }
    </style>
</head>
<body>
        <div id='app'>
            <!-- 使用了.stop 阻止冒泡--外层的事件不会被触发-->
            <!-- <div class='inner' @click='innerHandle'>
                <input type="button" value='抽我' @click.stop='btnHandle'>
            </div> -->

            <!-- 使用了.prevent 阻止默认行为,连接就不会跳转 -->
            <!-- <a href="http://www.baidu.com" @click.prevent='link'>连接事件</a> -->

            <!-- 使用了.capture 实现捕获触发事件机制,从外到里执行,注意看这个修饰方法是法作用在外层的-->
            <!-- <div class='inner' @click.capture='innerHandle'>
                <input type="button" value='抽我' @click='btnHandle'>
            </div> -->

            <!-- .self自由是自身点击才会执行,冒泡或者捕获到的都不会执行 -->
            <!-- <div class='inner' @click.self='innerHandle'>
                <input type="button" value='抽我' @click='btnHandle'>
            </div> -->

            <!--只阻止一次,preven和once的位置没有关系 -->
            <!-- <a href="http://www.baidu.com" @click.prevent.once='link'>连接事件</a> -->

            <!-- .stop和.self的区别 -->
            <!-- .self自会阻止自身点击事件,并不会阻止冒泡行为,中间层被self拦截,外层的冒泡行为继续 -->
            <!-- stop除了自身,所有的冒泡行为继续 -->
            <div class="outer" @click='outer'>
                <div class='inner' @click.self='innerHandle'>
                    <input type="button" value='抽我' @click='btnHandle'>
                </div>
            </div>  


        </div>  



    <script>
        let vm=new Vue({
            el:'#app',
            data:{


            },
            methods: {
                btnHandle:function() {
                    console.log('操你大爷')
                    
                },
                innerHandle:function(){
                    console.log('inner')
                },
                link:function(){
                    console.log('触发了连接事件')
                },
                outer:function(){
                    console.log('outer')

                }
                
            },
        })   
 
    </script>
</body>
</html>
事件修饰

 

posted @ 2019-03-09 16:46  阿布_alone  阅读(502)  评论(0编辑  收藏  举报
TOP