Vue2之常用指令

何为Vue指令?

带有【v-】这一前缀的特殊【属性】,不同属性【对应】不同的功能

常用Vue指令

v-html

语法:v-html=“表达式”

用途:动态设置元素 innerHTML

案例

<div id="app">
     <div v-html="msg"></div>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>

<script>
    const app = new Vue({
       el: '#app',
       data: {
          msg: `
             <a href="https://www.bilibili.com">
                 哔哩哔哩
             </a>
          `
       }
     })
</script>

结果展示

v-show

语法:v-show = “表达式”      表达式值 true表示显示,false表示隐藏

作用:控制元素显示隐藏

底层原理

切换 css 的 display: none 来控制显示隐藏

应用场景:频繁进行切换显示隐藏的地方

案例

<div id="app">
    <div v-show="msg">v-show盒子</div>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>

<script>
    const app = new Vue({
        el: '#app',
        data: {
            msg: true 		//true表示显示
        }
    })
</script>

结果展示

true显示

<div id="app">
    <div v-show="msg">v-show盒子</div>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>

<script>
   const app = new Vue({
       el: '#app',
       data: {
          msg: false		//false表示隐藏
       }
   })
</script>

结果展示

false隐藏

v-if

语法:v-if = “表达式”      表达式值 true表示存在,false表示不存在

作用:控制元素存在与否

底层原理

根据 判断条件 控制元素的 创建(存在) 和 移除(不存在) 元素节点

应用场景:不频繁进行切换的场景,即:要么存在,要么不存在

案例

<div id="app">
    <div v-if="msg">v-if盒子</div>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>

<script>
    const app = new Vue({
        el: '#app',
        data: {
            msg: true
        }
    })
</script>

结果展示

true存在

<div id="app">
    <div v-if="msg">v-if盒子</div>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>

<script>
    const app = new Vue({
        el: '#app',
        data: {
            msg: false
        }
    })
</script>

结果展示

false不存在

v-if  v-else-if  v-else

作用:进行判断渲染的作用

案例

<div id="app">
    <div v-if="gender === 1">性别:男</div>
    <div v-else>性别:女</div>

    <div v-if="rank === 'A' ">名次A</div>
    <div v-else-if="rank === 'B' ">名次B</div>
    <div v-else>名次C</div>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>

<script>
    const app = new Vue({
        el: '#app',
        data: {
            gender: 1,
            rank: 'B'
        }
    })
</script>

结果展示

v-on

用途:事件绑定

语法

完整写法:
	1.v-on:事件名="内联语法"
	2.v-on:事件名="methods中的函数名"
简写:✔
	1.@事件名="内联语法"
	2.@事件名="methods中的函数名"

说明

1.事件名:
	点击:click
	鼠标经过:mouseenter
	获得焦点:focus
	...

2.this:指的是当前案例

数字加减案例

<div id="app">
    <button @click="number--">-</button>
    <span>{{ number }}</span>
    <button @click="number++">+</button>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>

<script>
    const app = new Vue({
        el: '#app',
        data: {
            number: 100
        }
    })
</script>

买东西案例

<div id="app">
    <div @click="fun">
        <button @click="buy(3)">牛奶3元</button>
        <button @click="buy(6)">面包6元</button>
        <button @click="buy(4)">巧克力4元</button>
    </div>
    <div>剩余: {{ money }} 元</div>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>

<script>
    const app = new Vue({
        el: '#app',
        data: {
            money: 100
        },
        methods: {
            buy(price){
                this.money -= price
            },
            fun(){
                alert('恭喜你购买成功')
            }
        }
    })
</script>

v-bind

用途:动态设置html中的标签属性,如src,href,title…

语法

完整写法:
	v-bind:属性名="表达式"
简写:✔
	:属性名="表达式"

案例

<div id="app">
    <button v-show="index > 0" @click="index--">上一页</button>
    <img :src="list[index]">
    <button v-show="index < list.length-1" @click="index++">下一页</button>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>

