Vue基本指令

带特殊前缀的HTML 特性,可以让 Vue.js 对一个 DOM 元素做各种处理。比如:<div v-text="message"></div>;这里的 div 元素有一个 v-text 指令,其值为messageVue.js会让该div的文本内容与 Vue实例中的 message 属性值保持一致。
Directives可以封装任何DOM 操作。比如v-attr 会操作一个元素的特性;v-repeat会基于数组来复制一个元素;v-on会绑定事件等。

Vue.js提供了不少常用的内置指令,接下来我们快速搞定它们,这对我们接下来的开发帮助很大。主要有:

  • v-once指令
  • v-if指令
  • v-show指令
  • v-else指令
  • v-for指令
  • v-model指令
  • v-on指令
  • v-bind指令

如果需要了解其它指令,可以进入 官网

v-if:

v-if指令可以完全根据表达式的值在DOM中生成或移除一个元素。如果v-if表达式赋值为false,那么对应的元素就会从DOM中移除;否则,对应元素的一个克隆将被重新插入DOM中,代码如下:

<div id="example-2">
  <p v-if="greeting"></p>
</div>

<script type="text/javascript">
  var exampleVM2 = new Vue({
    el:'#example-2',
    data:{
      greeting:true
    }
  })
</script>

由于v-if是一个指令,需要将它添加到一个元素上。但是如果想要切换多个元素,则可以把<template>元素当做包装元素,并在其上使用v-if,最终的渲染结果不会包含它。代码如下:

<div id="example-2">
  <template v-if="greeting">
    <h1>Title</h1>
    <p>Paragraph</p>
    <p>Paragraph</p>
  </template >
</div>

<script type="text/javascript">
  var exampleVM2 = new Vue({
    el:'#example-2',
    data:{
      greeting:true
    }
  })
</script>

v-show

v-show指令是根据表达式的值来显示或者隐藏HTML元素。当v-show赋值为false时,元素被隐藏。查看DOM时,会发现元素上多了一个内联样式style="display:none"如图所示:

v-show和v-if的区别:

  • v-if 是真实的条件渲染,因为它会确保条件块在切换当中适当地销毁与重建条件块内的事件监听器和子组件; v-show 则只是简单地基于 CSS 切换。

  • v-if 有更高的切换消耗而 v-show 有更高的初始渲染消耗。因此,如果需要频繁切换使用 v-show 较好,如果在运行时条件不大可能改变则使用 v-if 较好。

v-else

v-else就是JavaScript中的else的意思,它必须跟着v-if或者v-show使用。如下代码:

<div id="example">
  <p v-if="ok">我是对的</p>
  <p v-else="ok">我是错的</p>
</div>
<script type="text/javascript">
  var exampleVM2 = new Vue({
    el:'#example',
    data:{
      ok:false
    }
  })
</script>

v-model

v-model指令用来在inputselecttextcheckboxradio等表单控件元素上创建双向数据绑定的。根据控件类型v-model自动选取正确的方法更新元素。代码如下:

<div id="example">
  <form>
    <input type="text" v-model="data.name" placeholder="姓名"/>
    <br/>
    <input type="radio" id="one" value="One" v-model="data.sex"/>
    <label for="man">男</label>
    <input type="radio" id="two" value="Two" v-model="data.sex"/>
    <label for="male">女</label>
    <br/>
    <input type="checkbox" id="jack" value="book" v-model="data.interest"/>
    <label for="jack">阅读</label>
    <input type="checkbox" id="john" value="awim" v-model="data.interest"/>
    <label for="john">游泳</label>
    <input type="checkbox" id="move" value="game" v-model="data.interest"/>
    <label for="move">游戏</label>
    <input type="checkbox" id="mike" value="song" v-model="data.interest"/>
    <label for="mike">唱歌</label>
    <br/>
    身份:
    <selecrt v-model="data.identity">
      <option value="teacher" selected>教师</option>
      <option value="doctor" selected>医生</option>
      <option value="lawyer" selected>律师</option>
    </select>
  </form>
</div>
<script type="text/javascript">
  new Vue({
    el:'#example',
    data:{
      data:{
        name:'',
        sex:'',
        interest:[],
        identity:''
      }
    }
  })
</script>
  • 除了以上用法,在v-model指令后面还可以添加多个参数(number、lazy、debounce)。

1.number

如果想要用户的输入自动转换为Number类型(如果原值的转换结果为NAN,则返回原值),则可以添加一个number特性。

2.lazy

在默认情况下,v-modelinput事件中同步输入框的值与数据,我们可以添加一个lazy特性,从而将数据改到在change事件中发生。代码如下:

<div id="example">
  <input v-model="msg" lazy style="width:500px">
  <br/>
  {{msg}}
</div>
<script type="text/javascript">
  new Vue({
    el:'#example',
    data:{
      msg:'内容是在change事件后才改变的~'
    },
    watch:{}
  })
