Vue核心知识-Vue的原生指令

v-text

标签中显示的内容。

与双大括号写法类似,区别是没有双大括号灵活,如<div v-text="'Text:' + text"></div>,双大括号<div>Text: {{text}}</div>

import Vue from 'vue'

new Vue({
  el: '#root',
  template: `
    <div v-text="text"></div>
  `,
  data: {
    text: 1,
    active: false
  }
})

v-html

把内容作为 HTML 插入标签中。

new Vue({
  el: '#root',
  template: `
      <div v-html="html"></div>
  `,
  data: {
    html: '<span>this is html</span>'
  }
})

v-show

是否显示节点。

原理:在对应节点添加样式 display:none;

new Vue({
  el: '#root',
  template: `
    <div>
      <div v-show="active">{{text}}</div>
    </div>
  `,
  data: {
    text: 1,
    active: false
  }
})

v-if

是否把节点放在文档流中。

new Vue({
  el: '#root',
  template: `
    <div>
      <div v-if="active">{{text}}</div>
    </div>
  `,
  data: {
    text: 1,
    active: false
  }
})

如果只是控制显示与隐藏,使用 v-show;如果使用 v-if,会动态增删节点,引起重绘和重排,影响性能。

v-else

v-if 配合并列使用。

new Vue({
  el: '#root',
  template: `
    <div>
      <div v-if="active">{{text}}</div>
      <div v-else>else content</div>
    </div>
  `,
  data: {
    text: 1,
    active: false
  }
})

v-else-if

v-if v-else 配合并列使用。

new Vue({
  el: '#root',
  template: `
    <div>
      <div v-if="active">{{text}}</div>
      <div v-else-if="text === 1">else if content</div>
      <div v-else>else content</div>
    </div>
  `,
  data: {
    text: 1,
    active: false
  }
})

v-for

遍历显示。

new Vue({
  el: '#root',
  template: `
      <ul>
        <li v-for="item in arr">{{item}}</li>
      </ul>
  `,
  data: {
    arr: [1, 2, 3]
  }
})

index

拿到 index

new Vue({
  el: '#root',
  template: `
      <ul>
        <li v-for="(item, index) in arr">{{item}}:{{index}}</li>
      </ul>
  `,
  data: {
    arr: [1, 2, 3]
  }
})

遍历对象

new Vue({
  el: '#root',
  template: `
      <ul>
        <li v-for="(val, key) in obj">{{val}}:{{key}}</li>
      </ul>
  `,
  data: {
    obj: {
      a: '123',
      b: '456',
      c: '789'
    }
  }
})

遍历对象时的 index

和遍历数组一样,也是0,1,2...

JS 的逻辑:通过 Object.keys() 得到对 key 值的数组,从而得到 index

new Vue({
  el: '#root',
  template: `
      <ul>
        <li v-for="(val, key, index) in obj">{{val}}:{{key}}:{{index}}</li>
      </ul>
  `,
  data: {
    obj: {
      a: '123',
      b: '456',
      c: '789'
    }
  }
})

key

使用 v-for 时,需要给每一项加 key值。

一般情况下,我们 使用 v-for 做数据列表,这对应后台的数据,数据一般有自己的 id,把唯一的 id 作为 key 值。由于数据经常变动,vue 会重新渲染列表,并放入 DOM 中,性能开销比较大。如果指定 key,在下一次遍历中,vue 从缓存中拿到相同的 key,就会复用 key 所在的节点,不需要重新生成,从而节省性能开销

推荐不要使用 index 作为 key,因为数组元素顺序的变化,和数组内容是没有关系的,可能导致错误的缓存

// 这里把 item 作为 key,正常使用 id值
new Vue({
  el: '#root',
  template: `
      <ul>
        <li v-for="(item, index) in arr" :key="item">{{item}}:{{index}}</li>
      </ul>
  `,
  data: {
    arr: [1, 2, 3]
  }
})

v-on

事件监听

简写,@

