Vue中的内置指令

5.1 基本指令

5.1.1 v-­cloak(遮掩) 一般与display:none进行结合使用

作用:解决初始化慢导致页面闪动的最佳实践

//css中 设置 [v-cloak] display:none ------------------------------
  <style>
    [v-cloak] {
      display: none;
    }
  </style>

 //html中  ------------------------------
  <div id="app">
    <p v-cloak> {{msg}} </p>
  </div>
  
//vue中  ------------------------------
  <script>
    var app = new Vue({
      el: '#app',
      data: {
        msg: '我是数据'
      }
    })
  </script>

5.1.2 v-­once

定义它的元素和组件只渲染一次

 //html中  ------------------------------
  <div id="app">
    <p v-once> {{msg}} </p>
  </div>
  
//vue中  ------------------------------
  <script>
    var app = new Vue({
      el: '#app',
      data: {
        msg: '我是数据'
      }
    })
  </script>

5.2 条件渲染指令

5.2.1 v-­if, v-­eles­-if ,v­-else

用法: 如果三个全用的话,就必须按照上面顺序

 <div id="app">
    <p v-if="6<3">{{apple}}</p>
    <p v-else-if="19<10">{{orange}}</p>
    <p v-else>{{banana}}</p>
  </div>

--------------------------------
 var app = new Vue({
      el: '#app',
      data: {
        apple: '我是苹果',
        orange: '我是橘子',
        banana: '我是香蕉'
      }
    })

v-if的弊端 :
Vue 在渲染元素时 ,出于效率考虑,会尽可能地复用已有的元素而非重新渲染, 因此会出现乌龙只会渲染变化的元素。
如:

//这里的弊端,input元素被复用

<div id="app">
    <div v-if="type === 'name'">
      用户名: <input type="text" placeholder="请输入用户名 ">
    </div>
    <div v-else>
      密码: <input type="text" placeholder="请输入密码">
    </div>
    <button @click="trg">点击切换</button>
  </div>

-------------------------------------------------------
 var app = new Vue({
      el: '#app',
      data: {
        type: 'name'
      },
      methods: {
        trg: function(){
          this.type = (this.type==='name' ? 'password' : 'name')
        }
      }
      
    })

解决方法:加key,提供key唯一的值可以来决定是否复用该元素
如:

// 加入了key,key的值可以随便定义
// 如果两个不相等,那么就是唯一的,如果相等,那么代表可以复用

<div id="app">
    <div v-if="type === 'name'" key="name">
      用户名: <input type="text" placeholder="请输入用户名 ">
    </div>
    <div v-else key="password">
      密码: <input type="text" placeholder="请输入密码">
    </div>
    <button @click="trg">点击切换</button>
  </div>

-------------------------------------------------------
 var app = new Vue({
      el: '#app',
      data: {
        type: 'name'
      },
      methods: {
        trg: function(){
          this.type = (this.type==='name' ? 'password' : 'name')
        }
      }
      
    })

5.2.2 v­-show

只改变了css属性display

v-­if 和 v­-show 的比较

  • v-­if:
    实时渲染:页面显示就渲染,不显示。我就给你移除
  • v-­show:
    v­-show的元素永远存在也页面中,只是改变了css的display的属性

代码举例:

// 在html中------------------------------------

<div id="app">
    <p v-show> {{msg}} </p>
</div>

//相等于 下面代码

<div id="app">
    <p style="display: none"> {{msg}} </p>
</div>

//------------------------------------------------------------------------
  var app = new Vue({
      el: '#app',
      data: {
        msg: '我是组件数据'
      } 
    })

5.3 列表渲染指令v-­for

用法: 当需要将一个数组遍历或枚举一个对象属性的时候循环显示时,就会用到列表渲染指令 v-­for。
一定是写在遍历的元素上,v-for后面接等号,内容为 '申明一变量' in 'data中要遍历的一个数组'

两种使用场景:

  1. 遍历多个对象,那么一定是数组
<div id="app">
    <ul>
      <li v-for="value in arrData"> {{value.name}} </li>
    </ul>
  </div>

-----------------------------------------------------------
 var app = new Vue({
      el: '#app',
      data: {
        arrData: [
          {name: '我是1号'},
          {name: '我是2号'},
          {name: '我是3号'},
        ]
      }
    })

---------------------------------------------------------------------------------

// 带索引的写法: 用括号,里面有两个变量,第一个为item,第二个为index 
<ul>
   <li v-for="(value,index) in vueData"> {{index}} ---- {{value.name}}  </li>
</ul>
  1. 遍历一个对象的多个属性
<div id="app">
    <ul>
      <li v-for="value in objData"> {{value}} </li>
    </ul>
  </div>

-----------------------------------------------------------
 var app = new Vue({
      el: '#app',
      data: {
        objData:{
          apple: '我是苹果',
          orange: '我是橘子',
          banana: '我是香蕉'
        }
      }
    })

---------------------------------------------------------------------------------