</script>

3.debounce

设置一个最小的延时,在每次敲击之后延时同步输入框的值与数据。如果每次更新都要进行高耗操作(例如,在input中输入内容时要随时发送ajax请求),那么它较为有用。

<input v-model="msg" debounce="5000"/>

v-for

基于数据渲染一个列表,类似于JS中的遍历。其数据类型可以是 Array | Object | number | string
该指令之值,必须使用特定的语法(item,index) in items, 为当前遍历元素提供别名。v-for的优先级别高于v-if之类的其他指令

<div id="example">
  <ul>
    <li v-for="item of items" class="item-{{$index}}">
      {{$index}} - {{parentMessage}} - {{item.msg}}
    </li>
  </ul>
</div>
<script type="text/javascript">
  new Vue({
    el:'#example',
    data:{
      parentMessage:'滴滴',
      items:{
        {mag:'顺风车'},
        {mag:'专车'},
      }
    },
  })
</script>

v-for也支持整数

<div>
  <span v-for="n in 10">{{n}}</span>
</div>

或者

<div>
  <span v-for="n in 10">{{$index}}</span>
</div>

v-once

执行一次性地插值,当数据改变时,插值处的内容不会更新

<html>
<head>
  <title></title>
  <script src="https://unpkg.com/vue"></script>
</head>
<body>
<div id="app">
  <p>可以改变:{{msg}}</p>
  <p v-once>不可以改变:{{msg1}}</p>
</div>
<script type="text/javascript">
  var app = new Vue({
    el:'#app',  // element
    data:{
      msg:'Hello Vue!',
      msg1:'Hello Vue!'
    },
  })
</script>
</body>
</html>

v-on

动态地绑定一个或多个特性,或一个组件 prop 到表达式;其作用和v-bind类似。注意:如果用在普通元素上时,只能监听 原生 DOM事件;但是如果用在自定义元素组件上时,也可以监听子组件触发的自定义事件。

常用的修饰符包括:

  • .stop - 调用 event.stopPropagation();停止冒泡。
  • .prevent - 调用 event.preventDefault();停止监听原生事件。
  • .capture - 添加事件侦听器时使用 capture 模式。
  • .self - 只当事件是从侦听器绑定的元素本身触发时才触发回调。
  • .{keyCode | keyAlias} - 只当事件是从侦听器绑定的元素本身触发时才触发回调。
  • .once - 触发一次。

使用手法:

<!-- 方法处理器 -->
<button v-on:click="doThis"></button>

<!-- 内联语句 -->
<button v-on:click="doThat('hello', $event)"></button>

<!-- 缩写 -->
<button @click="doThis"></button>

<!-- 停止冒泡 -->
<button @click.stop="doThis"></button>

<!-- 阻止默认行为 -->
<button @click.prevent="doThis"></button>

<!-- 阻止默认行为,没有表达式 -->
<form @submit.prevent></form>

<!--  串联修饰符 -->
<button @click.stop.prevent="doThis"></button>

<!-- 键修饰符,键别名 -->
<input @keyup.enter="onEnter">

<!-- 键修饰符,键代码 -->
<input @keyup.13="onEnter">

<!-- the click event will be triggered at most once -->
<button v-on:click.once="doThis"></button>
<div id="example">
  <button v-on:click="greet">Greet</button>
</div>
var vm = new Vue({
  el:'#example',
  data:{
    name:'vue.js',
  },
  //在methods对象中定义方法
  methods:{
    greet:function(event){
      // 方法内this指向vm
      alert('Hello' + this.name + '!')
      //event是原生DOM事件
      alert(event.target.tagName)
    }
  }
})
// 也可以在JavaScript代码中调试方法
vm.greet(); // ->'Hello Vue.js!'

v-bind

动态地绑定一个或多个特性,或一个组件prop到表达式。v-bind指令可以在其名称后面带一个参数,中间用一个冒号隔开。这个参数通常是HTML元素的特性(attribute),比如:

  • v-bind:src="imageSrc" 可以缩写: :src="imgaeSrc"

  • :class="{ red: isRed }":class="[classA, classB]"

  • :style="{ fontSize: size + 'px' }":style="[styleObjectA, styleObjectB]"

  • 绑定一个有属性的对象,比如:v-bind="{ id: someProp, 'other-attr': otherProp }"

  • 语法结构:v-bind:argument="expression"

因为Mustache不能在 HTML 属性中使用,应使用 v-bind 指令,Mustache 是一个logic-less (轻逻辑)模板解析引擎,它的优势在于可以应用在 JavascriptPHPPythonPerl等多种编程语言中。

<!-- 完整语法 -->
<a v-bind:href="url"></a>

<!-- 缩写-->
<a :href="url"></a>

<!-- 完整语法 -->
<button v-bind:disablad="someDynamicCondition">Button</button>

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