【Vue框架】Vue的6大类指令

1. Vue中的指令

  • 指令:模板语法,用于辅助开发者渲染页面的基本结构。
  • Vue中的指令按照不同的用途,可以分为如下6大类:
  1. 内容渲染指令
  2. 属性绑定指令
  3. 事件绑定指令
  4. 双向绑定指令
  5. 条件渲染指令
  6. 列表渲染指令
1.1 内容渲染指令(v-text、{{}}、v-html)

在这里插入图片描述
代码举例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 希望 Vue 能够控制下面这个 div, 帮我们把数据填充到 div 内部 -->
    <div id="app">
        <p v-text="username"></p>
        <p>性别:{{gender}}</p>
        <div v-html="info"></div>
    </div>

    <!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
    <script src="/lib/vue.js"></script>
    <!-- 2. 创建 Vue 实例对象 -->
    <script>
        // 创建 Vue 的实例对象
        const vm = new Vue({
            // el 属性: 固定写法,表示当前 vm 实例要控制页面上的哪个区域,接受的值是一个选择器
            el : '#app',
            // data 对象就是要渲染到页面上的数据
            data: {
                username: '张三',
                gender: '男',
                info: '<h4>正在努力学习vue框架</h4></h4>'
            }
        })
    </script>
</body>
</html>

结果:
在这里插入图片描述

1.2 属性绑定指令(:/ v-bind)
  • 注意:插值表达式只能用在元素的内容节点中,不能用在元素的属性节点中。
  • 在vue中,可以使用v-bind指令,为元素的属性动态绑定值,简写为英文的:(冒号)。
  • 在使用v-bind属性绑定期间,如果板顶内容需要进行动态拼接,则字符串外边应该包括单引号。
    代码举例:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 希望 Vue 能够控制下面这个 div, 帮我们把数据填充到 div 内部 -->
    <div id="app">
        <input type="text" :placeholder="tips"><br>
        <img :src="photo" alt="" style="width: 40px;">
        <div :title="'box' + index">这是一个div</div>
    </div>

    <!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
    <script src="/lib/vue.js"></script>
    <!-- 2. 创建 Vue 实例对象 -->
    <script>
        // 创建 Vue 的实例对象
        const vm = new Vue({
            // el 属性: 固定写法,表示当前 vm 实例要控制页面上的哪个区域,接受的值是一个选择器
            el : '#app',
            // data 对象就是要渲染到页面上的数据
            data: {
                tips:'请输入用户名',
                photo: 'https://cn.vuejs.org/images/logo.svg',
                index: 1,
            }
        })
    </script>
</body>
</html>

结果:
在这里插入图片描述

1.3 事件绑定指令(@ / v-on)
  • 可以简写为@;
  • 事件绑定的处理函数,写在methods里;
  • 函数可以传参,写在函数后面的小括号里;
    代码举例:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 希望 Vue 能够控制下面这个 div, 帮我们把数据填充到 div 内部 -->
    <div id="app">
        <p>count的值为:{{count}}</p>
        <button v-on:click="add(1)">+1</button>
        <button @click="sub">-1</button>
    </div>

    <!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
    <script src="/lib/vue.js"></script>
    <!-- 2. 创建 Vue 实例对象 -->
    <script>
        // 创建 Vue 的实例对象
        const vm = new Vue({
            // el 属性: 固定写法,表示当前 vm 实例要控制页面上的哪个区域,接受的值是一个选择器
            el : '#app',
            // data 对象就是要渲染到页面上的数据
            data: {
                count: 0,
            },
            methods: {
                add(n) {
                    console.log(vm);
                    this.count+=n;
                },
                sub() {
                    this.count--;
                }
            }

        })
    </script>
</body>
</html>

效果:
在这里插入图片描述

