【后端速成 Vue】初识指令(下)

news2024/12/23 7:39:52

前言:

上一篇初识指令(上)文章中,一共讲解了 v-html,v-show,v-if,v-else,v-else-if,v-on,v-bind 这些指令,当然,还剩不少的指令没有讲解,本问将会介绍剩余的常用指令,每个对应指令的讲解,都会有一个小 demo 练习,如果独立写不出来,可以直接复制我的代码,运行分析即可。

接下来就把上篇文章的内容综合一下,写一个小的图片切换功能,需求:有两个按钮,分别显示上一张和下一张,单击按钮切换对应的图片。

代码如下:

<!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>
    </style>
</head>
<body>
    <div id="app">
        <div><button v-show="index > 0" @click="index--">上一张</button></div>
        <img :src="imgList[index]">
        <div><button v-show="index < (imgList.length - 1)" @click="index++">下一张</button></div>
    </div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14"></script>
<script>
    const app = new Vue({
        el: '#app',
        data: {
            index: 0,
            imgList: [
                "./image/1.jpeg", 
                "./image/2.jpeg", 
                "./image/3.jpeg", 
                "./image/4.jpeg", 
                "./image/5.jpeg"
            ]
        }
    })
</script>
</html>

运行结果:

看程序代码,可以发现这里实现是使用数组存放图片的路径,使用 v-bind 配合 index 下标切换图片位置,当图片到了第一张,就没有上一张了,也就不显示 '上一张' 按钮,当图片显示到最后一张,也就不显示 '下一张' 按钮,这样的功能是采用 v-show 进行实现的,尝试阅读代码,独立完成这个小demo。


1、v-for

作用:基于数据循环,多次渲染整个元素

既然是基于数据循环,那么可以基于哪些数据呢?像 数组,对象,数字... 都是支持的。

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

item 表示每一项,index 表示对应项的下标,这里就有点像 forEach 循环了,如果不了解 forEach可以自行下去了解哦。

案例需求:要求基于数据循环展示篮球哥会的技能,比如篮球哥会唱歌,跳舞,说rap,打篮球。

代码实现:

<!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>
    </style>
</head>
<body>
    <div id="app">
        <h1>篮球哥会的技能</h1>
        <ul>
            <li v-for="(item, index) in list">
                {{ item }}
            </li>
        </ul>        
    </div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14"></script>
<script>
    const app = new Vue({
        el: '#app',
        data: {
            list: ['唱歌', '跳舞', '说rap', '打篮球']
        }
    })
</script>
</html>

运行结果:

这里需要对哪个元素循环渲染,就把 v-fro 加到哪个元素上面,前面讲过,item 表示遍历过程中的每个元素,index 表示下标,一定要取名 item 和 index 吗?不用,按照你自己的命名喜好来就行。

显然上面的 index 是没有使用到的,那么可以省略这个 index 吗?当然可以,直接删掉 index 即可:

<li v-for="(item) in list">
    {{ item }}
</li>

当只剩下最后一个 item 的时候,也可以把旁边的括号给去掉,不影响最终的结果:

<li v-for="item in list">
    {{ item }}
</li>

为了更好的学习 v-for,接下来再来实现一个小 demo。

案例需求:设计一个歌单,要求可以删除歌单的内容。

代码实现:

<!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>
    </style>
</head>
<body>
    <div id="app">
        <h1>音乐清单</h1>
        <ul>
            <li v-for="item in list">
                <span>{{ item.name }}</span>
                <span>{{ item.singer }}</span>
                <button @click="del(item.id)">删除</button>
            </li>
        </ul>        
    </div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14"></script>
<script>
    const app = new Vue({
        el: '#app',
        data: {
            list: [
                { id: 1, name: "呓语", singer: "毛不易" },
                { id: 2, anme: "等我回家", singer: "薛之谦" },
                { id: 3, name: "鼓楼", singer: "赵雷" },
                { id: 4, name: "暗号", singer: "周杰伦" },
                { id: 5, name: "忘记时间", singer: "胡歌" }
            ]
        },
        methods:{
            del (id) {
                this.list = this.list.filter(item => item.id !== id)
            }
        }
    })
</script>
</html>

运行结果:

这个程序实现的思路是,针对 li 做循环渲染,每次遍历到的是一个对象,通过获取对象中的属性来实现生成想要的数据,当单击删除按钮的时候,通过对象里的 id 进行作为删除条件,同时使用 filter 函数保留满足条件的项,最后返回新的数组。

为什么 Vue 可以这样写?因为当依赖的数据发生改变,Vue 监听到会进行重新渲染数据视图!

这一点很重要,基本贯穿了 Vue 的学习,当你好奇为什么数据变了,页面也变了,一定要想起来 Vue 的这一点特性!

上面实现的音乐清单代码其实并不完整,正确的是应该加一个 :key :

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

为什么要这样写呢?马上就会介绍到这个 :key 的作用。

v-for 中的 key

语法:key属性="唯一标识"

作用:给列表项添加的唯一标识。便于 Vue 进行列表项的正确排序复用。