// 带索引的写法: 用括号,里面有三个变量,第一个为item,第二个为key,第三个为index 
<ul>
   <li v-for="(value,key,index) in vueData"> {{index}} :{{key}}---{{value.name}}  </li>
</ul>

5.4 数组更新,过滤与排序

改变数组的一系列方法:

  • push() 在末尾添加元素
  • pop() 将数组的最后一个元素移除
  • shift() 删除数组的第一个元素
  • unshift() 在数组的第一个元素位置添加一个元素
  • splice() 可以添加或者删除函数—返回删除的元素
    三个参数:
    第一个参数 表示开始操作的位置
    第二个参数表示:要操作的长度
    第三个为可选参数:
  • sort() 排序
  • reverse() 倒序
  • filter() 过滤
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
  <div id="app">
    <div v-for="value in arrData"> {{value}} </div>
    
    <hr>
    
    排序用法: sort() 
    <button @click="sortData">点我排序</button>
    
    <hr>
    
    倒序的用法: reverse()
    <button @click="revData">点我倒序 </button>
    
    <hr>
    过滤的用法: filter()  需要用到计算属性 computed
    {{filData}}
  </div>
  
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    var app = new Vue({
      el: '#app',
      data: {
        arrData: ['3331','123','666666','22555']
      },
      
      methods: {
        sortData: function(){
          this.arrData.sort(function(val1,val2){
            return val1.length - val2.length
          })
        },
        
        revData: function(){
          this.arrData.reverse()
        }
      },
      
      computed: {
        filData: function(){
          return this.arrData.filter(function(val){
            return val.match(/22/)
          })
        }
      }
      
    })
  </script>
</body>
</html>

两个数组变动vue检测不到:

  1. 改变数组的指定项
  2. 改变数组长度

解决方法:
1.set 改变指定项: Vue.set(app.arr,1,”car”);
2.splice 改变数组长度: app.arr.splice(1)

5.5 方法和事件

[object MouseEvent]

5.4.1 基本用法

v­-on绑定的事件类似于原生 的onclick等写法

<div id="app">
    点击基数:{{count}}
    
    <button @click="oneNum()">点我加1</button>
    <button @click="oneNum(10)">点我加10</button>
  </div>

------------------------------------------------------------------------------
var app = new Vue({
      el: '#app',
      data: {
        count: 100
      },
      
      methods: {
        oneNum: function(val){
          val = val || 1
          this.count = this.count + val
        }
      }
      
    })

如果方法中带有参数,但是没有加括号,默认传原生事件对象event

5.4.2 修饰符

在vue中传入event对象用 $event

向上冒泡

  • stop 阻止单击事件向上冒泡
  • prevent 提交事件并且不重载页面
  • self 只是作用在元素本身而非子元素的时候调用
  • once 只执行一次的方法

可以监听键盘事件:
<input @keyup.13 ="submitMe"> ——­指定的keyCode

<div id="app">
    stop: 阻止单击事件向上冒泡
    <div @click="divClick" style="width: 100px; height: 100px; background-color: red;">
      <button @click.stop="btnClick">点击</button>
    </div>

    <hr>
    prevent: 提交事件并且不重载
    <form action="" @submit.prevent="hangle">
      <button type="submit">提交表单</button>
    </form>

    <hr>
    self: 只是作用在元素本身而非子元素的时候调用
    <div @click.self="divClick" style="width: 100px; height: 100px; background-color: red;">
      <button @click="btnClick">点击</button>
    </div>

    <hr>
    once: 只执行一次 <br>
    <button @click="onceClick">执行无数次</button>
    <button @click.once="onceClick">执行一次</button>

    <hr>
    监听键盘事件:
    <br>

    <input type="text" @keyup.13="submitMe"> <!--其中13 代表 Enter键-->

    <input type="text" @keyup.enter="submitMe">
  </div>

----------------------------------------------------------------------

var app = new Vue({
      el: '#app',
      methods: {
        divClick: function(){
          alert('div被点击了')
        },
        btnClick: function(){
          alert('botton被点击了')
        },
        hangle: function(){
          alert('我不重载了')
        },
        onceClick: function(){
          alert('开始执行了')
        },
        submitMe: function(){
          alert('你按下了Enter')
        }
      }
    })

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 主要还是自己看的,所有内容来自官方文档。 介绍 Vue.js 是什么 Vue (读音 /vjuː/,类似于 vie...
    Leonzai阅读 8,703评论 0 25
  • 1.安装 可以简单地在页面引入Vue.js作为独立版本,Vue即被注册为全局变量,可以在页面使用了。 如果希望搭建...
    Awey阅读 13,797评论 4 129
  • 1. Vue 实例 1.1 创建一个Vue实例 一个 Vue 应用由一个通过 new Vue 创建的根 Vue 实...
    王童孟阅读 4,626评论 0 2
  • vue概述 在官方文档中,有一句话对Vue的定位说的很明确:Vue.js 的核心是一个允许采用简洁的模板语法来声明...
    li4065阅读 12,089评论 0 25
  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 10,473评论 0 29

友情链接更多精彩内容