1.3.1 事件绑定中的$event
  • vue 提供了内置变量,名字叫做$event,它就是原生DOM的事件对象。
    代码举例:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 希望 Vue 能够控制下面这个 div, 帮我们把数据填充到 div 内部 -->
    <div id="app">
        <p>count的值为:{{count}}</p>
        <button v-on:click="add(1, $event)">+1</button>
        <button @click="sub">-1</button>
    </div>

    <!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
    <script src="/lib/vue.js"></script>
    <!-- 2. 创建 Vue 实例对象 -->
    <script>
        // 创建 Vue 的实例对象
        const vm = new Vue({
            // el 属性: 固定写法,表示当前 vm 实例要控制页面上的哪个区域,接受的值是一个选择器
            el : '#app',
            // data 对象就是要渲染到页面上的数据
            data: {
                count: 0,
            },
            methods: {
                add(n, e) {
                    console.log(e);
                    this.count+=n;

                    // 判断 count 的值
                    if(this.count % 2 === 0) {
                        // 偶数
                        e.target.style.backgroundColor = 'pink';
                    } else {
                        // 奇数
                        e.target.style.backgroundColor = '';
                    }
                },
                sub() {
                    this.count--;
                }
            }

        })
    </script>
</body>
</html>

结果:
奇数时,button为原色;偶数时,button为粉色。
在这里插入图片描述

1.3.1 事件修饰符

在这里插入图片描述
代码举例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 希望 Vue 能够控制下面这个 div, 帮我们把数据填充到 div 内部 -->
    <div id="app">
        <a href="https://www.baidu.com/" @click.prevent="show">跳转到百度首页</a>

        <div style="background-color: pink; width:500px; height: 200px; line-height:200px; padding: 150px;" @click="divHandler">
            <button @click.stop="btnHandler">按钮</button>
        </div>
    </div>

    <!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
    <script src="/lib/vue.js"></script>
    <!-- 2. 创建 Vue 实例对象 -->
    <script>
        // 创建 Vue 的实例对象
        const vm = new Vue({
            // el 属性: 固定写法,表示当前 vm 实例要控制页面上的哪个区域,接受的值是一个选择器
            el : '#app',
            // data 对象就是要渲染到页面上的数据
            data: {
                count: 0,
            },
            methods: {
                show() {
                    console.log('阻止了a的默认跳转事件!');
                },
                btnHandler() {
                    console.log('btnHandler');
                },
                divHandler() {
                    console.log('divHandler');
                }
            }

        })
    </script>
</body>
</html>

结果:
在这里插入图片描述

1.3.3 按键修饰符

在这里插入图片描述
代码:

  • 下面这段代码实现的是,在input中输入内容,按下esc清空内容,按下回车,打印内容。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 希望 Vue 能够控制下面这个 div, 帮我们把数据填充到 div 内部 -->
    <div id="app">
        <input type="text" @keyup.esc="clearInput" @keyup.enter="submitInput">
    </div>

    <!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
    <script src="/lib/vue.js"></script>
    <!-- 2. 创建 Vue 实例对象 -->
    <script>
        // 创建 Vue 的实例对象
        const vm = new Vue({
            // el 属性: 固定写法,表示当前 vm 实例要控制页面上的哪个区域,接受的值是一个选择器
            el : '#app',
            // data 对象就是要渲染到页面上的数据
            data: {
                count: 0,
            },
            methods: {
                clearInput(e) {
                    console.log('触发了clearInput方法');
                    e.target.value = '';
                },
                submitInput() {
                    console.log('触发了submitInput方法');
                }
            }

        })
    </script>
