Vue常用指令

vue.js官方给自己的定为是数据模板引擎,并给出了一套渲染数据的指令.

  • v-if
  • v-show
  • v-for
  • v-text
  • v-html
  • v-clock
  • v-bind
  • v-on
  • v-model

v-if , v-show指令

v-if = "expression" : 根据表达式的真假来删除和插入元素

v-show = "expression" : 不会每次都去删除和创建DOM元素 , 而是通过dispaly:none将元素隐藏起来

  • 我们用的指令中,v-if也是比较多的。
    • 当你设置为false的时候,当前条件块里包含的元素会被销毁,如果包含的是组件,则组件对应的生命周期函数(beforeDestroy,destroyed等)会执行。
    • 当你设置为true的时候,当前条件块里的元素会被重建,如果包含的是组件,则组件对应的生命周期函数(created,mounted等),计算属性,watch等会执行,相当于重新渲染。

v-if 例子 v-else

  • v-else是搭配v-if使用的,它必须紧跟在v-if或者v-else-if后面,否则不起作用。
<body>
  <div id="app">
    <h1 v-if="yes">yes!</h1>
    <h1 v-if="age > 16">age : {{age}}</h1>
    <h1 v-if="name.indexOf('i') > 0">name : {{name}}</h1>

    <a v-if="yes">yes</a>
<a v-else>No</a>

  </div>

  <script>
    new Vue({
      el: '#app',
      data: {
        yes: false, // 如果是true则显示内容 , false则不会显示
        age: 18,
        name: 'wickson'
      }
    })
  </script>
</body>

v-show 例子

<body>
    <div id="app">

        <div class="show">

            <h2 v-show='show'>
                healo apple store
            </h2>

        </div>

        <button @click='handleShow'> 动态显示</button>

    </div>
</body>
<script>
    new Vue({
        el: '#app',
        data: {
            show: true
        },
        methods: {
            handleShow() {
                this.show = !this.show
            }
        }
    })
</script>

v-for 指令

v-for = "item in items" : 基于一个数组渲染一个列表

v-for = "(item,index) in list"第一个参数是原数据 ,第二参数 index:

v-for = "(value,key,index) in listObject"v-for对对象进行循环: 此时第一个参数是 属性值 value,第二个参数是key,第三个参数是index(下标)

  • V-for循环遍历数组时推荐使用of,语法格式为(item,index)

item:迭代时不同的数组元素的值 index:当前元素的索引

  • V-for循环遍历对象时推荐使用in,语法格式为(item,name,index)

item:迭代时对象的键名键值 name:迭代时对象的键名 index:当前元素的索引

例子

<div id="app">
    <table style="width: 400px; height: 600px;" border="1" cellspacing="0">
        <thead>
            <tr>
                <th>name</th>
                <th>age</th>
            </tr>

        </thead>
        <tbody>
            <tr v-for = "item in items">
                <td align="center">{{item.name}}</td>
                <td align="center">{{item.age}}</td>
            </tr>
        </tbody>
    </table>
</div>

<script type="text/javascript">
    var app = new Vue({
        el: '#app',
        data: {
            items: [
                { name: 'well', age: '20' }, 
                { name: 'good', age: '19' }, 
                { name: 'nice', age: '18' }, 
                { name: 'ok', age: '17' }
            ]
        }
    })
</script>

 <!-- //使用in,index是一个可选参数,表示当前项的索引 -->
<div v-for="(item,index) in items"></div>
<!-- //使用of -->
<div v-for="item of items"></div>
<!--  -->
  <div id="app">
    <!-- v-for是vue中的遍历(循环)指令。(item index) in data,item是遍历的每一项名称,index是每一项的索引值 -->
    <!-- <p v-for="(item, index) in simpleList">索引值:{{index}}---数据:{{item}}</p> -->
    <!-- <p v-for="(obj, i) in objectList">索引值:{{i}}--id:{{obj.id}}--name:{{obj.name}}</p> -->
    <!-- <p v-for="(count, index) in 10">这是第{{count}}次循环,索引为{{index}}</p> -->

    <div>
      <input type="text" v-model="id">
      <input type="text" v-model="name">
      <button @click="add">添加</button>
    </div> 

    <!-- key是在v-for中表示唯一标识,在任何的v-for中建议都加上key。key一定要保证唯一性 -->
    <p v-for="item in objectList" :key="item.id">
      <input type="checkbox" name="" id=""> {{item.id}} --- {{item.name}}
    </p>
  </div>

  <script>

    var vue = new Vue({
      el: '#app',
      data: {
        simpleList: [1, 2, 3, 4, 5, 6],
        objectList: [
          { id: 1, name: '张三' },
          { id: 2, name: '李四' },
          { id: 3, name: '王五' },
          { id: 4, name: '赵六' }
        ],
        id: '',
        name: '',
      },
      methods: {
        add() {
          const obj = {id: this.id, name: this.name}
          this.objectList.unshift(obj)
        }
      }
    })