如何区分加 key 和 不加 key 的区别呢?可以下去给上述代码第一个 li 加上背景颜色试试,这里就不多介绍,只用文字讲解了。

v-for 的默认行为会尝试原地修改元素(就地复用),简单来说,就只删除了最后一个元素,只进行数据上的更新罢了,而加上 key,就能准确的识别到删除的是哪个元素,也就不存在只进行数据上的更新了。

使用 key 的注意点:

● key 的值只能是 字符串 或 数字类型

● key 的值必须具有唯一性

● 推荐使用 id 作为 key(唯一),不推荐使用 index 作为 key(会变化,不对应)


2、v-model

作用:给表单元素使用,双向数据绑定,可以快速获取或设置表单元素内容

这里再次强调双向数据绑定:

● 数据变化 -> 视图自动更新

● 视图变化 -> 数据自动更新

案例需求:设计一个登录系统,可以登录可以重置用户名和密码:

代码实现:

<!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>
    </style>
</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>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14"></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>
</html>

运行结果:

这里使用了 v-model 将 username 和 password 变量分别绑定到用户名和密码两个 input 中,既然是双向绑定,也就意味着当这两个输入框里面的内容改变了,对应的 username 和 password 变量的内容也会改变,如果 username 和 password 变量改变了,输入框里面的值也就会发生改变。

所以登录逻辑很简单,单击登录按钮的时候,直接将 username 和 password 的值传给后端即可。

重置逻辑也很简单,直接修改 username 和 password 的值为 '' 即可,因为实现了双向绑定!

到这里,回顾一下这样的操作如果使用 js 实现登录,第一步,拿到DOM 树里的 input,接着获取 input 输入框的value 值,接着传递给后端。

如果使用 js 实现重置效果,先使用 js 获取 input,再把 input 中的 value 改成 ''。

现在就慢慢发现了,Vue 中,程序员不需要操作 DOM 树(底层仍然是在操作),只需要维护好数据即可。


下期预告:【后端速成Vue】实现动态表白墙

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

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

相关文章

DBeaver Ultimate forMac/Win中文版:掌控数据宇宙的强大工具

在当今的数字化世界中&#xff0c;数据库管理软件在企业和个人的数据处理中扮演着至关重要的角色。在这篇文章中&#xff0c;我们将介绍一款备受赞誉的数据库管理软件——DBeaver Ultimate&#xff0c;它被广泛应用于各种行业和场景&#xff0c;帮助用户高效地管理和利用他们的…

“Redis与Spring整合及缓存优化“

文章目录 引言1. Spring整合Redis1.1. 为什么选择Redis作为缓存解决方案&#xff1f;Redis的特点和优势Redis与传统关系数据库的对比 1.2. Spring与Redis整合的基本步骤 2. Redis注解式缓存2.1. Spring提供的缓存注解介绍2.2. 使用注解实现方法级别的缓存 3. Redis的击穿、穿透…

系统有同类资源m个,供n个进程共享,若每个进程对资源的最大需求量为k,试问:当m,n,k的值分别为下列情况时(见下表),是否会发生死锁?

一.系统有同类资源m个&#xff0c;供n个进程共享&#xff0c;若每个进程对资源的最大需求量为k&#xff0c;试问&#xff1a;当m,n,k的值分别为下列情况时&#xff08;见下表&#xff09;&#xff0c;是否会发生死锁&#xff1f; &#xff08;1&#xff09;m6;n3;k3 &#xf…

shopee买家通系统一款全自动化操作的软件

Shopee买家通系统可以批量注册虾皮买家号、自动加购加心愿单、根据关键词及产品编号搜索下单。 想要注册虾皮买家号&#xff0c;准备好相应国家的手机号及ip即可&#xff0c;准备好之后按照软件所需格式添加后即可运行自动化注册&#xff0c;注册时可以自动输入手机号、自动接…

linux服务器国内源安装nvm,又快又方便

国内安装nvm的话&#xff0c;如果你的服务器不能访问github&#xff0c;那么使用gitee快速安装还是很方便的&#xff1a; # 能方位github的话&#xff0c;使用这条命令 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash# 不能访问github的话…

延长千倍!美国阿贡实验室量子比特相干时间新纪录

两个具有长相干时间并强耦合的量子比特&#xff08;图片来源&#xff1a;网络&#xff09; 在书面语、口语以及信息处理领域&#xff0c;连贯性均是实现有效沟通的关键要素&#xff0c;这同样适用于量子比特。 美国能源部&#xff08;DOE&#xff09;下属的阿贡国家实验室所领…

计算机毕业设计java+springboot+vue的在线考试系统

项目介绍 具体在系统设计上&#xff0c;采用了B/S的结构&#xff0c;同时&#xff0c;也使用Java技术在动态页面上进行了设计&#xff0c;后台上采用Mysql数据库&#xff0c;是一个非常优秀的青少年编程在线考试系统。 开发环境 开发语言&#xff1a;Java 后端框架&#xff…

SpirngBoot做H5支付 JSSDK支付 为uniapp小程序提供接口 详细内容包含支付、退款以及支付退款回调 纯微信支付V2支付 最后附上完整代码