</body>
</html>
1.4 双向数据绑定指令(v-model)
  • v-model和v-bind的区别,前者是双向数据绑定,后者是单向数据绑定(响应data中的数据变化,动态渲染视图);
  • v-model可以用在input、textarea、select中。
    代码举例:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 希望 Vue 能够控制下面这个 div, 帮我们把数据填充到 div 内部 -->
    <div id="app">
        <p>用户的名字是:{{username}}</p>
        <!-- 双向数据绑定 -->
        <input type="text" v-model="username">
        <hr>
        <!-- 单项数据绑定 -->
        <input :value="username"></input>
        <hr>

        <!-- 下拉选择框 -->
        <select v-model="city">
            <option value="">请选择城市</option>
            <option value="1">北京</option>
            <option value="2">上海</option>
            <option value="3">吉林</option>
        </select>
    </div>

    <!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
    <script src="/lib/vue.js"></script>
    <!-- 2. 创建 Vue 实例对象 -->
    <script>
        // 创建 Vue 的实例对象
        const vm = new Vue({
            // el 属性: 固定写法,表示当前 vm 实例要控制页面上的哪个区域,接受的值是一个选择器
            el : '#app',
            // data 对象就是要渲染到页面上的数据
            data: {
                username: '张三1',
                city: 1,
            },
        })
    </script>
</body>
</html>

结果:
在这里插入图片描述

1.4.1 v-model的修饰符

在这里插入图片描述
代码举例:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <!-- 希望 Vue 能够控制下面这个 div, 帮我们把数据填充到 div 内部 -->
    <div id="app">
      <input type="text" v-model.number="n1" />+
      <input type="text" v-model.number="n2" />=
      <span>{{n1 + n2}}</span>
      <hr>
      <!-- 去除字符串前后空格 -->
      <input type="text" v-model.trim="username">
      <button @click="showName()">获取用户名</button>
      <hr>
      <input type="text" v-model.lazy="username">
    </div>

    <!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
    <script src="/lib/vue.js"></script>
    <!-- 2. 创建 Vue 实例对象 -->
    <script>
      // 创建 Vue 的实例对象
      const vm = new Vue({
        // el 属性: 固定写法,表示当前 vm 实例要控制页面上的哪个区域,接受的值是一个选择器
        el: "#app",
        // data 对象就是要渲染到页面上的数据
        data: {
          username: "张三1",
          city: 1,
          n1: 1,
          n2: 3,
        },
        methods: {
            showName() {
                console.log(`用户名为:'${this.username}'`);
            }
        }
      });
    </script>
  </body>
</html>

结果:
在这里插入图片描述

1.5 条件渲染指令(v-if、v-show)

在这里插入图片描述

  1. v-model的原理是:动态为元素添加或者移除 display:none;样式,来实现元素的显示和隐藏;
    • 如果要频繁地切换元素的显示状态,用v-show性能更好;
  2. v-if的原理是:每次动态创建或者移除元素,实现元素的显示与隐藏;
    • 如果刚进入页面,某个元素默认不需要被展示,而且后期这个元素很可能也不需要被展示出来,此时v-if性能更好。
  3. 在实际开发中,绝大多数情况,不用考虑性能问题,直接使用v-if。

代码举例:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <!-- 希望 Vue 能够控制下面这个 div, 帮我们把数据填充到 div 内部 -->
    <div id="app">
        <p v-if="flag">这是v-if控制的</p>
        <p v-show="flag">这是v-show控制的</p>
    </div>

    <!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
    <script src="/lib/vue.js"></script>
    <!-- 2. 创建 Vue 实例对象 -->
    <script>
      // 创建 Vue 的实例对象
      const vm = new Vue({
        // el 属性: 固定写法,表示当前 vm 实例要控制页面上的哪个区域,接受的值是一个选择器
        el: "#app",
        // data 对象就是要渲染到页面上的数据
        data: {
            flag: true,
        },
      });
    </script>
  </body>
</html>

1.5.1 v-if经常与v-else-if、v-else搭配使用
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <!-- 希望 Vue 能够控制下面这个 div, 帮我们把数据填充到 div 内部 -->
    <div id="app">
        <div v-if="type === 'A'">优秀</div>
        <div v-else-if="type === 'B'">良好</div>
        <div v-else-if="type === 'C'">及格</div>
        <div v-else="type === 'D'"></div>
    </div>

    <!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
    <script src="/lib/vue.js"></script>
    <!-- 2. 创建 Vue 实例对象 -->
    <script>
      // 创建 Vue 的实例对象
      const vm = new Vue({
        // el 属性: 固定写法,表示当前 vm 实例要控制页面上的哪个区域,接受的值是一个选择器
        el: "#app",
        // data 对象就是要渲染到页面上的数据
        data: {
            type: 'B',
        },
      });
    </script>
  </body>
