【Vue-vue基础知识】学习笔记

目录

  • <<回到导览
  • vue基础知识
    • 1.1.创建一个vue实例
    • 1.2.vue基础指令
      • 1.2.1.v-bind
      • 1.2.2.v-model
      • 1.2.3.常用事件
      • 1.2.4.指令修饰符
    • 1.3.计算属性
      • 1.3.1.计算属性的完整写法
      • 1.3.2.【案例】成绩
    • 1.4.watch
      • 1.4.1.watch属性
      • 1.4.2.翻译业务实现
      • 1.4.3.watch属性的完整写法
      • 1.4.4.【案例】水果购物车
    • 1.5.生命周期
      • 1.5.1.【应用】初始化渲染
      • 1.5.2.【应用】获取焦点

<<回到导览

vue基础知识

mvvm模型

响应式数据,一旦数据变化,视图效果跟着变化

1.1.创建一个vue实例

  • 代码:

     <!-- 1.准备容器 --><div id="app">{{msg}}{{age-1}}</div><!-- 2.引入开发版本的包 --><script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script><script>// 3.创建实例const app = new Vue({// 4.添加配置项el: '#app',// el => 挂载data: {msg: 'hello',age: 18}})
    
  • 插值表达式

    {{}}包裹变量名,将表达式插值,如上面{{msg}}和{{age-1}},浏览器会分别渲染值hello和 17

  • 响应式特性

    响应式:数据变化,视图自动更新,当我们修改数据后,vue会监听到数据修改,从而改变视图

    data里的数据会添加到实例身上,以上面实例为例子,我们可以通过app访问属性msg和age
    在这里插入图片描述)

