Vue01
前端最新Vue2+Vue3基础入门到实战项目全套教程,自学前端vue就选黑马程序员,一套全通关!_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1HV4y1a7n4?spm_id_from=333.788.videopod.episodes&vd_source=016213ecd945408976ff307a6bda3087
https://www.bilibili.com/video/BV1HV4y1a7n4?spm_id_from=333.788.videopod.episodes&vd_source=016213ecd945408976ff307a6bda3087
以上视频的学习笔记,方便查阅和复习。
目录
一、为什么要学习Vue
二、什么是Vue
1.什么是构建用户界面
2.什么是渐进式
Vue的两种开发方式:
3.什么是框架
总结:什么是Vue?
三、创建Vue实例
四、插值表达式 {{}}
1.作用:通过 表达式 进行插值,渲染数据到页面中
2.语法
3.注意!!!
五、数据的响应式处理特性
1.什么是响应式?
2.如何访问 和 修改 data中的数据(响应式演示)
3.总结
六、Vue开发者工具安装
七、Vue中的常用指令
八、内容渲染指令
九、条件渲染指令 v-show/if
十、事件绑定指令 @事件名
十一、属性绑定指令 :标签属性名
十二、小案例-波仔的学习之旅
十三、v-for指令
十四、小案例-小黑的书架
十五、v-for中的key
十六、双向绑定指令 v-model
十七、综合案例-小黑记事本
一、为什么要学习Vue
1.前端必备技能
2.岗位多,绝大互联网公司都在使用Vue
3.提高开发效率
4.高薪必备技能(Vue2+Vue3)
二、什么是Vue
概念:Vue (读音 /vjuː/,类似于 view) 是一套 构建用户界面 的 渐进式 框架
Vue2官网:Vue.js
1.什么是构建用户界面
基于数据 渲染出用户可以看到的界面

2.什么是渐进式
渐进式就是循序渐进,不一定非得把Vue中的所有API都学完才能开发Vue,可以学一点开发一点
Vue的两种开发方式:
-  Vue核心包开发 场景:局部模块改造 
-  Vue核心包&Vue插件&工程化 场景:整站开发 
3.什么是框架
所谓框架:就是一套完整的解决方案
举个栗子
如果把一个完整的项目比喻为一个装修好的房子,那么框架就是一个毛坯房。
我们只需要在“毛坯房”的基础上,增加功能代码即可。
提到框架,不得不提一下库。
-  库,类似工具箱,是一堆方法的集合,比如 axios、lodash、echarts等 
-  框架,是一套完整的解决方案,实现了大部分功能,我们只需要按照一定的规则去编码即可。 
下图是 库 和 框架的对比。

框架的特点:有一套必须让开发者遵守的规则或者约束
咱们学框架就是学习的这些规则 官网
总结:什么是Vue?
Vue是什么:
什么是构建用户界面:
什么是渐进式:
什么是框架:
三、创建Vue实例
我们已经知道了Vue框架可以 基于数据帮助我们渲染出用户界面,那应该怎么做呢?