</script>

v-text , v-html , v-clock指令

v-text : 会覆盖原有标签中的内容. 将data中的数据作为字符串去处理

v-html : 会见data作为html标签去渲染

v-clock : 占位符指令 , 会替换掉自己的这个占位 , 不会把整个元素清空

例子

<div id="app">
    <div v-clock>{{msg}} 你好</div>
    <div v-text="msg1">你好</div>
    <div v-html="msg2"></div>
</div>

<script type="text/javascript">
    var app = new Vue({
        el: '#app',
        data: {
            msg: "我是v-clock",
            msg1: "我是v-text",
            msg2: "<div>我是v-html</div>"
        }
    })
</script>

v-bind , v-on 指令

v-bind : v-bind用来动态的绑定一个或者多个特性。没有参数时,可以绑定到一个包含键值对的对象。常用于动态绑定class和style。以及href等。 简写为一个冒号[ : ]

v-on : Vue提供的事件绑定指令. 可以简写成@

动态绑定class之动态添加class

//html
<div :class="{'active':isActive}"></div>
// 类名 active 依赖于数据 isActive ,当其为 true 时候,div 会拥有类名 active;为false时则不再拥有 active 类名。
//或者

<div :class="{'active':isActive, 'active2':isActive2}"></div>

//  对象形式(绑定并判断多个)
//第一种(用逗号隔开)
<div :class="{ 'active': isActive, 'sort': isSort }"></div>

//第二种(放在data里面)
//这种方法用于已确定使用的样式,但是现在某种样式不显示或显示
<div :class="classObject"></div>
 
data() {
  return {
    classObject:{ active: true, sort:false }
  }
}




// 前后都可以加静态css类名
<div :class="['sort',isActive ? 'active' : '' ,'sort2' ]"></div>
//或者
<div :class="[isActive?'active':'']"></div>
//或者
<div :class="[isActive==1?'active':'']"></div>
//或者
<div :class="[isActive==index?'active':'']"></div>
//或者
<div :class="[isActive==index?'active':'no-active']"></div>

例子

(1) 事件修饰符

  • .stop 阻止事件继续传播
  • .prevent 事件不再重载页面
  • .capture 使用事件捕获模式,即元素自身触发的事件先在此处处理,然后才交由内部元素进行处理
  • .self 只当在 event.target 是当前元素自身时触发处理函数
  • .once 事件将只会触发一次
  • .passive 告诉浏览器你不想阻止事件的默认行为
<!-- 阻止单击事件继续传播 -->

<a v-on:click.stop="doThis"></a>



<!-- 提交事件不再重载页面 -->

<form v-on:submit.prevent="onSubmit"></form>



<!-- 修饰符可以串联 -->

<a v-on:click.stop.prevent="doThat"></a>



<!-- 只有修饰符 -->

<form v-on:submit.prevent></form>



<!-- 添加事件监听器时使用事件捕获模式 -->

<!-- 即元素自身触发的事件先在此处处理,然后才交由内部元素进行处理 -->

<div v-on:click.capture="doThis">...</div>



<!-- 只当在 event.target 是当前元素自身时触发处理函数 -->

<!-- 即事件不是从内部元素触发的 -->

<div v-on:click.self="doThat">...</div>



<!-- 点击事件将只会触发一次 -->

<a v-on:click.once="doThis"></a>



<!-- 滚动事件的默认行为 (即滚动行为) 将会立即触发 -->

<!-- 而不会等待 `onScroll` 完成 -->

<!-- 这其中包含 `event.preventDefault()` 的情况 -->

<div v-on:scroll.passive="onScroll">...</div>

注意:使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生。因此,用v-on:click.prevent.self会阻止所有的点击,而 v-on:click.self.prevent 只会阻止对元素自身的点击。

<template>
 
    <!-- 
        v-bind : 用户绑定属性的指令. 也可以简写成 :
        <button :title="msg">这是一个按钮</button>
    -->
    <button v-bind:title="msg">这是一个按钮</button>

    <!-- 
        v-on : 事件绑定指令. 可以简写为@
        <button @:click="show">点击我</button>
    -->
    <button v-on:click="show">点击我</button>
 
</template>

<script>
    var vue = new Vue({
        el: "#app",
        data: {
            msg: "我是一个按钮"
        },
        methods: {
            show() {
                alert("点一下玩一年");
            }
        }
    })
</script>
(1) 对象语法
 <!-- //进行类切换的例子 -->
