学习笔记——初识指令

一、介绍

Vue会根据不同的指令,针对标签实现不同的功能。指令是带有v-前缀的特殊标签属性。

二、常用指令

1.v-html

作用:设置元素的innerHTML,动态解析标签
语法v-html = "表达式"

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <div v-html="msg"></div>
        <div v-html="msg2"></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 = "http://www.baidu.com">
                        百度
                    </a>
                `,
                msg2: `
                    <h1>通过v-html动态解析了h1标签</h1>
                `
            }
        })
    </script>
</body>
</html>

2.v-show

作用:控制元素显示隐藏
语法v-show = "表达式" 如果表达式为true,则显示元素,否则隐藏元素。
原理:切换css的 display: none 来控制显示隐藏
场景:频繁切换显示隐藏的场景

3.v-if

作用:控制元素显示隐藏(条件渲染)
语法v-if = "表达式" 如果表达式为true,则显示元素,否则隐藏元素。
原理:根据判断条件控制元素的拆功能键和移除
场景:要么显示,要么隐藏

v-show和v-if的区别
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box {
            margin: 10px auto;
            width: 200px;
            height: 100px;
            border: 2px solid #000;
            text-align: center;
            line-height: 100px;
        }
    </style>
</head>
<body>
    
    <div id="app">
        <div v-show="flag" class="box">我是v-show控制的盒子</div>
        <div v-if="flag" class="box">我是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: {
                flag: true
            }
        })
    </script>
</body>
</html>

4.v-else 和 v-else-if

作用:辅助v-if进行判断渲染
语法v-else v-else-if = "表达式"
注意:需要紧接着v-if使用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

    <div id="app">
        <p v-if="gender === 1">性别:♂ 男</p>
        <p v-else>性别:♀ 女</p>
        <hr>
        <p v-if="score >= 90">成绩评定A:奖励电脑一台</p>
        <p v-else-if="score >= 70">成绩评定B:奖励周末郊游</p>
        <p v-else-if="score >= 60">成绩评定C:奖励零食礼包</p>
        <p v-else>成绩评定D:惩罚一周不能玩手机</p>
    </div>
    
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    <script>

        const app = new Vue({
            el: '#app',
            data: {
                gender: 2,
                score: 95
            }
        })
    </script>
    
</body>
</html>

运行结果

image.png

5.v-on

作用:为元素绑定对应的事件,注册事件 = 添加监听 + 提供处理逻辑
语法v-on:属性名称, 简写为@属性名称

  • v-on:事件名 = "内联语句",适用于逻辑简单的场景
    - v-on:事件名 = "methods中的函数名",适用于逻辑代码量多的场景

注意:由于内联语句是在模板当中写的代码,所以可以直接访问data里面的数据,而函数当中提供业务逻辑的是不能直接访问data里面的数据,需要通过实例来访问。

内联语句

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

    <div id="app">
      <button @click="count--">-</button>
      <span>{{ count }}</span>
      <button v-on:click="count++">+</button>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    <script>
      const app = new Vue({
        el: '#app',
        data: {
          count: 100
        }
      })
    </script>
    
</body>
</html>

事件处理函数

注意

  • 事件处理函数应该写到一个跟data同级的配置项(methods)中
  • methods中的函数内部的this都指向Vue实例
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

    <div id="app">
        <button @click="fn">切换显示隐藏</button>
        <h1 v-show="isShow">事件处理函数</h1>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    <script>
        const app = new Vue({
            el: '#app',
            data: {
                isShow: true
            },
            methods: {
                fn () {
                    // 让提供的所有methods中的函数,this都指向当前实例
                    this.isShow = !this.isShow
                }
            }
        })
    </script>

</body>

</html>

给事件处理函数传参

  • 如果不传递任何参数,则方法无需加小括号;methods方法中可以直接使用 e 当做事件对象
  • 如果传递了参数,则实参 $event 表示事件对象,固定用法。
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <style>
        .box {
            border: 3px solid #000000;
            border-radius: 10px;
            padding: 20px;
            margin: 20px;
            width: 200px;
        }

        h3 {
            margin: 10px 0 20px 0;
        }

        p {
            margin: 20px;
        }
    </style>

</head>

<body>

    <div id="app">
        <div class="box">
            <h3>小V自动售货机</h3>
            <button @click="buy(5)">可乐5元</button>
            <button @click="buy(10)">咖啡10元</button>
            <button @click="buy(8)">牛奶8元</button>
        </div>
        <p>银行卡余额:{{ money }}元</p>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    <script>
        const app = new Vue({
            el: '#app',
            data: {
                money: 100
            },
            methods: {
                buy(price) {
                    if (this.money < price) {
                        alert('余额不足')
                    } else {
                        this.money -= price
                    }
                }
            }
        })
    </script>

</body>

</html>

6.v-bind

  1. 作用:动态设置html的标签属性 比如:src、url、title
  2. 语法v-bind:属性名="表达式"
  3. v-bind:可以简写成 => :,即:"表达式"

比如,有一个图片,它的 src 属性值,是一个图片地址。这个地址在数据 data 中存储。
则可以这样设置属性值:

  • <img v-bind:src="url" />
  • <img :src="url" /> (v-bind可以省略)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

    <div id="app">
        <img v-bind:src="imgUrl" v-bind:title="msg" alt="" style="width: 400px;">
        <img :src="imgUrl" :title="msg" alt="" style="width: 400px;">
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    <script>
        const app = new Vue({
            el: '#app',
            data: {
                imgUrl: '这里是你的图片路径',
                msg: 'hello'
            }
        })
    </script>

</body>

</html>

7.v-for

作用:Vue 提供了 v-for 列表渲染指令,用来辅助开发者基于一个数组来循环渲染一个列表结构。
语法:v-for 指令需要使用 v-for="(item, index) in arr" 形式的特殊语法,其中:

  • item 是数组中的每一项
  • index 是每一项的索引,不需要可以省略:v-for = "item in arr"
  • arr 是被遍历的数组

此语法也可以遍历对象和数字

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

    <div id="app">
        <h3>小V水果店</h3>
        <ul>
            <li v-for="(item, index) in fruits">
                {{ item }} -> {{ index }}
            </li>
        </ul>

        <ul>
            <li v-for="item in fruits">
                {{ item }}
            </li>
        </ul>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    <script>
        const app = new Vue({
            el: '#app',
            data: {
                fruits: ['苹果', '香蕉', '西瓜']
            }
        })
    </script>

</body>

</html>

v-for中的key

语法: key=“唯一值”
作用:给列表项添加的唯一标识。便于Vue进行列表项的正确排序复用
为什么加key:因为Vue 的默认行为会尝试原地修改元素(就地复用),即没加key时,无论我们删除哪一个列表项,Vue都会删除最后一个列表项,然后把更新后的覆盖掉排在前面的列表项。而加key之后,想删除哪一个列表项就可以删除哪一个列表项。
注意:

  • key 的值只能是字符串 或 数字类型
  • key 的值必须具有唯一性
  • 推荐使用 id 作为 key(唯一),不推荐使用 index 作为 key(会变化,不对应)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

    <div id="app">
        <h3>简易书架</h3>
        <ul>
            <li v-for="book in booksList" :key="book.id">
                <span>{{book.name}}</span>
                <span>{{book.author}}</span>
                <button @click="delBook(book.id)">删除</button>
            </li>
        </ul>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    <script>
        const app = new Vue({
            el: '#app',
            data: {
                booksList: [
                    { id: 1, name: '《红楼梦》', author: '曹雪芹' },
                    { id: 2, name: '《西游记》', author: '吴承恩' },
                    { id: 3, name: '《水浒传》', author: '施耐庵' },
                    { id: 4, name: '《三国演义》', author: '罗贯中' }
                ]
            },
            methods: {
                delBook(id) {
                    this.booksList = this.booksList.filter(book => book.id !== id)
                }
            }
        })
    </script>
    
</body>
</html>

8.v-model

介绍:所谓双向绑定就是:

  1. 数据改变后,呈现的页面结果会更新。数据变化 -> 视图自动更新
  2. 页面结果更新后,数据也会随之而变。视图变化 -> 数据自动更新

作用:表单元素(input、radio、select)使用,双向绑定数据,可以快速 获取设置 表单元素内容
语法v-model="变量"

需求:使用双向绑定实现以下需求

  1. 点击登录按钮获取表单中的内容
  2. 点击重置按钮清空表单中的内容
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

    <div id="app">
        账户:<input type="text" v-model="username"> <br><br>
        密码:<input type="password" v-model="password"> <br><br>
        <button @click="login()">登录</button>
        <button @click="reset()">重置</button>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    <script>
        const app = new Vue({
            el: '#app',
            data: {
                username: '',
                password: ''
            },
            methods: {
                login() {
                    console.log("账户:" + this.username, "  密码:" + this.password)
                },
                reset() {
                    this.username = ''
                    this.password = ''
                }
            }
        })
    </script>
    
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值