Chapter 04 Vue指令(下)

news2024/9/21 2:40:06

欢迎大家订阅【Vue2+Vue3】入门到实践 专栏,开启你的 Vue 学习之旅!

文章目录

  • 前言
  • 一、指令修饰符
  • 二、v-bind对于样式操作的增强
  • 三、v-model应用于表单元素


前言

在 Vue.js 中,指令是带有 v- 前缀的特殊属性,不同属性对应不同的功能。通过学习不同的指令,我们能够灵活应对多种业务场景的需求。本章详细讲解了指令修饰符并对 v-bind 以及 v-model 指令进行了拓展。

一、指令修饰符

指令修饰符是用于修改指令行为的特殊后缀,通过 . 指明一些指令后缀,不同后缀封装了不同的处理操作,能够改变指令的默认行为。通过使用修饰符,开发者可以在不增加额外逻辑的情况下,提高Vue应用的功能和可读性。

常用的指令修饰符如下:
①.stop
阻止事件冒泡。使用此修饰符可以防止事件向上冒泡到父元素。

【示例】

<!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>  
  <style>  
    .a {  
      width: 200px;  
      height: 200px;  
      background-color: pink;  
      margin-top: 20px;  
    }  
    .b {  
      width: 100px;  
      height: 100px;  
      background-color: skyblue;  
    }  
  </style>  
</head>  
<body>  
  <div id="app">   
    <div @click="aFn" class="a">  
      <div @click="bFn" class="b">B</div> <!-- 使用 .stop 修饰符 -->  
    </div>  
  </div>  
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>  
  <script>  
    const app = new Vue({  
      el: '#app',  
      methods: {  
        aFn() {  
          alert('A被点击了');  
        },  
        bFn() {  
          alert('B被点击了');  
        }  
      }  
    });  
  </script>  
</body>  
</html>

运行结果:
点击B,会弹出弹窗“B”被点击了”,点击“确定”后会弹出弹窗“A被点击了”
在这里插入图片描述
在这里插入图片描述
【分析】
在DOM(文档对象模型)事件处理模型中,事件的传播有两个主要阶段:捕获阶段和冒泡阶段。对于在本例中,点击B元素时事件会冒泡到A元素。
事件传播的过程如下:
①捕获阶段:事件从文档的根元素开始,逐层向下传播到触发事件的目标元素(在本例中是B元素)。
②目标阶段:事件到达目标元素(B),此时可以执行目标元素上的事件处理。
③冒泡阶段:事件开始从目标元素向上传播,逐层返回到文档的根元素。在这个阶段,父元素的事件处理器将被触发(在本例中是A元素)。

为防止事件向上冒泡到父元素,可使用 .stop 修饰符,修改代码为:

<div @click="aFn" class="a">  
  <div @click.stop="bFn" class="b">B</div> 
</div>  

运行结果:
点击B,会弹出弹窗“B”被点击了”在这里插入图片描述
点击A,会弹出弹窗“A被点击了”
在这里插入图片描述

②.prevent
阻止默认事件的发生。常用于表单提交等场景,以防止页面刷新。

【示例】

    <a @clickhref="http://www.baidu.com">阻止默认行为</a>

运行结果:
点击页面链接会跳转至百度官网
在这里插入图片描述
在这里插入图片描述
如果要阻止默认事件的发生,可使用 .prevent 修饰符,修改代码为:

<h3>@事件名.prevent  →  阻止默认行为</h3>
    <a @click.prevent href="http://www.baidu.com">阻止默认行为</a>

运行结果:
点击页面链接不会发生跳转
在这里插入图片描述
③.trim
用于处理输入的字符串。当使用v-model绑定输入框时,去除输入字符串的前后空格。

【示例】

<body>
  <div id="app">
    姓名:<input v-model="username" type="text"><br>
    年纪:<input v-model="age" type="text"><br>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

  <script>
    const app = new Vue({
      el: '#app',
      data: {
        username: '',
        age: '',
      }
    })
  </script>
</body>

运行结果:
在这里插入图片描述
如果要去除输入字符串的前后空格,可使用 .trim 修饰符,修改代码为:

<div id="app">
    <h3>修饰符 .trim </h3>
    姓名:<input v-model.trim="username" type="text"><br>
    年纪:<input v-model="age" type="text"><br>
</div>

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

④.number
自动将输入字符串转换为数字。适合处理数字输入。

【示例】

<body>
  <div id="app">
    姓名:<input v-model="username" type="text"><br>
    年纪:<input v-model="age" type="text"><br>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

  <script>
    const app = new Vue({
      el: '#app',
      data: {
        username: '',
        age: '',
      }
    })
  </script>