<div id="app">
<!--当data里面定义的isActive等于true时,is-active这个类才会被添加起作用-->
<!--当data里面定义的hasError等于true时,text-danger这个类才会被添加起作用-->
<div :class="{'is-active':isActive, 'text-danger':hasError}"></div>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
isActive: true,
hasError: false
}
})
</script>
<!-- 1. 渲染结果 -->
<!--因为hasError: false,所以text-danger不被渲染-->
<div class = "is-active"></div>

数组语法

<div id="app">
<!--数组语法:errorClass在data对应的类一定会添加-->
<!--is-active是对象语法,根据activeClass对应的取值决定是否添加-->
<p :class="[{'is-active':activeClass},errorClass]">12345</p>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
activeClass: false,
errorClass: 'text-danger'
}
})
</script>
<!-- 1. 渲染结果 -->
<!--因为activeClass: false,所以is-active不被渲染-->
<p class = "text-danger"></p>

直接绑定数据对象

<div id="app">
<!--在vue实例的data中定义了classObject对象,这个对象里面是所有类名及其真值-->
<!--当里面的类的值是true时会被渲染-->
<div :class="classObject">12345</div>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
classObject:{
'is-active': false,
'text-danger':true
}
}
})
</script>
<!-- 1. 渲染结果 -->
<!--因为'is-active': false,所以is-active不被渲染-->
<div class = "text-danger"></div>

动态绑定class



<div v-if="props.cfgView" :class="{a:form.resource == '卫星',b:form.resource == '路网', modle_chart:true} ">
     
      </div>
 <!-- 绑定 单个 -->
<div :class="{ curryChecked : t.id === radioChecked }" >     
</div>
<!--  绑定多个 -->
<div
   class="step-item"
   :class="{
     finish: s.index < active,
     curryStep: s.index === active,
     allfinish: isAllFinish,
   }"
>
</div>


 <!-- style:对象、模板字符串 -->
<div
  v-if="isShowImgs"
  class="admin-info-header__img"
  :style="{ padding: `0 ${calcImgBoxPaddingX}` }"
>
</div>

<div
  :style="{ color: isTemplate === true ? '' : '#A7B1C7' }"
>
</div>

<!-- 对象 结合方法 -->
<div class="system-icon-basics" :style="bgColor(item)">
<script>
    // 动态设置icon的背景色
    bagColor(item) {
      let bgColoe = {};
      if (item.appName === 'app1') {
        bgColoe = {
          background: '#83E254',
          'box-shadow': '0 5px 12px 0 rgba(82,196,25,0.53)',
        };
      } else if (item.appName === 'app2') {
        bgColoe = {
          background: '#FF6850',
          'box-shadow': '0 5px 12px 0 rgba(255,0,0,0.33)',
        };
      } else if (item.appName === 'app3') {
        bgColoe = {
          background: '#FEB416',
          'box-shadow': '0 5px 12px 0 rgba(254,174,4,0.53)',
        };
      } else {
        bgColoe = {
          background: '#6DA6FF',
          'box-shadow': '0 5px 12px 0 rgba(109,166,255,0.53)',
        };
      }
      return bgColoe;
    } 
</script> 
</div>

v-model 指令

v-model : 数据的双向绑定 , 只能用于表单元素. 一方被修改之后另一方也会同步修改

v- bind : 数据的单向绑定. 当model中数据被修改是 , bind绑定的数据会被修改. 而bind绑定的位置改变model则不会被修改

v-model //双向绑定 修饰符
//v-model.lazy  : 失去焦点后更新数据
<input type="password" v-model.lazy="pwd"  ></input>
{{pwd}}
// v-model.trim  : 去除空格
<input type="password" v-model.trim="pwd"  ></input>

例子

<div id="app">
    <h5>{{msg}}</h5>
    <div>
        我是v-model<br />
        <input type="text" name="" id="" v-model:value="msg">
    </div>
    <div>
        我是v-bind<br />
        <input type="text" name="" id="" v-bind:value="msg">
    </div>
    <button v-on:click="changeMsg">点击我</button>
</div>

<script>
    var vue = new Vue({
        el: "#app",
        data: {
            msg: "我是一个按钮"
        },
        methods: {
            changeMsg() {
                this.changeMsg1()
            },
            changeMsg1() {
                this.msg = "我现在不是按钮了"
            }
        }
    })
</script>
(1) 修饰符 - .lazy

默认情况下,v-model同步输入框的值和数据。可以通过这个修饰符,转变为在change事件再同步。

<input v-model.lazy="msg">

(2) .number

自动将用户的输入值转化为数值类型

<input v-model.number="msg">

(3) .trim

自动过滤用户输入的首尾空格

<input v-model.trim="msg">