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')
        }
      }
    })

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

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