</body>

运行结果:
在这里插入图片描述
如果要将输入字符串转换为数字,可使用 .number 修饰符,修改代码为:

<h3>修饰符 .number</h3>
    姓名:<input v-model.trim="username" type="text"><br>
    年纪:<input v-model.number="age" type="text"><br>
</div>

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

二、v-bind对于样式操作的增强

为了方便开发者进行样式控制, Vue 扩展了 v-bind 的语法,可以针对 class 类名和 style 行内样式进行控制。

①操作class
语法1::class="{类名1 : 布尔值, 类名2 : 布尔值,……}"

对象 → 键就是类名,值是布尔值。如果值为 true,该类存在,否则不存在。

适用场景:一个类名来回切换

【示例】

<!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>
  <style>
    .box {
      width: 200px;
      height: 200px;
      border: 3px solid #000;
      font-size: 30px;
      margin-top: 10px;
    }
    .pink {
      background-color: pink;
    }
    .big {
      width: 300px;
      height: 300px;
    }
  </style>
</head>
<body>

  <div id="app">
    <div class="box">Hello Vue</div>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app'
    })
  </script>
</body>
</html>

运行结果:
在这里插入图片描述
如果我们需要改变box的样式:

<div id="app">
  <div class="box pink big">Hello Vue</div>
</div>

运行结果:
在这里插入图片描述
该写法不能根据应用状态动态添加或删除样式类。如果需要根据条件来改变样式,就需要通过添加额外的逻辑来实现,增加代码的复杂度。

可使用动态绑定(例如v-bind:class)根据组件的数据状态动态添加或删除类,修改代码如下:

<div id="app">
  <div class="box" :class="{pink:true,big:true}">Hello Vue</div>
</div>

语法2::class="['类名1', '类名2', ……]"

数组 → 数组中所有的类,都会添加到盒子上,本质就是一个 class 列表

适用场景:批量添加或删除类

【示例】

<div id="app">
  <div class="box" :class="['pink','big]">Hello Vue</div>
</div>

【案例——京东秒杀 tab 导航高亮】
请根据所学知识实现以下效果:
在这里插入图片描述
核心思路:

  • 基于数据动态渲染 tab → v-for
  • 设置下标记录高亮的是哪一个 tab → activeIndex
  • 基于下标动态控制 class 类名 → v-bind:class
<!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>
  <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>
</head>
<body>

  <div id="app">
    <ul>
      <!-- @click="activeIndex=index": 处理点击事件,将当前项的索引赋值给activeIndex,以便高亮显示当前选中的项
           ===:为一种比较运算符,称“严格相等”运算符。它用于比较两个值是否相等,同时还会检查它们的类型是否相同。-->
      <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: {
        /* 用于存储选中项的索引,初始值为0 */
        activeIndex:0, 
        list: [
          { id: 1, name: '京东秒杀' },
          { id: 2, name: '每日特价' },
          { id: 3, name: '品类秒杀' }
        ]

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

运行结果:
在这里插入图片描述
点击“每日特价”后:
在这里插入图片描述
点击“品类秒杀”后:
在这里插入图片描述

②操作style
语法::style="{CSS属性名1 : 'CSS属性值', CSS属性名2 : 'CSS属性值', ……}"

适用场景:某个具体属性的动态设置

【示例】

<!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>
  <style>
    .box {
      width: 200px;
      height: 200px;
      background-color: rgb(187, 150, 156);
    }
  </style>
</head>
<body>
  <div id="app">
    <div class="box"></div>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app'
    })
  </script>
</body>
</html>

运行结果:
在这里插入图片描述
使用 v-bind:style 动态地修改元素的样式,修改代码如下:

<div id="app">
    <!-- 在 JavaScript 中,属性名不能包含连字符,应使用驼峰命名法(CamelCase)来表示
        background-color要写成backgroundColor -->
    <div class="box" :style="{width:'400px',height:'400px',backgroundColor:'red'}"></div>
  </div>

运行结果:
在这里插入图片描述
【案例——进度条效果】
请根据所学知识实现以下效果:
在这里插入图片描述

<!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>
  <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>
</head>
<body>
  <div id="app">
    <!-- 外层盒子——进度条外框(黑色) -->
    <div class="progress">
      <!-- 内层盒子——进度(蓝色) -->
      <div class="inner" :style="{width:percent+'%'}">
        <span>{{percent}}%</span>
      </div>
    </div>
    <!-- 每个按钮通过 Vue 的事件处理 (@click) 设置 percent 数据属性,从而改变进度条的显示百分比 -->
    <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>
</body>
</html>