比如就上面这个数据,基于提供好的msg 怎么渲染后右侧可展示的数据呢?
核心步骤(4步):
-  准备用于渲染的容器 
-  引入vue核心包(官网) — 分为 开发版本/生产版本 
-  创建Vue实例 new Vue() 
-  在Vue实例中添加配置项,渲染数据 -  el:指定挂载点,配置选择器,指定要渲染的容器 
-  data:通过data给当前的组件(vue文件)提供数据 
-  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><!-- 1. 准备用于渲染的容器 --><div id="app"><!-- 将来编写一些用于渲染的代码逻辑 -->{{msg}}<a href="#">{{count}}</a></div> <!-- 2. 引入开发版本的核心包 --><script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script><!-- 引入了VueJS核心包,在全局环境中,就有Vue构造函数了 --><script><!-- 3. 创建Vue实例  new Vue() --><!-- 4. 在Vue实例中添加配置项,渲染数据 -->    const app = new Vue({//通过el 来配置选择器,指定Vue管理的是哪个盒子el:'#app',//通过data 提供要渲染的数据data:{  msg:'Hello',count:666}})</script>
</body>
</html>效果:
总结:创建Vue实例需要执行哪4步
四、插值表达式 {{}}
插值表达式是一种Vue的模板语法

1.作用:通过 表达式 进行插值,渲染数据到页面中
表达式:是可以被求值的代码,JS引擎会将其计算出一个结果,只要是表达式就可以往{{}}里面放
以下的情况都是表达式:
money + 100
money - 100
money * 10
money / 10 
price >= 100 ? '真贵':'还行'
obj.name
arr[0]
fn()
obj.fn()2.语法
插值表达式语法:{{ 表达式 }}
<!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的一种模板语法作用:利用 表达式 进行插值渲染语法:{{ 表达式 }}注意点:1. 使用的数据要存在2. 支持的是表达式,不是语句  if  for3. 不能在标签属性中使用 {{ }}-->
<div id="app"><p>{{ nickname }}</p><p>{{ nickname.toUpperCase() }}</p><p>{{ nickname + '你好' }}</p><p>{{ age >= 18 ? '成年' : '未成年' }}</p><p>{{ friend.name }}</p><p>{{ friend.desc }}</p><!-- ---------以下这些用法是错误的!-------------- --><!-- <p>{{ hobby }}</p> --><!-- <p>{{ if }}</p> --><!-- <p title="{{ nickname }}">我是p标签</p> -->
</div><script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
<script>const app = new Vue({el: '#app',data: {nickname: 'tony',age: 18,friend: {name: 'jepson',desc: '热爱学习 Vue'}}})</script></body>
</html>效果:
3.注意!!!
1.在插值表达式中使用的数据 必须在data中进行了提供!!!!!!!!
<p>{{hobby}}</p>  //如果在data中不存在 则会报错2.支持的是表达式,而非语句,比如:if   for ...
<p>{{if}}</p>3.不能在标签属性中使用 {{  }} 插值 ,插值表达式只能在标签中间使用!!!!!!!!!!!!!!!!!!!!!!!
<p title="{{username}}">我是P标签</p>五、数据的响应式处理特性
1.什么是响应式?
数据变化后,视图(页面)也会自动更新。
2.如何访问 和 修改 data中的数据(响应式演示)
data中的数据, 最终会被添加到vue的实例上,所以可以访问数据or修改数据:
- data配置项中的数据已经是响应式数据了。
① 访问数据: "实例.属性名"
② 修改数据: "实例.属性名"= "值"

<!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><div id="app">{{ msg }}{{ count }}
</div><script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>const app = new Vue({el: '#app',data: {// 响应式数据 → 数据变化了,视图自动更新msg: '你好,黑马',count: 100}})// data中的数据,是会被添加到实例上// 1. 访问数据  实例.属性名// 2. 修改数据  实例.属性名 = 新值</script></body>
</html>效果:可通过控制台修改数据也可通过vue开发者工具修改数据,页面都会变化


3.总结
-  什么是响应式 
-  如何访问和修改data中的数据呢 
六、Vue开发者工具安装
-  通过谷歌应用商店安装(国外网站) 
-  极简插件下载(推荐) 极简插件官网_Chrome插件下载_Chrome浏览器应用商店 
安装步骤:


安装之后可以F12后看到多一个Vue的调试面板:

七、Vue中的常用指令
Vue会根据不同的指令,针对标签实现不同的功能。
指令: 带有v- 前缀的 标签属性。
下面是v-html的例子,v-html的作用是:动态设置元素的innerHTML,可以解析字符串标签。
<!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><div id="app"><div v-html="msg"></div></div><script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>const app = new Vue({el: '#app',data: {msg: `<h3>学前端~来黑马!</h3>`}})</script></body>
</html>效果:
为啥要学:提高程序员操作 DOM 的效率。
vue 中的指令按照不同的用途可以分为如下 6 大类:
-  内容渲染指令(v-html、v-text) 
-  条件渲染指令(v-show、v-if、v-else、v-else-if) 
-  事件绑定指令(v-on) 
-  属性绑定指令 (v-bind) 
-  双向绑定指令(v-model) 
-  列表渲染指令(v-for) 
指令是 vue 开发中最基础、最常用、最简单的知识点。
八、内容渲染指令
内容渲染指令用来辅助开发者渲染 DOM 元素的文本内容。常用的内容渲染指令有如下2 个:
-  v-text(类似innerText) 
-  -  使用语法: <p v-text="uname">hello</p>,意思是将 uame 值渲染到 p 标签中
-  类似 innerText,使用该语法,会覆盖 p 标签原有内容 
 
-  
-  v-html(类似 innerHTML) -  作用:动态设置元素的innerHTML 
 
-  
-  -  使用语法: <p v-html="intro">hello</p>,意思是将 intro 值渲染到 p 标签中
-  类似 innerHTML,使用该语法,会覆盖 p 标签原有内容 
-  类似 innerHTML,使用该语法,能够将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><div id="app"><div v-html="msg"></div></div><script src="./vue.js"></script><script>const app = new Vue({el: '#app',data: {msg: `<a href="http://www.itcast.cn">学it, 来黑马</a>`}})</script></body>
</html>效果:

九、条件渲染指令 v-show/if
条件判断指令,用来按需控制 DOM 的显示与隐藏。条件渲染指令有如下两个,分别是
1. v-show
-  作用: 控制元素的显示和隐藏 
-  语法: v-show = "表达式" 表达式值为 true时 显示, 为false时 隐藏 
-  原理: 切换css的 display:none 来控制元素的显示和隐藏 
-  场景:频繁切换显示隐藏的场景 

2. v-if
-  作用: 控制元素的显和示隐藏(条件渲染) 
-  语法: v-if= "表达式" 表达式值为 true时 显示, 为false时 隐藏 
-  原理: 根据条件判断,是否创建 或 移除元素节点 
-  场景: 要么显示,要么隐藏,不频繁切换的场景 

示例代码:
<!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: 100px;line-height: 100px;margin: 10px;border: 3px solid #000;text-align: center;border-radius: 5px;box-shadow: 2px 2px 2px #ccc;}</style>
</head>
<body><!-- v-show底层原理:切换 css 的 display: none 来控制显示隐藏v-if  底层原理:根据 判断条件 控制元素的 创建 和 移除(条件渲染)--><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/dist/vue.js"></script><script>const app = new Vue({el: '#app',data: {flag: true}})</script></body>
</html>
3. v-else 和 v-else-if
-  作用:辅助v-if进行判断渲染,需要紧接着v-if使用 
-  语法:v-else v-else-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><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>效果:

十、事件绑定指令 @事件名
作用:给DOM元素注册事件
语法如下:
-  <button v-on:事件名="内联语句">按钮</button> 
-  <button v-on:事件名="methods中的函数名">按钮</button> 
-  <button v-on:事件名="methods中的函数名(实参1,实参2...)">按钮</button> -  如果不传递任何参数,则方法无需加小括号 
 
-  
-  v-on:可以简写为 @
1. 内联语句
-  内联语句其实就是一段可执行的js代码 
<!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><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>2. 事件处理函数:methods配置项中定义的函数
-  事件处理函数应该写到一个跟data同级的配置项(methods)中 
-  在methods中,函数内部的this都指向Vue实例,所以在函数内部可以用 this.data中的属性名 访问data配置项中的数据。 
<!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><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 app4 = new Vue({el: '#app',data: {isShow: true},methods: {fn () {// 让提供的所有methods中的函数,this都指向当前实例// console.log('执行了fn', app.isShow)// console.log(app3 === this)this.isShow = !this.isShow}}})</script>
</body>
</html>3. 给事件处理函数传参
-  methods方法中可以直接使用 e 当做事件对象 
-  如果传递了参数,则实参 $event表示事件对象,固定用法。
<!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 {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>小黑自动售货机</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) {this.money -= price}}})</script>
</body>
</html>效果:
点一下三个按钮中的其中一个,银行卡余额就会减去响应的数值
十一、属性绑定指令 :标签属性名
-  作用:动态设置 元素的标签属性,比如设置标签属性:src、url、title 
-  语法:v-bind:标签属性名=“表达式” 
-  v-bind: 可以简写成=> :标签属性名=“表达式” 
场景:动态设置img标签的标签属性
<!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><div id="app"><!-- v-bind:src   =>   :src --><img v-bind:src="imgUrl" v-bind:title="msg" alt=""><img :src="imgUrl" :title="msg" alt=""></div><script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>const app = new Vue({el: '#app',data: {imgUrl: './imgs/10-02.png',msg: 'hello 波仔'}})</script>
</body>
</html>效果:
十二、小案例-波仔的学习之旅
需求:默认展示数组中的第一张图片,点击上一页下一页来回切换数组中的图片
实现思路:
1.用数组存储图片路径 ['url1','url2','url3',...]
2.可以准备个下标index 去数组中取图片地址。
3.通过v-bind给src绑定当前的图片地址
4.点击上一页下一页只需要修改下标的值即可
5.当展示第一张的时候,上一页按钮应该隐藏。展示最后一张的时候,下一页按钮应该隐藏
<!DOCTYPE html> <!-- 定义文档类型为HTML5 -->
<html lang="en"> <!-- 设置页面语言为英文 -->
<head><meta charset="UTF-8"> <!-- 设置页面字符集为UTF-8 --><meta http-equiv="X-UA-Compatible" content="IE=edge"> <!-- 告诉IE使用最新的引擎渲染页面 --><meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- 设置视口宽度为设备宽度,初始缩放比例为1.0 --><title>Document</title> <!-- 设置页面标题 -->
</head>
<body><div id="app"> <!-- Vue实例挂载点 --><button v-show="index > 0" @click="index--">上一页</button> <!-- 当index大于0时显示按钮,点击时index减1 --><div><img :src="list[index]" alt=""> <!-- 显示list数组中当前index对应的图片 --></div><button v-show="index < list.length - 1" @click="index++">下一页</button> <!-- 当index小于list长度减1时显示按钮,点击时index加1 --></div><script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script> <!-- 引入Vue.js库 --><script>const app = new Vue({ // 创建Vue实例el: '#app', // 指定Vue实例挂载的元素data: { // 定义Vue实例的数据index: 0, // 当前图片索引list: [ // 图片列表'./imgs/11-00.gif','./imgs/11-01.gif','./imgs/11-02.gif','./imgs/11-03.gif','./imgs/11-04.png','./imgs/11-05.png',]}})</script>
</body>
</html>
十三、v-for指令
作用:基于数据 循环渲染 带有v-for的整个html元素,可以遍历数组、对象、数字
v-for 指令需要使用 (item, index) in arr 形式的特殊语法,其中:
-  item 表示数组中的每一项 
-  index 是每一项的索引,不需要可以省略 -  索引从0开始 
 
-  
-  arr 是被遍历的数组 
以下是遍历数组的例子:
<!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 id="app"><!-- 页面标题 --><h3>小黑水果店</h3><!-- 无序列表,用于显示带有索引的水果列表 --><ul><!-- 列表项,使用v-for指令遍历list数组,同时获取元素和索引 --><li v-for="(item, index) in list"><!-- 显示水果名称和索引 -->{{ item }} - {{ index }}</li></ul><!-- 另一个无序列表,用于显示水果列表 --><ul><!-- 列表项,使用v-for指令遍历list数组,获取元素 --><li v-for="item in list"><!-- 显示水果名称 -->{{ item }}</li></ul></div><!-- 引入Vue.js库 --><script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><!-- Vue实例的JavaScript代码 --><script>// 创建Vue实例const app = new Vue({// 指定Vue实例挂载的元素el: '#app',// 定义Vue实例的数据data: {// 定义一个包含水果名称的数组list: ['西瓜', '苹果', '鸭梨', '榴莲']}})</script>
</body>
</html>
效果:
此语法也可以遍历对象和数字
//遍历对象
<div v-for="(value, key, index) in object">{{value}}</div>
value:对象中的值
key:对象中的键
index:遍历索引从0开始//遍历数字
<p v-for="item in 10">{{item}}</p>
item从1 开始十四、小案例-小黑的书架
需求:
1.根据左侧数据渲染出右侧列表(v-for)
2.点击删除按钮时,应该把当前行从列表中删除(获取当前行的id,利用filter进行过滤)

实现:
<!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 id="app"><!-- 书架标题 --><h3>小黑的书架</h3><!-- 无序列表,用于显示书籍列表 --><ul><!-- 列表项,使用v-for指令遍历booksList数组,同时使用:key绑定唯一标识 --><li v-for="(item,index) in booksList" :key="item.id"><!-- 显示书籍名称 --><span>{{item.name}}</span><!-- 显示书籍作者 --><span>{{item.author}}</span><!-- 删除按钮,注册点击事件 --><button @click="del(item.id)">删除</button><!-- 点击事件处理函数,用于删除数组中对应的项 --></li></ul></div><!-- 引入本地Vue.js库 --><script src="./vue.js"></script><!-- Vue实例的JavaScript代码 --><script>// 创建Vue实例const app = new Vue({// 指定Vue实例挂载的元素el: '#app',// 定义Vue实例的数据data: {// 定义一个包含书籍信息的数组booksList: [{ id: 1, name: '《红楼梦》', author: '曹雪芹' },{ id: 2, name: '《西游记》', author: '吴承恩' },{ id: 3, name: '《水浒传》', author: '施耐庵' },{ id: 4, name: '《三国演义》', author: '罗贯中' }]},// 定义Vue实例的方法methods:{// 删除方法,根据id删除数组中的对应项del(id){console.log('删除',id)// 使用filter方法过滤掉id匹配的项,更新booksList数组this.booksList = this.booksList.filter(item => item.id !== id)}}})</script>
</body>
</html>
十五、v-for中的key
继续使用第十四节的案例代码。
语法: key="唯一值"
作用:给列表项设置的唯一标识。便于Vue进行列表项的正确排序复用。
为什么加key:Vue 的默认行为会尝试原地修改元素,也就是删除最后一个li标签,然后将内容上移
注意:
-  key 的值只能是字符串 或 数字类型 
-  key 的值必须具有唯一性 
-  推荐使用 id 作为 key(唯一),不推荐使用 index 作为 key(会变化,不对应) 
十六、双向绑定指令 v-model
双向绑定就是:
-  数据改变后,呈现的页面会更新 
-  页面更新后,数据也会随之变化 
作用: 在表单元素(input、radio、select)上使用,实现数据和视图的双向数据绑定,快速 获取 或 设置 表单元素的内容
语法:v-model="data中的变量名"
需求:使用双向绑定实现以下需求
-  点击登录按钮获取表单中的内容 
-  点击重置按钮清空表单中的内容 

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><!-- 告诉IE使用最新的引擎渲染页面 --><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 id="app"><!-- 输入框,使用v-model实现双向数据绑定,用于获取账户名 -->账户:<input type="text" v-model="username"> <br><br><!-- 输入框,使用v-model实现双向数据绑定,用于获取密码 -->密码:<input type="password" v-model="password"> <br><br><!-- 登录按钮,绑定点击事件 --><button @click="login">登录</button><!-- 重置按钮,绑定点击事件 --><button @click="reset">重置</button></div><!-- 引入Vue.js库 --><script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><!-- Vue实例的JavaScript代码 --><script>// 创建Vue实例const app = new Vue({// 指定Vue实例挂载的元素el: '#app',// 定义Vue实例的数据data: {// 账户名数据username: '',// 密码数据password: ''},// 定义Vue实例的方法methods: {// 登录方法,打印账户名和密码login () {console.log(this.username, this.password)},// 重置方法,清空账户名和密码reset () {this.username = ''this.password = ''}}})</script>
</body>
</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" />
<link rel="stylesheet" href="./css/index.css" />
<title>记事本</title>
</head>
<body><!-- 主体区域 -->
<section id="app"><!-- 输入框区域 --><header class="header"><!-- 标题 --><h1>小黑记事本</h1><!-- 输入框,使用v-model双向绑定todoName --><input v-model="todoName" placeholder="请输入任务" class="new-todo" /><!-- 添加任务按钮,点击触发add方法 --><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><!-- 删除任务的按钮,点击触发del方法 --><button @click="del(item.id)" class="destroy"></button></div></li></ul></section><!-- 统计和清空区域,使用v-show根据任务列表长度决定是否显示 --><footer v-show="list.length > 0" class="footer"><!-- 任务统计 --><span class="todo-count">合 计:<strong> {{list.length}} </strong></span><!-- 清空所有任务的按钮,点击触发clear方法 --><button @click="clear" class="clear-completed">清空任务</button></footer>
</section><!-- 底部脚本区域 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script><script>// 创建Vue实例const app = new Vue({// 指定Vue实例挂载的元素el: '#app',// 定义Vue实例的数据data: {// 绑定输入框的值todoName:"",// 任务列表list:[{id:1,name:"跑步一公里"},{id:2,name:"跳绳一公里"},{id:3,name:"游泳一公里"},]},// 定义Vue实例的方法methods:{// 删除任务的方法del(id){// 使用filter方法删除指定id的任务项console.log(id)this.list = this.list.filter(item => item.id !== id)},// 添加任务的方法add(){// 检查输入是否为空,若为空则弹出提示if(this.todoName.trim()===''){alert('请输入任务名称')return}// 向任务列表前添加新任务,并清空输入框this.list.unshift({id: +new Date(),name: this.todoName})this.todoName = ''},// 清空任务列表的方法clear(){// 将任务列表设置为空数组this.list = []}}})
</script>
</body>
</html>
相关文章:
 
Vue01
前端最新Vue2Vue3基础入门到实战项目全套教程,自学前端vue就选黑马程序员,一套全通关!_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1HV4y1a7n4?spm_id_from333.788.videopod.episodes&vd_source016213ecd945408976ff307a6bda30…...
 
MySQL - Navicat自动备份MySQL数据
对于从事IT开发的工程师,数据备份我想大家并不陌生,这件工程太重要了!对于比较重要的数据,我们希望能定期备份,每天备份1次或多次,或者是每周备份1次或多次。 如果大家在平时使用Navicat操作数据库&#x…...
 
系统分析师20:【案例特训专题3】系统设计与运维
1 Web开发 1.1 Web开发涉及技术的综合应用 高性能高可用可维护应变安全 1.2 Web系统架构演化过程 1.2.1 单台机器到数据库与Web服务器分离 早期的web系统往往以单台机器形态出现,web网站无论是前端还是后台数据库都部署在一台服务器上,部署起来比较…...
Linux 局域网中使用NTP配置时间服务
一:NTP 时间服务器配置 前提: 局域网环境中一般不能直接使用互联网上提供的时间服务器,例如ntp.aliyun.com。所以可以使用局域网中的一个服务器时间为基准,其他服务器的时间都和他保持一致。 1、将服务器的系统时间配置为时间源…...
Shiro会话管理和加密
一、会话相关API及会话使用 Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如Web容器Tomcat),可以在JavaSE和JavaEE环境中使用。会话相关API主要包括: Subject.getSession(): 获取当前用户的会话࿰…...
 
GPON、XG-PON和XGS-PON的区别
类别GPON10G PON 细分 GPON XG-PON XGS-PON 下行速率 2.488 Gbps 9.953 Gbps 9.953Gbps 上行速率 1.244 Gbps 2.488 Gbps 9.953Gbps 可用带宽 2200Mbps 8500Mbps 8500Mbps 1000Mbps2000Mbps8500Mbps ITU-T标准 G.984(2003年) G.987 &a…...
Spring 项目返回值枚举类编写技巧
Spring 项目返回值枚举类编写技巧 在 Spring 项目中,使用枚举类来统一管理返回值和状态码是一种非常优雅的实现方式。这不仅能提升代码的可读性和维护性,还能避免在代码中硬编码字符串或数字来表示状态码。本文将以 ReturnCodeEnum 为例,介绍…...
 
【操作系统】06.进程控制
一、进程创建 1.1 认识fork函数 在linux中fork函数是非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。 进程调用fork,当控制转移到内核中的fork代码后,内核将 分配新的内存块和内核数据结构…...
16天自制CppServer-day02
day02-设置错误与异常处理机制 上一天我们写了一个客户端与服务器通过socket进行连接,对socket,bind,listen,accept,connect等函数,我们都设想程序完美地、没有任何异常地运行,但显然这不现实,应该设置出现异常的处理机制&#x…...
 
时空智友企业流程化管控系统uploadStudioFile接口存在任意文件上传漏洞
免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 1. 时空智友…...
 
Linux 中文件的权限说明
目录 一:文件权限类型二:默认权限管理1. 查看当前用户的umask值2. 修改当前用户的umask值3. 根据umask计算默认权限 三:普通权限管理1. 三种普通权限说明1.1 对于非目录文件来说1.2 对于目录文件来说 2. 查看某个文件的权限信息2.1 使用 ls -…...
 
MySql数据库中数据类型
本篇将介绍在 MySql 中的所有数据类型,其中主要分为四类:数值类型、文本和二进制类型、时间日期、String 类型。如下(图片来源:MySQL数据库): 目录如下: 目录 数值类型 1. 整数类型 2. …...
 
Godot中的信号
目录 概念 signal connect方法连接Callable 信号要求参数 查看信号 连接信号 监听信号 Button - text属性 pressed 连接源 「按钮」的信号连接 使用代码,将方法与信号相连接 节点的connect方法 节点直接使用emit_signal方法通过字符串的方式触发信号…...
vba学习系列(8)--指定列单元格时间按时间段计数
系列文章目录 文章目录 系列文章目录前言一、背景二、VBA总结 前言 一、背景 时间格式:00:00:00 时间段格式:00:00:00 - 01:00:00 计数N列单元格时间位于时间段内的行数 二、VBA 代码如下(示例): Sub AssignTimeSeg…...
 
大型企业软件开发是什么样子的? - Web Dev Cody
引用自大型企业软件开发是什么样子的? - Web Dev Cody_哔哩哔哩_bilibili 一般来说 学技术的时候 我们会关注 开发语言特性 ,各种高级语法糖,底层技术 但是很少有关注到企业里面的开发流程,本着以终为始(以就业为导向…...
 
【stm32】DMA的介绍与使用
DMA的介绍与使用 1、DMA简介2、存储器映像3、DMA框图4、DMA基本结构5、DMA请求6、数据宽度与对齐7、数据转运DMA(存储器到存储器的数据转运)程序编写: 8、ADC连续扫描模式DMA循环转运DMA配置:程序编写: 1、DMA简介 DM…...
 
哈希表的魔力
哈希表与字典 普遍存在一种误解,认为“哈希表”和“字典”这两个术语可以互换。这种观念从根本上是不准确的,至少在计算机科学领域是如此。 字典是将键映射到值的数据结构的一般概念。而哈希表是字典的具体实现。 本质上,字典扮演着一个总体…...
 
《YOLO 目标检测》—— YOLO v3 详细介绍
!!!!!!!!!!!!!还未写完!!!!!!!…...
 
WNN 多模态整合 | Seurat 单细胞多组学整合流程
测试环境:CentOS7.9, R4.3.2, Seurat 4.4.0, SeuratObject 4.1.4 2024.10.23 # WNN library(ggplot2) library(dplyr) library(patchwork)1. 导入数据 (1). load counts of RNA and protein dyn.load(/home/wangjl/.local/lib/libhdf5_hl.so.100) library(hdf5r)…...
 
【Linux】磁盘文件系统(inode)、软硬链接
文章目录 1. 认识磁盘1.1 磁盘的物理结构1.2 磁盘的逻辑结构 2. 引入文件系统2.1 EXT系列文件系统的分区结构2.2 inode 3. 软硬链接3.1 软链接3.2 硬链接 在讲过了内存文件系统后,我们可以知道文件分为两种: 打开的文件(内存中)未…...
 
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
 
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
 
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
 
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
 
数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...