<script>
    const app = new Vue({
        el: '#app',
        data: {
            index: 0,
            list: [
                './imgs/01.png',
                './imgs/02.png',
                './imgs/03.jpg'
            ]
        }
    })
</script>

v-bind增强练习

京东tab栏
<style>
  * {
    margin: 0;
    padding: 0;
  }
  ul {
    display: flex;
    border-bottom: 2px solid #e01222;
    padding: 0 10px;
  }
  li {
    width: 100px;
    height: 50px;
    line-height: 50px;
    list-style: none;
    text-align: center;
  }
  li a {
    display: block;
    text-decoration: none;
    font-weight: bold;
    color: #333333;
  }
  li a.active {
    background-color: #e01222;
    color: #fff;
  }
</style>
<div id="app">
  <ul>
    <li v-for="(item,index) in list" :key="item.id" @click="activeIndex = index">
      <a :class="{active: index === activeIndex}" href="#">{{ item.name }}</a>
    </li>
  </ul>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<script>
  const app = new Vue({
    el: '#app',
    data: {
      activeIndex: 0, //记录高亮
      list: [
        { id: 1, name: '京东秒杀' },
        { id: 2, name: '每日特价' },
        { id: 3, name: '品类秒杀' }
      ]
    }
  })
</script>

效果展示

进度条
<style>
  .progress {
    height: 25px;
    width: 400px;
    border-radius: 15px;
    background-color: #272425;
    border: 3px solid #272425;
    box-sizing: border-box;
    margin-bottom: 30px;
  }
  .inner {
    width: 50%;
    height: 20px;
    border-radius: 10px;
    text-align: right;
    position: relative;
    background-color: #409eff;
    background-size: 20px 20px;
    box-sizing: border-box;
    transition: all 1s;
  }
  .inner span {
    position: absolute;
    right: -20px;
    bottom: -25px;
  }
</style>
<div id="app">
  <!-- 外层盒子底色(黑色) -->
  <div class="progress">
    <!-- 内部盒子:进度条(蓝色) -->
    <div class="inner" :style="{ width: percent + '%' }">
      <span>{{ percent }}%</span>
    </div>
  </div>
  <button @click="percent=25">设置25%</button>
  <button @click="percent=50">设置50%</button>
  <button @click="percent=75">设置75%</button>
  <button @click="percent=100">设置100%</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      percent: 0
    }
  })
</script>

效果展示

v-for

作用:多次渲染整个元素,可以是数组,对象,数字…

语法

v-for="(item,index) in 数组"

注意:item是每一项,index是下标

图书案例

<div id="app">
    <h2>图书</h2>
    <ul>
        <li v-for="(item,index) in list" :key="item.id">
            <span>{{ item.name }}</span>
            <span>{{ item.author }}</span>
            <button @click="del(item.id)">删除</button>
        </li>
    </ul>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>

<script>
    const app = new Vue({
        el: '#app',
        data: {
            list: [
                {id:1,name:'《鲁滨逊漂流记》',author: '笛福'},
                {id:2,name: '《红楼梦》',author: '曹雪芹'},
                {id:3,name: '《西游记》',author: '吴承恩'},
                {id:4,name: '《罗密欧与朱丽叶》',author: '莎士比亚'}
            ]
        },
        methods: {
            del(id){
                this.list = this.list.filter(item => item.id !== id)
            }
        }
    })
</script>

结果展示

追加说明:v-for中的key

<li v-for="(item,index) in list" :key="item.id">
     <span>{{ item.name }}</span>
     <span>{{ item.author }}</span>
     <button @click="del(index)">删除</button>
</li>

语法::key=“唯一标识”

**用途:**便于Vue进行列表项的正确排序复用

注意点

1.key只能是 字符串类型 或 数字类型
2.具有唯一性,通常使用 id 作为 key,不推荐index作为key(会发生变化,无法对应)

v-model

语法:v-model=“变量”

作用:可以让数据和视图进行双向数据绑定