v-on 其实是在 vue 对象实例上绑定事件,方便我们在 template 中使用,对应着vm.$on()的操作;可以理解成拿到 vue 组件对象后,通过 $on 绑定事件。如果是 div 节点,它并不是 vue 的实例,v-on 会进行判断,如果是 dom 节点,会使用 addEventListener 的方式添加事件,如果是 vue 组件,使用 $on添加事件

new Vue({
  el: '#root',
  template: `
      <div @click="clickDiv">click this div</div>
  `,
  methods: {
    clickDiv () {
      console.log('clicked')
    }
  }
})

v-bind

v-model

默认用在 input 上。

给自定义组件加上 v-model。

给表单绑定数据。

绑定 input

new Vue({
  el: '#root',
  template: `
    <div>
      <div>{{text}}</div>
      <input type="text" v-model="text"/>
    </div>
  `,
  data: {
    text: 1,
  }
})

绑定 checkbox

显示数组中的一列值,勾选 arr 中有,不勾选 arr 中没有。

new Vue({
  el: '#root',
  template: `
      <div>
        <input type="checkbox" :value="1" v-model="arr"/>
        <input type="checkbox" :value="2" v-model="arr"/>
        <input type="checkbox" :value="3" v-model="arr"/>
      </div>
  `,
  data: {
    arr: [1, 2, 3]
})

绑定 radio

new Vue({
  el: '#root',
  template: `
      <div>
        <input type="radio" value="one" v-model="picked"/>
        <input type="radio" value="two" v-model="picked"/>
      </div>
  `,
  data: {
    picked: ''
  }
})

修饰符

.number

把输入的数据转换成 number 类型。

new Vue({
  el: '#root',
  template: `
      <input type="text" v-model.number="text"/>
  `,
  data: {
    text: 1
  }
})

.trim

去除首尾空格。

<input type="text" v-model.trim="text"/>

.lazy

监听方式不同,input 输入过程,并不会改变数据,点开一次性改变。

<input type="text" v-model.lazy="text"/>

v-pre

使用 v-pre 后,div 中的内容都不会被解析,也就是原样显示。

<div v-pre>{{text}}</div>

v-cloak

webpack开发的项目都用不到。

使用唯一场景:直接在页面上,引入了 vue 的库代码,在页面上写 vue 的代码,模板是写在 body 的 html 中,浏览器原样显示,用户体验差,这时使用 v-cloak,在 vue 代码没有加载完成前,给 vue 代码加一个隐藏样式(display:none:),当 vue 代码加载完成后,vue 第一时间会把这个隐藏样式去掉。

基本用不到。

<div v-clock>{{text}}</div>

v-once

数据绑定的内容只执行一次。

使用场景:对应节点内容都是静态内容,没有动态数据。

作用:节省性能开销,vue 不会再次检测,不会进行虚拟 DOM 的对比。

new Vue({
  el: '#root',
  template: `
    <div>
      <div v-once>{{text}}</div>
      <input type="text" v-model="text"/>
    </div>
  `,
  data: {
    text: 1,
  }
})

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

推荐阅读更多精彩内容

  • 文/郑茜月 (小学二年级) 3月1日 天气阴得不想晴了 星期六 “我的兔子被送人了” 早上,起来听到这个万分...
    兰情二月天阅读 601评论 28 26
  • 有多少梦想在心怀,不是说好的要为梦想努力吗! 漆黑的夜里走在无人街道,看不清前进路,被黑雾霾隔阂,365天的努力只...
    果果儿阅读 85评论 0 0
  • 一窗浅月 透了朦胧的云帐 照了长亭 照了野径 照了一湖温凉荡漾的清波水 让它将心事 化作湖心层层涟漪起伏的倒影 三...
    寞霏阅读 430评论 5 3
  • 大豆11个月刚学会走路的时候,特别喜欢自己走路,任何人都不让抱,每次我对他伸手求抱抱,都被他粗暴的甩开,然...
    赵大刘阅读 254评论 0 1