</html>

上面这段代码实现的功能:根据type的值,决定显示优秀、良好、及格、差。

1.6 循环渲染指令(v-for)

在这里插入图片描述
代码举例:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <!-- 希望 Vue 能够控制下面这个 div, 帮我们把数据填充到 div 内部 -->
    <div id="app">
      <table>
        <thead>
            <th>索引</th>
            <th>Id</th>
            <th>名字</th>
        </thead>
        <tbody>
            <tr v-for="(item,index) in list" :title="item.name + index">
                <td>{{index}}</td>
                <td>{{item.id}}</td>
                <td>{{item.name}}</td>
            </tr>
        </tbody>
      </table>
    </div>

    <!-- 1. 导入 Vue 的库文件,在 window 全局就有了 Vue 这个构造函数 -->
    <script src="/lib/vue.js"></script>
    <!-- 2. 创建 Vue 实例对象 -->
    <script>
      // 创建 Vue 的实例对象
      const vm = new Vue({
        // el 属性: 固定写法,表示当前 vm 实例要控制页面上的哪个区域,接受的值是一个选择器
        el: "#app",
        // data 对象就是要渲染到页面上的数据
        data: {
          list: [
            { id: 1, name: "刘能" },
            { id: 2, name: "赵四" },
            { id: 3, name: "谢广坤" },
          ],
        },
      });
    </script>
  </body>
</html>

结果:
在这里插入图片描述

1.6.1 绑定:key属性
  • 官方建议,只要用到v-for指令,那么一定要绑定一个:key属性,而且尽量把id作为key的值。
  • 官方对key的值类型,要求是字符串或数字类型。
    在这里插入图片描述
    key的注意事项
    在这里插入图片描述

参考:黑马Vue视频

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue.js的自定义指令可以让我们在模板中直接使用自定义的指令,从而实现一些特殊的功能或交互效果。自定义指令Vue.js提供的一种扩展机制,它允许我们在编写Vue.js应用程序时自定义DOM元素的行为。 自定义指令主要由两部分组成:指令定义和指令钩子函数。 指令定义是一个包含指令名称、绑定值、修饰符等属性的对象,用来描述指令的属性和行为。指令钩子函数是指在绑定元素插入到DOM中、更新DOM时、解绑元素等特定时刻执行的函数,用来实现指令的具体功能。 下面是一个简单的自定义指令示例,用来实现点击外部区域隐藏弹窗的功能: ```javascript Vue.directive('click-outside', { bind: function(el, binding, vnode) { el.clickOutsideEvent = function(event) { if (!(el == event.target || el.contains(event.target))) { vnode.context[binding.expression](event); } }; document.body.addEventListener('click', el.clickOutsideEvent); }, unbind: function(el) { document.body.removeEventListener('click', el.clickOutsideEvent); } }); ``` 在上面的例子中,我们通过`Vue.directive`方法注册了一个名为`click-outside`的自定义指令,该指令的功能是在点击指定元素外的区域时隐藏元素。 在指令的`bind`钩子函数中,我们绑定了一个事件监听器,用来监听`document.body`的点击事件。在事件处理函数中,我们判断点击的目标是否是指定元素或指定元素的子元素,如果不是,则调用指令绑定的方法,执行隐藏元素的操作。 在指令的`unbind`钩子函数中,我们移除了绑定的事件监听器,以避免内存泄漏。 使用自定义指令时,我们可以在模板中通过`v-指令名`的方式来调用指令,如下所示: ```html <div v-click-outside="hidePopup"></div> ``` 在上面的例子中,我们将`click-outside`指令绑定到一个`<div>`元素上,并指定了一个名为`hidePopup`的方法,用来隐藏弹窗。当用户点击该元素外的区域时,指令会自动触发绑定的方法,从而实现弹窗的隐藏。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想做一只快乐的修狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值