1.2.vue基础指令

  • 一些基础指令:

        <!-- 1.v-html  =>  innerHtml   --><div v-html="msg2"></div><!-- 2.v-show  =>  通过display来显示和隐藏  =>  一般用于交互频繁  --><div v-show="flag3">333</div><!-- 3.v-if  =>   条件渲染                 =>  用于交互不频繁    --><div v-if="flag3">444</div><!-- 4.v-if、 v-else-if   v-else          =>   条件渲染  --><!-- 5.v-on 注册事件  每点击一下,count -1 -->v-on:click="count--"   =>   @click="count--" 
    
  • methods属性(用于存放事件方法)

    <!-- 点击按钮,调用methods方法,弹出提示框 -->
    <button @click="methods">methods</button><!-- js -->
    methods: {methods() {alert('methods')}
    }
    
  • 7.v-for(基于数组循环,多次渲染整个元素,v-for="(item,index) in arr

    <!-- 编号arr中的项,并且列举 -->
    <li v-for="(item, index) in list">{{index+1}}.{{item}}</li>
    

    v-for中的key:给元素添加唯一标识,用于列表项的正确排序(key值必须具有唯一性,不推荐以index作为key值)

1.2.1.v-bind

  • 可省略成: ,用于实现熟悉的响应式

      <!-- imgUrl为配置项中data中的数据 --><img v-bind:src="imgUrl"><!-- 等价为 --><img :src="imgUrl" alt="">
    

    v-bind可以操作class

    1. 传对象

      应用场景:一个类名,来回切换(tab栏)

      <!-- size、pink、green都为类名 -->
      <div class="box" :class="{size:true,pink:false,green:true}">123</div>
      
  1. 传数组

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

    <div class="box" :class="['pink','size']">223</div>
    
  2. style行内样式

    应用场景:非常方便地控制某个样式属性的变化(进度条),数值拼接单位

    <div class="box" :style="{'background-color':'green'}"></div>
    

1.2.2.v-model

v-modal 可以让数据和视图双向绑定,快速获取或者设置表单元素内容

<!-- input框值变化,data中对应的数据也会变化 -->
<input type="text" v-model="username"><br>

对于不同的表单元素, v-modal 的绑定也有所不同

表单元素绑定备注
输入框valuetext
文本域valuetextarea
复选框checkedcheckbox
单选框checkedradio,name将单选框关联
下拉菜单selected元素中,option选项的value值selected、option

1.2.3.常用事件

事件触发
@click单击触发
v-model常用于绑定input事件
@submit表单提交触发
@mouseover鼠标悬停触发
@mouseout鼠标移开触发
  • 焦点事件

    事件触发
    @focus元素获得焦点
    @blur元素失去焦点
  • 表单事件

    事件触发
    @reset点击重置按钮时
    @submit点击提交按钮
  • 键盘事件

    事件触发
    @keydown按下任意按键。
    @keypress除 Shift、Fn、CapsLock 外的任意键被按住。
    @keyup按键弹起

1.2.4.指令修饰符

  1. 按键修饰符
    • @keyup.enter:键盘回车监听
  2. v-model修饰符
    • v-model.trim:去首尾空格
    • v-model.number:转数字
  3. 事件修饰符
    • 事件名.stop:阻止冒泡
    • 事件名.prevent:阻止默认行为
  4. 其他
    • once:事件只触发一次

1.3.计算属性

计算属性会对计算结果缓存,依赖项变了,会自动重新计算,并再次缓存,缓存可以被直接读取(性能高)

1.methods属性

<p>礼物总数:{{ total() }}</p>
<p>礼物总数:{{ total() }}</p>
<p>礼物总数:{{ total() }}</p><!-- js中 -->
data: {list: [{ id: 1, name: '篮球', num: 1 },{ id: 2, name: '玩具', num: 2 },{ id: 3, name: '铅笔', num: 5 },]
},
methods: {total() {console.log("执行了一次。");return this.list.reduce((sum, item) => sum + item.num, 0)}
}
  • 控制台会打印三次"执行了一次。"
  1. computed属性
 <!-- 计算属性依旧是属性,不用加() -->
<p>礼物总数:{{ total }}</p>
<p>礼物总数:{{ total }}</p>
<p>礼物总数:{{ total }}</p><!-- js中 -->
computed: {封装一段对于数据的处理,求得一个结果total() {console.log("执行了一次。");return this.list.reduce((sum, item) => sum + item.num, 0)}
}
  • 控制台会打印一次"执行了一次。"

1.3.1.计算属性的完整写法

计算属性默认只能访问,不能修改,如果要修改,需要计算属性的完整写法

computed:{fullName(){return this.firstName + this.lastName}
}

以上写法等价于

computed:{fullName:{get(){return this.firstName + this.lastName}}
}
  • 上面写法只能通过监听firstName和lastName,来动态改变fullName的值
  • 现在假设fullName会变化,我们fullName变化时,有对firstName和lastName进行拆分的需求,就需要计算属性的完整写法
computed:{fullName:{// 监听firstName和lastName,动态改变fullName的值get(){return this.firstName + this.lastName},// 监听fullName,动态改变firstName和lastName的值set(value){this.firstName = value.slice(0,1))this.lastName = value.slice(1)}}
}

从上面可以看出,set方法的形参value为fullName的值

当然除了改变firstName和lastName的值,还可以做出其他的一些操作,这里就不一一例举了

1.3.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" /><link rel="stylesheet" href="./styles/index.css" /><title>Document</title>
</head><body><div id="app" class="score-case"><div class="table"><table><thead><tr><th>编号</th><th>科目</th><th>成绩</th><th>操作</th></tr></thead><tbody v-if="list.length>0"><tr v-for="(item,index) in list" :key="item.id"><td>{{item.id}}</td><td>{{item.subject}}</td><td :class="{red:item.score<60}">{{item.score}}</td><td><a href="#" @click="del(item.id)">删除</a></td></tr></tbody><tbody v-else><tr><td colspan="5"><span class="none">暂无数据</span></td></tr></tbody><tfoot><tr><td colspan="5"><span>总分:{{total}}</span><span style="margin-left: 50px">平均分:{{average}}</span></td></tr></tfoot></table></div><div class="form"><div class="form-item"><div class="label">科目:</div><div class="input"><input type="text" placeholder="请输入科目" v-model="subject" /></div></div><div class="form-item"><div class="label">分数:</div><div class="input"><input type="text" placeholder="请输入分数" v-model="score" /></div></div><div class="form-item"><div class="label"></div><div class="input"><button class="submit" @click="add">添加</button></div></div></div></div><script src="../../vue/vue.js"></script><script>const app = new Vue({el: '#app',data: {list: [{ id: 1, subject: '语文', score: 20 },{ id: 2, subject: '数学', score: 99 },{ id: 3, subject: '英语', score: 70 },],subject: '',score: ''},methods: {del(id) {this.list = this.list.filter(item => item.id !== id)},add() {if (!this.subject || !this.score) {alert('没有输入科目或者分数!!!')} else {// 往数组前面加this.list.unshift({// 以时间戳作为id,来设置keyid: +new Date(),subject: this.subject,score: this.score})this.subject = ''this.score = ''}}},computed: {total() {return this.list.reduce((sum, item) => sum + item.score, 0)},average() {if (this.list.length == 0) {return 0} else {return this.total / (this.list.length)}}}})</script>
</body></html>

重要知识点

  1. 删除逻辑

     del(id) {this.list = this.list.filter(item => item.id !== id)},
    
    • 通过点击触发del方法,传入id
    • 通过filter,从list过滤出和被点击项的id不同的id项,重新赋值给list(即从list删除点击项)
  2. 求和逻辑

      total() {return this.list.reduce((sum, item) => sum + item.score, 0)},
    
    • reduce累加器的运用
  3. 加入数组

    • 往数组前面加:unshift()方法
    • 往数组后面加:push()方法

1.4.watch

1.4.1.watch属性

作用:监视数据变化,执行 业务逻辑 或 异步操作

watch:{//  该方法会在数据变化时调用执行// newValue新值, oldValue老值(一般不用) words(newValue, oldValue) {console.log('变化了', newValue,, oldValue)}
}

以上代码监听了data里的数据words,如果我们要监听data里obj对象属性words,则应该写为 'obj.words'

 'obj.words'(newValue) {console.log('变化了', newValue)}

1.4.2.翻译业务实现

 watch: {'obj.words'(newValue) {  clearTimeout(this.timerId)this.timerId = setTimeout(async () => {const res = await axios({url: 'https://applet-base-api-t.itheima.net/api/translate',params: {words:newValue}})this.result = res.data.data}, 300)},}

知识点

  • 防抖处理

1.4.3.watch属性的完整写法

  • 额外配置项

    配置项效果
    deep:true深度监视,对象的子元素变化也会触发
    immediate:true初始化立即执行一次

上面的翻译业务实现还可以升级为,通过改变翻译语言也会触发watch监听

  • 对象obj有属性words和属性language
  • 对象进行深度监视,对象的任何一个属性(words和language)发生变化,都会触发重新翻译
watch: {obj: {deep: true,         // 深度监视immediate: true,    // 立即执行handler(newValue) {clearTimeout(this.timerId)this.timerId = setTimeout(async () => {const res = await axios({url: 'https://applet-base-api-t.itheima.net/api/translate',params: newValue})this.result = res.data.data}, 300)}},
}

1.4.4.【案例】水果购物车

  • 成品图
    在这里插入图片描述
  • js代码
const dedaultArr = [{id: 1,icon: 'img/火龙果.png',isChecked: true,num: 1,price: 6,},{id: 2,icon: 'img/荔枝.png',isChecked: false,num: 1,price: 20,},{id: 3,icon: 'img/榴莲.png',isChecked: false,num: 1,price: 40,},{id: 4,icon: 'img/鸭梨.png',isChecked: true,num: 1,price: 3,},{id: 5,icon: 'img/樱桃.png',isChecked: false,num: 1,price: 32,},
]
const app = new Vue({el: '#app',data: {// 水果列表bannerSrc: 'img/fruit.jpg',fruitList: JSON.parse(localStorage.getItem('list')) || dedaultArr},methods: {del(id) {return this.fruitList = this.fruitList.filter(item => item.id != id)}},computed: {// 计算选中个数totalCount() {return this.fruitList.reduce((sum, item) => {if (item.isChecked) {return sum + item.num} else {return sum}}, 0)},// 计算总价totalPrice() {return this.fruitList.reduce((sum, item) => {if (item.isChecked) {return sum + item.num * item.price} else {return sum}}, 0)},all: {get() {// return的值决定全选框是否勾选// 必须所有框都选中,全选按钮才选中(every)return this.fruitList.every(item => item.isChecked)},set(value) {// 全选按钮的value影响其他框this.fruitList.forEach(item => item.isChecked = value);}}},watch: {fruitList: {deep: true,handler(newValue) {localStorage.setItem('list', JSON.stringify(newValue))}}}
})
  • 部分html代码展示
<div class="tbody"><div class="tr active" v-for="(item,index) in fruitList"><div class="td"><input type="checkbox" v-model="item.isChecked" /></div><div class="td"><img :src="item.icon" alt="" /></div><div class="td">{{item.price}}</div><div class="td"><div class="my-input-number"><button class="decrease" @click="item.num--"> - </button><span class="my-input__inner">{{item.num}}</span><button class="increase" @click="item.num++"> + </button></div></div><div class="td">{{item.num*item.price}}</div><div class="td"><button @click="del(item.id)">删除</button></div></div>
</div><!-- 底部 -->
<div class="bottom"><!-- 全选 --><label class="check-all"><input type="checkbox" v-model="all" />全选</label><div class="right-box"><!-- 所有商品总价 --><span class="price-box">总价&nbsp;&nbsp;:&nbsp;&nbsp;¥&nbsp;<span class="price">{{totalPrice}}</span></span><!-- 结算按钮 --><button class="pay">结算( {{totalCount}} )</button></div>
</div>

知识点

  • 全选框逻辑
    在这里插入图片描述
    1. fruitList里添加属性isChecked来标记item项是否勾选
    2. 再通过v-model="item.isChecked”将isChecked和每个子checkbox绑定,即checkbox和勾选状态关联
    3. 如果子checkbox发生变化,调用get()
    4. 再通过every检查fruitList里的item.isChecked是否全为true,即检查是否全勾选
    5. 如果全勾选,返回true,通过v-model="all"反作用于全选的checkbox,使其勾选
    6. 如果全选的checkbox发生变化,调用set(),并通过形参value传入all的值
    7. 通过forEach,将所有子checkbox的isChecked设置为和all一样的值

1.5.生命周期

在不同的生命周期,会自动运行一些函数,被称为生命周期钩子,让开发者可以在特定阶段运行代码

  • 生命周期四个阶段

    1.创建阶段:创建响应式数据

    2.挂载阶段:渲染模板

    3.更新阶段:修改数据,更新视图

    4.销毁阶段:销毁Vue实例

    在这里插入图片描述

  • 生命周期钩子
    在这里插入图片描述

1.5.1.【应用】初始化渲染

created生命周期,发送获取数据的请求

const app = new Vue({el: '#app',data: {list: []},async created() {// 1. 发送请求获取数据const res = await axios.get('http://hmajax.itheima.net/api/news')// 2.将获取的数据写入数据列表this.list = res.data.data}
})
</script>

1.5.2.【应用】获取焦点

mounted生命周期,获取焦点(操作dom)

const app = new Vue({el: '#app',data: {words: ''},mounted() {document.querySelector('#inp').focus()}
})

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

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

相关文章

Element Plus 图标使用方式整理

Element Plus 图标使用方式整理 以下是 Element Plus 图标的所有使用方式&#xff0c;包含完整代码示例和总结表格&#xff1a; 1. 按需引入图标组件 适用场景&#xff1a;仅需少量图标时&#xff0c;按需导入减少打包体积 示例代码&#xff1a; <template><div>…

使用Scrapy官方开发的爬虫部署、运行、管理工具:Scrapyd

一般情况下&#xff0c;爬虫会使用云服务器来运行&#xff0c;这样可以保证爬虫24h不间断运行。但是如何把爬虫放到云服务器上面去呢&#xff1f;有人说用FTP&#xff0c;有人说用Git&#xff0c;有人说用Docker。但是它们都有很多问题。 FTP&#xff1a;使用FTP来上传…

41、web前端开发之Vue3保姆教程(五 实战案例)

一、项目简介和需求概述 1、项目目标 1.能够基于Vue3创建项目 2.能够基本Vue3相关的技术栈进行项目开发 3.能够使用Vue的第三方组件进行项目开发 4.能够理解前后端分离的开发模式 2、项目概述 使用Vue3结合ElementPlus,ECharts工具实现后台管理系统页面,包含登录功能,…

OpenCV--图像平滑处理

在数字图像处理领域&#xff0c;图像平滑处理是一项极为重要的技术&#xff0c;广泛应用于计算机视觉、医学影像分析、安防监控等多个领域。在 OpenCV 这一强大的计算机视觉库的助力下&#xff0c;我们能便捷地实现多种图像平滑算法。本文将深入探讨图像平滑的原理&#xff0c;…

性能优化利器:前后端防抖方案解析

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 在Web开发中&#xff0c;高频触发的事件&#xff08;如用户输入、按钮点击、滚动监听等&#xff09;可能导致性能问题或资源浪费。防抖&#xff08;Debounce&…

【ES系列】Elasticsearch简介:为什么需要它?(基础篇)

🔥 本文将详细介绍Elasticsearch的前世今生,以及为什么它在当今的技术栈中如此重要。本文是ES起飞之路系列的基础篇第一章,适合想要了解ES的读者。 文章目录 一、什么是Elasticsearch?1. ES的定义2. ES的核心特性2.1 分布式存储2.2 实时搜索2.3 高可用性2.4 RESTful API3.…

用 HTML 网页来管理 Markdown 标题序号

文章目录 工具介绍核心优势使用指南基本使用方法注意事项 部分截图完整代码 工具介绍 在日常的文档编写和博客创作中&#xff0c;Markdown因其简洁的语法和良好的可读性而广受欢迎。然而&#xff0c;当文档结构复杂、标题层级较多时&#xff0c;手动维护标题序号不仅耗时耗力&…

批量将 Markdown 转换为 Word/PDF 等其它格式

在工作当中&#xff0c;我们经常会接触到 Markdown 格式的文档。这是一种非常方便我们做记录&#xff0c;做笔记的一种格式文档。现在很多互联网编辑器都是支持 Markdown 格式的&#xff0c;编辑起文章来更加的方便简介。有时候&#xff0c;我们会碰到需要将 Markdown 格式的文…

剑指Offer(数据结构与算法面试题精讲)C++版——day8

剑指Offer&#xff08;数据结构与算法面试题精讲&#xff09;C版——day8 题目一&#xff1a;链表中环的入口节点题目二&#xff1a;两个链表的第1个重合节点题目三&#xff1a;反转链表附录&#xff1a;源码gitee仓库 题目一&#xff1a;链表中环的入口节点 这道题的有如下三个…

【BFT帝国】20250409更新PBFT总结

2411 2411 2411 Zhang G R, Pan F, Mao Y H, et al. Reaching Consensus in the Byzantine Empire: A Comprehensive Review of BFT Consensus Algorithms[J]. ACM COMPUTING SURVEYS, 2024,56(5).出版时间: MAY 2024 索引时间&#xff08;可被引用&#xff09;: 240412 被引:…

前端用用jsonp的方式解决跨域问题

前端用用jsonp的方式解决跨域问题 前端用用jsonp的方式解决跨域问题 前端用用jsonp的方式解决跨域问题限制与缺点&#xff1a;前端后端测试使用示例 限制与缺点&#xff1a; 不安全、只能使用get方式、后台需要相应jsonp方式的传参 前端 function jsonp(obj) {// 动态生成唯…

MySQL详解最新的官方备份方式Clone Plugin

一、Clone Plugin的动态安装 install plugin clone soname mysql_clone.so;select plugin_name,plugin_status from information_schema.plugins where plugin_name clone; 二、Clone Plugin配置持久化 在 MySQL 配置文件my.cnf中添加以下内容&#xff0c;确保插件在 MySQL …

解决python manage.py shell ModuleNotFoundError: No module named xxx

报错如下&#xff1a; python manage.py shellTraceback (most recent call last):File "/Users/z/Documents/project/c/manage.py", line 10, in <module>execute_from_command_line(sys.argv)File "/Users/z/.virtualenvs/c/lib/python3.12/site-packa…

鸿蒙NEXT开发资源工具类(ArkTs)

import { AppUtil } from ./AppUtil; import { StrUtil } from ./StrUtil; import { resourceManager } from kit.LocalizationKit;/*** 资源工具类。* 提供访问应用资源的能力&#xff0c;包括布尔值、数字、字符串等资源的获取。** author 鸿蒙布道师* since 2025/04/08*/ ex…

css使用mix-blend-mode的值difference实现内容和父节点反色

1. 使用场景 往往开发过程中&#xff0c;经常遇到产品说你这个背景图和文字颜色太接近了&#xff0c;能不能适配下背景图&#xff0c;让用户能够看清具体内容是啥。 这么说吧&#xff0c;这种需求场景非常合理&#xff0c;因为你做开发就是要给用户一个交代&#xff0c;给他们…

el-input 中 select 方法使用报错:属性“select”在类型“HTMLElement”上不存在

要解决该错误&#xff0c;需明确指定元素类型为 HTMLInputElement&#xff0c;因为 select() 方法属于输入元素。 步骤解释&#xff1a; 类型断言&#xff1a;使用 as HTMLInputElement 将元素类型断言为输入元素。 可选链操作符&#xff1a;保持 ?. 避免元素为 null 时出错…

Mybatis Plus与SpringBoot的集成

Mybatis Plus与SpringBoot的集成 1.引入Maven 依赖2.配置application.yml文件3.创建实体类4.分页插件5.逻辑删除功能6.忽略特定字段7.自动填充 1.引入Maven 依赖 提前创建好一个SpringBoot项目&#xff0c;然后在项目中引入MyBatis Plus依赖 <dependency><groupId&g…

大数据学习(104)-clickhouse与hdfs

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…

【简历全景认知2】电子化时代对简历形式的降维打击:从A4纸到ATS的生存游戏

一、当简历遇上数字洪流:传统形式的式微 在1990年代,一份排版精美的纸质简历还能让HR眼前一亮;但今天,超过75%的 Fortune 500 企业使用ATS(Applicant Tracking System)进行初筛,未优化的简历可能在5秒内就会沦为数字废土。这种变迁本质上符合「技术接纳生命周期」理论—…

esp32cam -> 服务器 | 手机 -> 服务器 直接服务器传输图片

服务器先下载python &#xff1a; 一、Python环境搭建&#xff08;CentOS/Ubuntu通用&#xff09; 一条一条执行 安装基础依赖 # CentOS sudo yum install gcc openssl-devel bzip2-devel libffi-devel zlib-devel # Ubuntu sudo apt update && sudo apt install b…