运行结果:
在这里插入图片描述
点击“设置25%”后:
在这里插入图片描述
点击“设置100%”后:
在这里插入图片描述

三、v-model应用于表单元素

常见的表单元素都可以用 v-model 绑定关联,以便快速获取或设置表单元素的值。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>
  <style>
    textarea {
      display: block;
      width: 240px;
      height: 100px;
      margin: 10px 0;
    }
  </style>
</head>
<body>

  <div id="app">
    <h3>消息注册</h3>

    姓名:
      <input type="text" v-model="username"> 
      <br><br>

    是否单身:
      <input type="checkbox" v-model="isSingle"> 
      <br><br>

    <!-- 
      前置理解:
        1. name:  给单选框加上 name 属性 可以分组 → 同一组互相会互斥
        如果不设置 name 属性,用户就可以同时选择多个选项,违背了单选框的设计初衷
        2. value: 给单选框加上 value 属性,用于提交给后台的数据
    -->
    性别: 
      <input type="radio" name="gender" value="1"><input type="radio" name="gender" value="2"><br><br>

    <!-- 
      前置理解:
        1. option 需要设置 value 值,提交给后台
        2. select 的 value 值,关联了选中的 option 的 value 值
    -->
    所在城市:
      <select v-model="cityId">
        <option value="101">北京</option>
        <option value="102">上海</option>
        <option value="103">成都</option>
        <option value="104">南京</option>
      </select>
      <br><br>

    自我描述:
      <textarea v-model="desc"></textarea> 

    <button>立即注册</button>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        username:'',
        isSingle:'',
        gender:'',
        cityId:'',
        desc:''
      }
    })
  </script>
</body>
</html>

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

填写相关信息后:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2083470.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[原理理解] Swin Transformer相对位置编码理解

文章目录 简述相对位置编码的意义直观理解注意力相对位置获取必要性当前位置初步获取利用广播机制获取相对位置索引XY获取最后相对位置1获取最后相对位置2最终的相对位置值嵌入 简述 在看Swin Transformer的时候&#xff0c;一开始在相对位置编码这一块的理解上卡壳了挺久&…

27 Combobox组件

Tkinter ttk.Combobox 组件使用指南 ttk.Combobox 是 Tkinter 的一个高级控件&#xff0c;它结合了文本框和下拉列表的功能&#xff0c;允许用户从预定义的选项列表中选择一个值。ttk 模块是 Tkinter 的一个扩展&#xff0c;提供了更现代的控件外观和行为。以下是对 ttk.Combo…

hyperf json-rpc

安装 安装docker hyperf 安装 hyperf-rpc-server-v8 &#xff08;服务端&#xff09; docker run --name hyperf-rpc-server-v8 \ -v /www/docker/hyperf-rpc-server:/data/project \ -w /data/project \ -p 9508:9501 -it \ --privileged -u root \ --entrypoint /bin/sh \…

港口行业大数据BI建设方案(24页PPT)

方案简介&#xff1a; 港口行业BI建设方案旨在通过数据整合、分析、可视化及智能化决策支持等手段&#xff0c;提升港口运营效率与管理水平。它的建设实施有利推动港口数字化转型、是提升竞争力的关键举措。通过构建高效、智能的BI系统&#xff0c;港口企业能够实现对运营数据…

软设例题—哈夫曼树

哈夫曼树基本概念&#xff1a; 叶子结点的路径长度&#xff1a;结点到根的分支数量 树的路径长度&#xff1a;所有叶子结点路径长度之和 权&#xff1a;叶子结点的数值 叶子结点的带权路径长度&#xff1a;权重*路径 树的带权路径长度&#xff1a;所有叶子结点带权路径之和…

# Windows 系统安装 virtualbox/vmware 虚拟机教程

Windows 系统安装 virtualbox/vmware虚拟机教程 段子手-168 2024-8-28 一、virtualbox/vmware 简介 1、VirtualBox VirtualBox 是开源的、免费虚拟机软件。VirtualBox 是由德国 Innotek 公司开发&#xff0c;由 Sun Microsystems 公司出品的软件&#xff0c;号称是最强的免…

前端学习笔记-Web APIs篇-01

变量声明 变量声明有三个 var let 和 const 建议&#xff1a; const 优先&#xff0c;尽量使用const&#xff0c; 原因是&#xff1a; const 语义化更好很多变量我们声明的时候就知道他不会被更改了&#xff0c;那为什么不用 const呢&#xff1f;实际开发中也是&#xff0c…

如何使用ssm实现基于ssm的软考系统+vue

TOC ssm321基于ssm的软考系统vue 系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#x…

11 索引