可以先看一下下面的IndexController 先理解一下需要用到哪些参数然后再从头开始准备就不会一头蒙了 完整代码&#xff1a; 链接: https://pan.quark.cn/s/518e02b22e4f 提取码&#xff1a;J6f2 可能遇到的坑&#xff1a; 微信支付这个的文档可以说跟没有是一样的 只写入参回…

【HMS Core】推送热门合集4

【问题描述1】 如果云端通知的category&#xff0c;本地通知不支持&#xff0c;如何处理&#xff1f; 【解决方案】 如果云端通知的category&#xff0c;本地通知不支持&#xff0c;或者云端通知的category的取值在分类标准中是不涉及&#xff0c;那么说明该类型不支持本地通…

工业物联网网关解决方案openwrt二次开发无线路由WiFi模块选型

在现今高科技快速发展的时代&#xff0c;无线通信技术已经成为人们日常生活中不可或缺的一部分。而在众多的无线技术产品中&#xff0c;基于IEEE 802.11系列协议的WiFi技术无疑是其中的主流。随着WiFi技术的广泛应用&#xff0c;市面上涌现出了各种各样的主控平台和WiFi模块。今…

魔众文库系统 v5.5.0 批量快捷上传,文档图标优化,档转换逻辑优化

魔众文库系统基于文档系统知识&#xff0c;建立平台与领域&#xff0c;打造流量、用户、付费和变现的闭环&#xff0c;帮助您更好的搭建文库系统。 魔众文库系统发布v5.5.0版本&#xff0c;新功能和Bug修复累计14项&#xff0c;批量快捷上传&#xff0c;文档图标优化&#xff…

JQ完成模拟QQ好友分组案例(介绍JQ实现原理)

当我们写这个案例之前&#xff0c;需要引入好JQ文件&#xff0c;以防没有效果 这个案例的需求请看以下效果图 不能重复点击&#xff0c;只有删除掉之后才可以继续点击 效果图&#xff1a; 代码介绍&#xff1a; <!DOCTYPE html> <html lang"en"><h…

【每日一题】2586. 统计范围内的元音字符串数-2023.11.7

题目&#xff1a; 2586. 统计范围内的元音字符串数 给你一个下标从 0 开始的字符串数组 words 和两个整数&#xff1a;left 和 right 。 如果字符串以元音字母开头并以元音字母结尾&#xff0c;那么该字符串就是一个 元音字符串 &#xff0c;其中元音字母是 a、e、i、o、u 。…

Python采集数据代码示例

基本的爬虫程序的示例&#xff1a; typescript import * as request from request; // 信息 const proxyHost ; const proxyPort ; // 网站的 URL const url ; // 使用 request 库发起请求 request({ url, method: GET, proxy: { host: proxyHost…

vue递归获取树形菜单

文章目录 前言什么是递归&#xff1f; 一、数据集二、 递归函数三、打印树形结构展示 前言 什么是递归&#xff1f; 程序调用自身的编程技巧称为递归&#xff08; recursion&#xff09;。 递归 粗略的理解为 循环 &#xff0c;只不过 递归 是调用自身。 在实际使用中&#xf…

libwebsockets入门

WebSocket是一种在单个TCP连接上进行全双工通讯的协议&#xff0c;用于在Web客户端和服务器之间建立持久连接&#xff0c;进行实时通信。它是HTML5开始提供的一种通讯方式&#xff0c;通过使用WebSocket连接&#xff0c;web应用程序可以执行实时的交互&#xff0c;而不是以前的…

将json数据转换为Python字典

import requests from bs4 import BeautifulSoup import json# 定义代理信息 proxy_host www.duoip.cn proxy_port 8000# 定义要爬取的url url http://localhost:9200/_search# 创建一个requests.Session对象&#xff0c;并设置代理 session requests.Session() session.pr…

Python3,3行代码,给照片填充背景色,从此跟照相馆说拜拜。

3行代码照片上背景色 1、引言2、代码实战2.1 思路2.2 安装2.3 实例 3、总结 1、引言 小屌丝&#xff1a; 鱼哥&#xff0c;帮个忙。 小鱼&#xff1a; 在开车。 小屌丝&#xff1a;… 那你先忙&#xff0c;不打扰你了。 小鱼&#xff1a;…我可以说话的&#xff0c;没事。 小屌…

3.4、Linux小程序:进度条

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 回车与换行的概念和区别 行缓冲区概念 进度条代码 version1 version2 version3 回车与换行的概念和区别 换行\n&#xff0c;回车\r 似乎无需多言 行缓冲区概念 这里我们通过例子来简单理解即可&#xff0c;深入…

Wait-Notify机制

文章目录 1. 简介2. 相关API3. wait notify的正确姿势4. 总结 1. 简介 回顾Minitor锁的结构&#xff1a; Owner线程发现条件不满足&#xff0c;调用wait方法&#xff0c;即可进入WaitSet变为WAITING状态BLOCKED和WAITING的线程都处于阻塞状态&#xff0c;不占用CPU时间BLOCK…