何为双向数据绑定?
(1)数据改变,视图自动更新
(2)视图改变,数据自动更新

目的:可以快速【获取】和【设置】表单元素的内容

记事本案例

<!-- 主体区域 -->
<section id="app">
  <!-- 输入框 -->
  <header class="header">
    <h1>记事本</h1>
    <input v-model="addName" placeholder="请输入内容" class="new-todo" />
    <!-- 添加功能 -->
    <button @click="add" class="add">添加内容</button>
  </header>
  <!-- 列表区域 -->
  <section class="main">
    <ul class="todo-list">
      <li class="todo" v-for="(item,index) in list" :key="item.id">
        <div class="view">
          <span class="index">{{ index + 1 }}.</span> <label>{{ item.name }}</label>
          <!-- 删除功能 -->
          <button class="destroy" @click="del(item.id)"></button>
        </div>
      </li>
    </ul>
  </section>
  <!-- 统计和清空 -> 如果没有任务,底部需要隐藏 -->
  <footer class="footer" v-show="list.length > 0">
    <!-- 统计 -->
    <span class="todo-count">合 计:<strong> {{ list.length }} </strong></span>
    <!-- 清空 -->
    <button class="clear-completed" @click="clear">
      清空任务
    </button>
  </footer>
</section>


<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<script>
  const app = new Vue({
    el: '#app',
    data: {
      addName: '',
      list: [
        {id: 1,name: '跑步五公里'},
        {id:2,name:'跳绳100个'}
      ]
    },
    methods: {
      // 删除功能
      del(id){
        // 删除功能代码
        this.list=this.list.filter(item => item.id !== id)
      },

      // 添加功能
      add(){
        // 空内容报错
        if(this.addName.trim() === ''){
          alert("请输入内容")
          return
        }
        // 添加功能代码
        this.list.unshift({
          id: +new Date(),
          name: this.addName
        })
        // 内容清空
        this.addName = ''
      },

      // 清空功能
      clear(){
        this.list=[]
      }
    }
  })
</script>

指令修饰符

(1)按键修饰符
		@keyup.enter="表达式"		键盘回车监听
(2)v-model修饰符
		v-model.trim="表达式"		去除首位空格
		v-model.number="表达式"	转为数字
(3)事件修饰符
		@事件名.stop="表达式"		  阻止冒泡
		@事件名.prevent			阻止默认行为

键盘回车监听案例

<div id="app">
    <input @keyup.enter="add" placeholder="请输入内容"/>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>

<script>
    const app = new Vue({
        el: '#app',
        methods: {
            add(){
                console.log("监听键盘回车事件")
            }
        }
    })
</script>

v-model修饰符案例

<div id="app">
    姓名<input type="text" v-model.trim="username"><br>
    年龄<input type="password" v-model.number="age">
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>

<script>
    const app = new Vue({
        el: '#app',
        data: {
            username: '',
            age: '' 
        },
        methods: {
            add(){
                console.log("监听键盘回车事件")
            }
        }
    })
</script>

阻止冒泡案例

若不阻止,点击子盒子时,弹窗会同时弹出“父盒子”。而我们想要的效果是:点击子盒子时,只弹出“子盒子”。因此,代码如下:

<style>
    .father{
        height: 360px;
        width: 360px;
        background-color: antiquewhite;
    }
    .son{
        height: 200px;
        width: 200px;
        background-color: aqua;
    }
</style>
<div id="app">
    <div class="father" @click="faFn">
    	<!-- 阻止冒泡 -->
        <div class="son" @click.stop="sonFn">son</div>
    </div>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>

<script>
    const app = new Vue({
        el: '#app',
        methods: {
            faFn(){
                alert("父盒子")
            },
            sonFn(){
                alert("子盒子")
            }
        }
    })
</script>

阻止默认行为案例

<div id="app">
    <a @click.prevent href="https://www.bilibili.com">哔哩哔哩</a>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>

<script>
    const app = new Vue({
        el: '#app'
    })
</script>
  • 19
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值