目录 没有索引&#xff0c;可能会有什么问题认识磁盘 1. 没有索引&#xff0c;可能会有什么问题 所以&#xff1a;提高数据库的性能&#xff0c;索引是物美价廉的东西。不用加内存&#xff0c;不用改程序&#xff0c;不用调sql&#xff0c;只要执行正确的create index&#x…

Python 数据分析笔记— Numpy 基本操作

文章目录 学习内容&#xff1a;一、什么是数组、矩阵二、创建与访问数组三、矩阵基本操作 学习内容&#xff1a; 一、什么是数组、矩阵 数组&#xff08;Array&#xff09;&#xff1a;是有序的元素序列&#xff0c;可以是一维、二维、多维。 array1 [1,2,3] 或[a, b, c, d…

Littorine生物合成糖基转移酶和酰基转移酶-文献精读39

Functional genomics analysis reveals two novel genes required for littorine biosynthesis 功能基因组学分析揭示了两个Littorine生物合成所需的新基因&#xff0c;基因组挖掘很有效果~ 摘要 一些茄科药用植物能够生产药用莨菪烷类生物碱&#xff08;TAs&#xff09;&am…

MYSQL:简述对B树和B+树的认识

MySQL的索引使用B树结构。 1、B树 在说B树之前&#xff0c;先说说B树&#xff0c;B树是一个多路平衡查找树&#xff0c;相较于普通的二叉树&#xff0c;不会发生极度不平衡的状况&#xff0c;同时也是多路的。 B树的特点是&#xff1a;他会将数据也保存在非叶子节点。而这个…

样本存储需要注意的事项

在实验室和研究机构中&#xff0c;有一些样本是非常重要且需要特殊保护的&#xff0c;这些样本可能包括珍贵的细胞培养物、生物医学样本、药物试剂等等&#xff0c;为了保证这些样本的质量和完整性&#xff0c;采取一些特殊的措施来进行存储管理非常重要。 一旦这些珍贵样本出…

Undertow 性能、配置

一、性能对比 Tomcat vs Jetty vs Undertow性能对比,详细文章: Tomcat vs Jetty vs Undertow性能对比-腾讯云开发者社区-腾讯云 (tencent.com)https://cloud.tencent.com/developer/article/1699803压测指标的结果: 吞吐量:Undertow > Jetty > Tomcat响应时间&…

World of Warcraft [CLASSIC][80][Shushia] Call to Arms: Alterac Valley

Alterac Valley 奥特兰克山谷 明明能拿7000-9000荣誉&#xff0c;白送的大战场&#xff0c;废材太多&#xff0c;看不下去了&#xff0c;动不动就杀女人&#xff0c;丢墓地&#xff0c;最终拿什么3000荣誉&#xff0c;也不知道脑子装啥。 我们55级的时候就能把联盟打的不要不要…

物料类型 UNBW 和 NLAG

业务示例 公司的广告部门负责采购广告业务并承担相应的费用。这些宣传册不应该存储在广告部门&#xff1b;而应该存储在物料仓库中。并且需要基于数量而不是金额进行库存管理。因此这些物料的物料类型为未评估物料(UNBW)。 物料类型 UNBW 物料类型UNBW表示未评估物料。可以通…

第20讲 动画讲解轻松学会STM32的PWM

来源&#xff1a;【STM32】动画讲解轻松学会STM32的PWM_哔哩哔哩_bilibili 基本概念 周期/频率 计算公式&#xff1a;PWM周期1个高电平用时1个低电平用时 PWM的频率1/周期 如图所示此时周期为1ms&#xff0c;即1s内存在1000组这样的高低电平&#xff0c;PWM的频率为1000hz。…

selenium启动总报错 WebDriverManager总是异常

我的环境用这个自动管理驱动的工具 WebDriverManager 总是报错 尝试过很多方法都没有&#xff0c;只好手动指定浏览器的位置 System.setProperty("webdriver.chrome.driver", "C:\\Users\\27224\\.cache\\selenium\\chromedriver\\win64\\128.0.6613.84\\chrome…

030集—CAD 实现钟表时针动态转动效果——vba代码实现

cad图中显示动图案例如下&#xff1a; 部分代码如下&#xff1a; &#xff08;按下Esc键可退出&#xff09; #If VBA7 Then 64位系统声明Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) #Else 32位系统声明Declare Sub Sleep Lib "k…

95.SAP MII功能详解(08)Workbench-Transaction介绍

目录 1.Transaction 2.Properties of transaction 1.Transaction You use transactions to access data from multiple sources and execute processes, which are triggered synchronously or asynchronously.您可以使用事务从多个源访问数据并执行同步或异步触发的流程。…