当前位置: 首页 > news >正文

vue复习1~45

1.关于vue

要理解记忆规则,可以到官网上去找
vue的两种使用方式

  1. vue核心包开发
    场景:局部模块改造
  2. vue核心包 & vue插件 工程化开发
    场景:整站开发
2.创建vue实例

构建用户页面->创建vue实例初始化渲染
学习阶段用开发版本

3.插值表达式
  1. 使用的数据必须存在(data)
  2. 里面不能写语句
  3. 不能在 标签属性 里面使用{{ }}插值
4.vue响应式

数据变化,视图自动更新

data中的数据,是会被添加到实例上

  1. 访问数据 实例.属性名
  2. 修改数据 实例.属性名 = 新值

修改数据-> vue监听到数据修改-> 自动更新视图DOM操作

5.vue指令v–html

动态的设置innerhtml
动态的解析标签
代码:

<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>
6.v-show和v-if

均控制元素显示隐藏

区别:
v-show底层原理:切换 css 的 display: none 来控制显示隐藏
v-show=“false”
场景:频繁切换显示隐藏的场景

v-if 底层原理:根据 判断条件 控制元素的 创建 和 移除(条件渲染)
v-if=“false”
场景:不频繁切换显示隐藏的场景,eg:登录

7.v-else和v-else-if

两者均辅助v-if进行判断渲染,紧挨着v-if使用
v-else,特别的,不能单独使用
使用情况

  1. v-else,只有两种,eg:性别
  2. v-else-if,两个以上,eg:等级
<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>
8.v-on

注册事件=添加监听+提供处理逻辑
语法1:
简写

<button @click="count--">-</button>

详写

<button v-on:click="count++">+</button>

语法2:
v-on:事件名=”methods中的函数名“
必须先加this指向vue实例(app)才能拿到data里面的数据

<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都指向当前实例this.isShow = !this.isShow}}})</script>
</body>
9.v-on调用传参

要用this
传两个,三个参数也是可以的

<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>
10.v-bind

动态的设置html的标签属性

<img v-bind:src="imgUrl" v-bind:title="msg" alt="">

简化版

<img :src="imgUrl" :title="msg" alt="">
11.波仔的学习之旅

代码:

<body><div id="app"><button v-show="index > 0" @click="index--">上一页</button><img :src="list[index]" alt=""><button v-show="index < list.length - 1" @click="index++">上一页</button></div><script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>const app = new Vue({el: '#app',data: {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>
12.v-for

基于数据循环,多次渲染整个元素,有对象,数组,数字
item是遍历时的每一项
index是数组的下标

v-for="(item, index) in list"
例:
<li v-for="(item, index) in list">{{ item }} - {{ index }}</li>不用index时<li v-for="item in list">{{ item }}</li>

v-for 里面的key

给列表添加唯一的标识,便于vue进行列表项的正确排序复用
注意:

  1. key的值只能是字符串或者是数字类型
  2. key的值必须唯一
  3. 推荐使用id作为key,不推荐使用index(会变化,不对应)
13.小黑的书架

** filter: 根据条件,保留满足条件的对应项,得到一个新数组。**
this.bookList = this.bookList.filter(item => item.id !=id)

<body><div id="app"><h3>小黑的书架</h3><ul><li v-for="(item,index) in booksList"><span>{{ item.name }}</span><span>{{ item.author }}</span><button @click="del(item.id)">删除</button></li></ul></div><script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>const app = new Vue({el: '#app',data: {booksList: [{ id: 1, name: '《红楼梦》', author: '曹雪芹' },{ id: 2, name: '《西游记》', author: '吴承恩' },{ id: 3, name: '《水浒传》', author: '施耐庵' },{ id: 4, name: '《三国演义》', author: '罗贯中' }]},methods: {del(id) {this.booksList = this.booksList.filter(item => item.id !=id)}}})</script>
</body>
14.v-model

给表单元素使用

v-model 可以让数据和视图,形成双向数据绑定
(1) 数据变化,视图自动更新
(2) 视图变化,数据自动更新
可以快速[获取]或[设置]表单元素的内容

v-model的绑定内容写在data里面

<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><script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></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>
</body>
15.小黑记事本
<body><!-- 主体区域 -->
<section id="app"><!-- 输入框 --><header class="header"><h1>小黑记事本</h1><input v-model="todoName" placeholder="请输入任务" class="new-todo" /><button class="add" @click="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><button @click="del(item.id)" class="destroy"></button></div></li></ul></section><!-- 统计和清空 -> 如果没有任务底部需清空--><footer class="footer" v-show="list.length > 0"><!-- 统计 --><span class="todo-count">合 计:<strong> {{ list.length }} </strong></span><!-- 清空 --><button @click="clear()" class="clear-completed">清空任务</button></footer>
</section><!-- 底部 -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>// 添加功能//用v-model//点击按钮,进行新增,往数组最前面加 unshiftconst app = new Vue({el: '#app',data: {todoName: '',list: [{ id: 1, name: '跑步一公里' },{ id: 3, name: '游泳100米' },]},methods: {del (id) {// console.log(id) => filter 保留所有不等于该 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>
16.指令修饰符

通过"."指明一些指令 后缀,不同后缀封装不同的处理操作 -> 简化代码

  1. 按键修饰符
@keyup.enter="fn" 键盘回车监听
  1. v-model修饰符
v-model.trim="username" 去除首尾空格
v-model.number="age" 转数字
  1. 事件修饰符
@click.stop="sonFn" 阻止冒泡
@click.prevent 阻止默认行为
17.v-bind对于样式控制的增强

语法:
:class=“对象/数组”

  1. 对象:键就是类名,值是布尔值,true则有类,反之
<div class="box" :class="{ pink: true, big: true }">黑马程序员</div>

使用场景:一个类名,来回切换
2. 数组:数组中所有的类,都会添加到盒子上,本质就是class列表

<div class="box" :class="['pink', 'big']">黑马程序员</div>

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

操作style
语法:

值必须用引号引起来!
行内样式强大的是对单个属性的控制

<div class="box" :style="{ width: '400px', height: '400px', backgroundColor: 'green' }"></div>

案例:

<body><div id="app"><!-- 外层盒子底色 (黑色) --><div class="progress"><!-- 内层盒子 - 进度(蓝色) --><div class="inner" :style="{ width: percent + '%' }"><span>{{ percent }}%</span></div></div><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@2/dist/vue.js"></script><script>const app = new Vue({el: '#app',data: {percent: 30}})</script>
</body>
18.京东秒杀tab导航高亮
<body><div id="app"><ul><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@2/dist/vue.js"></script><script>const app = new Vue({el: '#app',data: {activeIndex: 2, // 记录高亮list: [{ id: 1, name: '京东秒杀' },{ id: 2, name: '每日特价' },{ id: 3, name: '品类秒杀' }]}})</script>
</body>
19.v-model应用于其他表单元素

常见的表单元素

  1. 输入框 input:text ->value
  2. 文本域textarea ->value
  3. 复选框 input:checkbox ->checked
  4. 单选框 input:radio ->checked
  5. 下拉菜单 select ->value

name: 给单选框加上 name 属性 可以分组 → 同一组互相会互斥
value: 给单选框加上 value 属性,用于提交给后台的数据
结合 Vue 使用 → v-model

性别: <input v-model="gender" type="radio" name="gender" value="1">男<input v-model="gender" type="radio" name="gender" value="2">女<br><br>

option 需要设置 value 值,提交给后台
select 的 value 值,关联了选中的 option 的 value 值
结合 Vue 使用 → v-model

所在城市:<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@2/dist/vue.js"></script><script>const app = new Vue({el: '#app',data: {username: ' ',isSingle: false,gender: "2",cityId: '102',desc: " "}})</script>
20.计算属性

放在与data并列的computed里

基于现有的数据,编写求值逻辑
在computed配置项里,一个计算属性对应一个函数
使用:{{ 计算属性名 }}
一定要return

computed: {//计算属性名 () {// 基于现有的数据,编写求值逻辑return 结果
}

求和用reduce
需求:
对 this.list 数组里面的 num 进行求和 → reduce
//0 是求和的起始值
let total = this.list.reduce((sum, item) => sum + item.num,0)
return total

21.computed计算属性 VS methods 方法

computed计算属性
封装数据处理,求结果
特别的:有缓存的,一旦计算出来结果,就会立刻缓存,下一次读取 → 直接读缓存就行 → 性能特别高
作为属性直接使用,this.计算属性{{ 计算属性 }}

methods 方法
给实例提供方法,调用以处理业务逻辑
作为方法,需要调用,this.方法名() {{ 方法名() }} @事件名=“方法名”

22.计算属性完整写法
computed: {// 完整写法 → 获取 + 设置fullName: {get () {一段代码逻辑(计算逻辑)return 结果},set (修改的值) {一段代码逻辑(修改逻辑)}}}

改名卡案例

<body><div id="app">姓:<input type="text" v-model="firstName"> +名:<input type="text" v-model="lastName"> =<span>{{ fullName }}</span><br><br><button @click="changeName">改名卡</button></div><script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>const app = new Vue({el: '#app',data: {firstName: '刘',lastName: '备',},methods: {changeName () {this.fullName = '黄忠'}},computed: {// 简写 → 获取,没有配置设置的逻辑// fullName () {//   return this.firstName + this.lastName// }// 完整写法 → 获取 + 设置fullName: {// (1) 当fullName计算属性,被获取求值时,执行get(有缓存,优先读缓存)//     会将返回值作为,求值的结果get () {return this.firstName + this.lastName},// (2) 当fullName计算属性,被修改赋值时,执行set//     修改的值,传递给set方法的形参set (value) {// console.log(value.slice(0, 1))          // console.log(value.slice(1))         this.firstName = value.slice(0, 1)this.lastName = value.slice(1)}}}})</script>
</body>
23.成绩案例
 <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>{{ index + 1 }}</td><td>{{item.subject}}</td><td :class="{red: item.score < 60 }">{{item.score}}</td><td><a @click.prevent="del(item.id)" href="#">删除</a></td></tr></tbody><tbody v-else><tr><td colspan="5"><span class="none">暂无数据</span></td></tr></tbody><tfoot><tr><td colspan="5"><span>总分:{{ totalCount }}</span><span style="margin-left: 50px">平均分:{{ averageCount }}</span></td></tr></tfoot></table></div><div class="form"><div class="form-item"><div class="label">科目:</div><div class="input"><inputtype="text"placeholder="请输入科目"v-model.trim="subject"/></div></div><div class="form-item"><div class="label">分数:</div><div class="input"><inputtype="text"placeholder="请输入分数"v-model.number="score"/></div></div><div class="form-item"><div class="label"></div><div class="input"><button @click="add" class="submit" >添加</button></div></div></div></div><script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>const app = new Vue({el: '#app',data: {list: [{ id: 1, subject: '语文', score: 20 },{ id: 7, subject: '数学', score: 99 },{ id: 12, subject: '英语', score: 70 },],subject: '',score: ''},computed:{totalCount() {return this.list.reduce((sum,item) => sum + item.score,0)},averageCount () {if (this.list.length === 0) {return 0}//toFixed(2)保留两位小数return (this.totalCount / this.list.length).toFixed(2)}},methods: {del(id) {this.list = this.list.filter(item => item.id != id)},add() {if (!this.subject) {alert('请输入科目名称')return}if(typeof this.score !== 'number') {alert('请输入正确的成绩')return}//在开头插入元素 unshiftthis.list.unshift({id: +new Date(),subject: this.subject,score: this.score})this.subject = ''this.score = ''}}})</script></body>
24.watch侦听器(监视器)

可持久化到本地
监视数据变化,执行业务逻辑或异步操作

  1. 简单写法:简单类型数据,直接监视
  2. 完整写法:添加额外配置项
    简单写法
    ** ‘obj.words’ ,对象里面的子属性,方法名一定要加引号**
    若是直接属性名,则不用加引号
const app = new Vue({el: '#app',data: {// words: ''obj: {words: ''}},// 具体讲解:(1) watch语法 (2) 具体业务实现watch: {// 该方法会在数据变化时调用执行// newValue新值, oldValue老值(一般不用)// words (newValue) {//   console.log('变化了', newValue)// }'obj.words' (newValue) {console.log('变化了', newValue)}}})

加上防抖效果,防止多次触发

'obj.words' (newValue) {// console.log('变化了', newValue)// 防抖: 延迟执行 → 干啥事先等一等,延迟一会,一段时间内没有再次触发,才执行clearTimeout(this.timer)this.timer = setTimeout(async () => {const res = await axios({url: 'https://applet-base-api-t.itheima.net/api/translate',params: {words: newValue}})this.result = res.data.dataconsole.log(res.data.data)}, 300)}

完整写法

deep: true, // 深度监视
immediate: true, // 立刻执行,一进入页面handler就立刻执行一次
handler (newValue) {clearTimeout(this.timer)this.timer = setTimeout(async () => {const res = await axios({url: 'https://applet-base-api-t.itheima.net/api/translate',params: newValue})this.result = res.data.dataconsole.log(res.data.data)}, 300)}
25.水果购物车

!!!!!!!!!!!!!!!!!!!!!!!!!!

计算属性的完整写法 isAll: { get() {}, set() {} } 全名用冒号
watch监听器 里的监听的对象要用冒号 watch : { list: {} }
computed计算属性 、methods 方法、watch监听一律用冒号

<body><div class="app-container" id="app"><!-- 顶部banner --><div class="banner-box"><img src="http://autumnfish.cn/static/fruit.jpg" alt="" /></div><!-- 面包屑 --><div class="breadcrumb"><span>🏠</span>/<span>购物车</span></div><!-- 购物车主体 --><div class="main" v-if="fruitList.length > 0"><div class="table"><!-- 头部 --><div class="thead"><div class="tr"><div class="th">选中</div><div class="th th-pic">图片</div><div class="th">单价</div><div class="th num-th">个数</div><div class="th">小计</div><div class="th">操作</div></div></div><!-- 身体 --><div class="tbody"><div class="tr" v-for="(item,index) in fruitList" :key="item.id" :class="{active: item.isChecked}"><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" :disabled="item.num <= 1" @click="sub(item.id)"> - </button><span class="my-input__inner">{{ item.num }}</span><button class="increase" @click="add(item.id)"> + </button></div></div><div class="td">{{ item.price*item.num }}</div><div class="td"><button @click="del(item.id)">删除</button></div></div></div></div><!-- 底部 --><div class="bottom"><!-- 全选 --><label class="check-all"><input type="checkbox" v-model="isAll"/>全选</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></div><!-- 空车 --><div class="empty" v-else>🛒空空如也</div></div><script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>const defaultArr = [{id: 1,icon: 'http://autumnfish.cn/static/火龙果.png',isChecked: true,num: 2,price: 6,},{id: 2,icon: 'http://autumnfish.cn/static/荔枝.png',isChecked: false,num: 7,price: 20,},{id: 3,icon: 'http://autumnfish.cn/static/榴莲.png',isChecked: false,num: 3,price: 40,},{id: 4,icon: 'http://autumnfish.cn/static/鸭梨.png',isChecked: true,num: 10,price: 3,},{id: 5,icon: 'http://autumnfish.cn/static/樱桃.png',isChecked: false,num: 20,price: 34,},]const app = new Vue({el: '#app',data: {// 水果列表fruitList: JSON.parse(localStorage.setItem('list') || defaultArr),},computed: {//完整写法= get + setisAll : {get() {//必须所有的小选框都选中,全选按钮才选中 => everyreturn this.fruitList.every(item => item.isChecked)},set(value) {//拿到的value值是true或false//同步状态是赋值,=this.fruitList.forEach(item => item.isChecked = true)}},//统计选中的总数 reducetotalCount(){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)}},methods: {del(id) {this.fruitList = this.fruitList.filter(item => item.id !==id)},add(id) {//findconst fruit = this.fruitList.find(item => item.id === id)fruit.num++},sub(id) {const fruit = this.fruitList.find(item => item.id === id)fruit.num--}},//持久化到本地就是要用到监听watch : {fruitList: {deep: true,handler(newValue) {//将变化的newValue存入本地(转JSON)localStorage.setItem('list',JSON.stringify(newValue))}}}})</script></body>
26.vue生命周期和生命周期的四个钩子

vue生命周期 :一个vue实例从创建到销毁的整个过程
创建 响应式数据
挂载 渲染模板
更新 数据修改,更新视图
销毁 销毁实例

before Create
created 发送初始化渲染请求 常用
before Mount
mounted 操作DOM 常用
before Update
updated
before Destroy 释放vue以外的资源(清楚定时器,延时器…)常用
destroyed

27.created应用,mounted应用

created钩子与data并列
created:响应式数据准备好了,可以发送初始化渲染请求

  1. created应用
async created () {// 1. 发送请求获取数据const res = await axios.get('http://hmajax.itheima.net/api/news')// 2. 更新到 list 中,用于页面渲染 v-forthis.list = res.data.data}
  1. mounted应用
 // 核心思路:// 1. 等input框渲染出来 mounted 钩子// 2. 让input框获取焦点 inp.focus()mounted () {document.querySelector('#inp').focus()}})
28.小黑记账清单

功能需求:
1. 基本渲染
(1) 立刻发送请求获取数据 created
(2) 拿到数据,存到data的响应式数据中
(3) 结合数据,进行渲染 v-for
(4) 消费统计 => 计算属性
2. 添加功能
(1) 收集表单数据 v-model
(2) 给添加按钮注册点击事件,发送添加请求
(3) 需要重新渲染
3. 删除功能
(1) 注册点击事件,传参传 id
(2) 根据 id 发送删除请求
(3) 需要重新渲染
4. 饼图渲染
(1) 初始化一个饼图 echarts.init(dom) mounted钩子实现
(2) 根据数据实时更新饼图 echarts.setOption({ … })

<body><div id="app"><div class="contain"><!-- 左侧列表 --><div class="list-box"><!-- 添加资产 --><form class="my-form"><input v-model.trim="name" type="text" class="form-control" placeholder="消费名称" /><input v-model.number="price" type="text" class="form-control" placeholder="消费价格" /><button @click="add" type="button" class="btn btn-primary">添加账单</button></form><table class="table table-hover"><thead><tr><th>编号</th><th>消费名称</th><th>消费价格</th><th>操作</th></tr></thead><tbody><tr v-for="(item,index) in list" :key="item.id"><td>{{  index + 1}}</td><td>{{ item.name }}</td><td :class="{red: item.price > 500}">{{ item.price.toFixed(2) }}</td><td><a @click="del(item.id)" href="javascript:;">删除</a></td></tr></tbody><tfoot><tr><td colspan="4">消费总计:{{ totalPrice.toFixed(2) }}</td></tr></tfoot></table></div><!-- 右侧图表 --><div class="echarts-box" id="main"></div></div></div><script src="https://cdn.jsdelivr.net/npm/echarts@5.4.0/dist/echarts.min.js"></script><script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script><script>/*** 接口文档地址:* https://www.apifox.cn/apidoc/shared-24459455-ebb1-4fdc-8df8-0aff8dc317a8/api-53371058* * 功能需求:* 1. 基本渲染* 2. 添加功能* 3. 删除功能* 4. 饼图渲染*/const app = new Vue({el: '#app',data: {list: [],name: '',price: '',},computed: {totalPrice() {return this.list.reduce((sum,item) => sum + item.price,0)}},created () {//只有get和delate时,要用params//重新渲染,多次使用,得封装// const res = await axios.get('https://applet-base-api-t.itheima.net/bill',{//   params: {//     creator: '小智'//   }// })// this.list = res.data.datathis.getList()},mounted () {this.myChart =  echarts.init(document.querySelector('#main'))this.myChart.setOption({title: {text: '消费账单列表',subtext: 'Fake Data',left: 'center'},tooltip: {trigger: 'item'},legend: {orient: 'vertical',left: 'left'},//数据项series: [{name: '消费账单',type: 'pie',radius: '50%',data: [],emphasis: {itemStyle: {shadowBlur: 10,shadowOffsetX: 0,shadowColor: 'rgba(0, 0, 0, 0.5)'}}}]})},methods: {async getList () {const res = await axios.get('https://applet-base-api-t.itheima.net/bill',{params: {creator: '小智'}})this.list = res.data.data//更新图表this.myChart.setOption({//数据项series: [{data: this.list.map(item => ({value: item.price, name: item.name}))}]})},async add() {//如果name不存在if(!this.name) {alert('请输入消费名称')return }if(typeof this.price !== 'number') {alert('请输入正确的价格')return}//发送添加请求const res = await axios.post('https://applet-base-api-t.itheima.net/bill',{creator: '小智',name: this.name,price: this.price})//重新渲染this.getList(),this.name = '',this.price = ''},async del(id) {// this.list = this.list.filter(item => item.id !== id)//根据id发送删除请求const res = await axios.delete(`https://applet-base-api-t.itheima.net/bill${id}`)this.getList() }}})</script></body>
29.组件化开发&根组件

我们把app.vue叫做根组件
**组件化:**一个页面拆分成一个个组件,每个组件有自己独立的结构,样式,行为
好处:便于维护,利于复用,提升开发效率
组件分类:普通组件,根组件
根组件:整个应用最上层的组件,包裹所有普通小组件

app.vue的三个组成部分:结构,样式,行为(template,script,style)

export default {//里面可以提供data(特殊),methods,computed,watch,生命周期钩子
}
30.普通组件的注册使用-局部注册

局部注册:只能在注册的组件内使用
全局注册:在所有组件都能使用
使用:当成html标签使用,大驼峰命名法

`<组件名></组件名>`

在app.vue里面进行
导入,import
注册: components:{
//同名可省略
‘组件名’:组件对象
}
使用: 在template里<组件名></组件名>

export default  {components:{'组件名':组件对象}
}
31.普通组件的注册使用-全局注册

全局注册:在所有组件都能使用
在main.js 中进行全局注册

  1. 导入:在上面导入需要的组件 import
  2. 全局注册:Vue.component(‘HmButton(组件名)’,HmButton(组件对象)),这样在component里面的任何组件中都可以使用

相关文章:

vue复习1~45

1.关于vue 要理解记忆规则&#xff0c;可以到官网上去找 vue的两种使用方式 vue核心包开发 场景&#xff1a;局部模块改造vue核心包 & vue插件 工程化开发 场景&#xff1a;整站开发 2.创建vue实例 构建用户页面->创建vue实例初始化渲染 学习阶段用开发版本 3.插值…...

Servlet开发与生命周期详解-2

一、在集成开发环境当中开发Servlet程序 1.集成开发工具很多&#xff0c;其中目前使用比较多的是&#xff1a; IntelliJ IDEA&#xff08;这个居多&#xff0c;IDEA在提示功能方面要强于Eclipse&#xff0c;也就是说IDEA使用起来比Eclipse更加智能&#xff0c;更好用。JetBrai…...

vue2项目eslint提示<template v-for> key should be placed on the <template> tag

在template标签上使用v-for时&#xff0c;vue2会提示key不可放在template标签上&#xff0c;必须放在子元素上。vue3会提示key必须放在template标签上。这时候可能我们怎么写都会触发eslint校验提醒。不影响使用&#xff0c;但看着难受。 我们可以在根目录上新建jsconfig.json…...

老是忘记package.json,备忘一下 webpack 环境下 Vue Cli 和 Vite 命令行工具对比

Vue 2.X webpack 环境下 Vue Cli 的命令 "scripts": {"dev": "vue-cli-service serve","prod": "vue-cli-service serve --mode production","build:dev": "vue-cli-service build --mode development"…...

关于跨域问题(本地前端访问服务器端接口跨域出错)

问题来源&#xff1a; 当服务器封装了接口但是本地电脑端前端访问出现跨域问题。 解决方案&#xff1b; 1、使用ipconfig 查看本地电脑的ip地址 ipconfig 2、在后端接口处配置如下代码 allow_origins["http://本地ip地址:3001", # 局域网内其他设备访问的本地…...

Jackson相关问题

1、json转dto的时候&#xff0c;dto不能定义isActive这种带有is的前缀&#xff0c;如果使用Lombok的Getter/Setter的话&#xff0c;json {"isActive": true}&#xff0c;这样&#xff0c;将无法正确赋值。此时的dto再次转为json之后&#xff0c;得到的是active:false…...

【C++】互斥锁(Mutex)和原子操作(Atomics)

详细探讨 C 中的并发、多线程、互斥锁&#xff08;Mutex&#xff09;和原子操作&#xff08;Atomics&#xff09;的概念及其区别&#xff0c;并附带代码示例。 1. C 并发与多线程 (Concurrency vs. Multithreading) 并发 (Concurrency)&#xff1a;指系统能够处理多个任务的能…...

Linux--命令行操作

一、Linux的作用 1.简单的文件操作 2.编程 3.支持系统和网络 二、多账号管理 1、我们需要在root账号下进行&#xff0c;可以用whoami来查询账号身份 2、adduser 你要创建的账号名 就可以创建一个账号 3、ls /home可以查看账号是否创立 4、使用passwd 创建账号名字的来设…...

具身系列——Diffusion Policy算法实现CartPole游戏

代码原理分析 1. 核心思想 该代码实现了一个基于扩散模型&#xff08;Diffusion Model&#xff09;的强化学习策略网络。扩散模型通过逐步去噪过程生成动作&#xff0c;核心思想是&#xff1a; • 前向过程&#xff1a;通过T步逐渐将专家动作添加高斯噪声&#xff0c;最终变成…...

4.用 Excel 录入数据

一 用 Excel 录入数据的两种方式 用鼠标键盘录入数据和从网上爬取数据。 二 用鼠标键盘录入数据 1.录入数据的规范 横着录入数据&#xff08;横着一条条录入数据&#xff09;。 2.使用快捷键进行数据录入 tab 键和 enter 键。 tab 键&#xff1a;向右移动一个单元格。 tab 键…...

nginx配置跳转设置Host有误导致报404问题

我们有个项目&#xff0c;前端调用了第三方接口。为了避免跨域&#xff0c;所以使用nginx进行转发。一直正常工作&#xff0c;相安无事。近日第三方调整了安全策略&#xff0c;http转换成https&#xff0c;原本使用ip&#xff0c;现在也改成使用域名&#xff0c;所以nginx这里我…...

接口/UI自动化面试题

一、UI自动化 1.1、接口和UI自动化有多少用例&#xff1f; 回答策略&#xff1a;根据接口设定用例&#xff0c;100个接口&#xff0c;自动化case在1500-2000左右。结合自身的项目&#xff0c;回答覆盖的主功能流程。 示例&#xff1a; 接口自动化的测试case一般需要根据接口数…...

Java 中调用语言模型(如 OpenAI、阿里云通义千问、Hugging Face 等)API 的详细步骤和示例代码,涵盖常见场景及注意事项

以下是 Java 中调用语言模型&#xff08;如 OpenAI、阿里云通义千问、Hugging Face 等&#xff09;API 的详细步骤和示例代码&#xff0c;涵盖常见场景及注意事项&#xff1a; 1. 常见语言模型 API 选择 (1) OpenAI API 特点&#xff1a;支持 GPT-3、GPT-3.5、GPT-4 等模型&a…...

搜广推校招面经六十

soul推荐算法 一、word2vec原理 参考一篇文章入门Word2Vec 二、word2vec正负采样怎么做的、word2vec采用的loss和原理 见【搜广推校招面经四、搜广推校招面经五十二、搜广推校招面经五十七】 不太理解为啥问这么多word2vec&#xff0c;索性直接整理一遍。 三、多路召回融合…...

红宝书第十二讲:详解JavaScript中的工厂模式与原型模式等各种设计模式

红宝书第十二讲&#xff1a;详解JavaScript中的工厂模式与原型模式等各种设计模式 资料取自《JavaScript高级程序设计&#xff08;第5版&#xff09;》。 查看总目录&#xff1a;红宝书学习大纲 工厂模式和原型模式解析 一、工厂模式&#xff1a;像订外卖一样创建对象 工厂模…...

Flutter完整开发实战详解(一、Dart语言和Flutter基础)

前言 在如今的 Flutter 大潮下&#xff0c;本系列是让你看完会安心的文章。本系列将完整讲述&#xff1a;如何快速从0开发一个完整的 Flutter APP&#xff0c;配套高完成度 Flutter 开源项目 GSYGithubAppFlutter。同时也会提供一些 Flutter 的开发细节技巧&#xff0c;并针对…...

Kafka 偏移量

在 Apache Kafka 中&#xff0c;偏移量&#xff08;Offset&#xff09;是一个非常重要的概念。它不仅用于标识消息的位置&#xff0c;还在多种场景中发挥关键作用。本文将详细介绍 Kafka 偏移量的核心概念及其使用场景。 一、偏移量的核心概念 1. 定义 偏移量是一个非负整数…...

手撕LRU缓存Java版(带输入输出)

由于面试手撕lru没撕出来&#xff0c;导致心态炸裂&#xff0c;今天特地练习了lru输入输出 手撕版&#xff0c;在每个函数里手动加上输出 public class LC146 {static class LRUCache{class Node{int key, value;Node prev, next;Node(int key, int value){this.key key;thi…...

Android 12系统源码_系统启动(二)Zygote进程

前言 Zygote&#xff08;意为“受精卵”&#xff09;是 Android 系统中的一个核心进程&#xff0c;负责 孵化&#xff08;fork&#xff09;应用进程&#xff0c;以优化应用启动速度和内存占用。它是 Android 系统启动后第一个由 init 进程启动的 Java 进程&#xff0c;后续所有…...

python之并发编程

并发编程介绍 串行、并行与并发的区别 进程、线程、协程的区别 1. 进程 (Process) 定义&#xff1a;进程是操作系统为运行中的程序分配的基本单位。每个进程都有独立的地址空间和资源&#xff08;如内存、文件句柄等&#xff09;。特点&#xff1a; 进程是资源分配的基本单位…...

极速全场景 MPP数据库starrocks介绍

目录 一、引子 二、起源 &#xff08;一&#xff09;前身 &#xff08;二&#xff09;定位 三、特点 &#xff08;一&#xff09;高性能架构 &#xff08;二&#xff09;实时分析 &#xff08;三&#xff09;高并发与扩展性 &#xff08;四&#xff09;兼容性与生态 …...

MySQL 表连接(内连接与外连接)

&#x1f3dd;️专栏&#xff1a;Mysql_猫咪-9527的博客-CSDN博客 &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” 目录 1、表连接的核心概念 1.1 为什么需要表连接&#xff1f; 2、内连接&a…...

重学Java基础篇—什么是快速失败(fail-fast)和安全失败(fail-safe)?

快速失败&#xff08;fail-fast&#xff09; 和 安全失败&#xff08;fail-safe&#xff09; 是两种不同的迭代器设计策略&#xff0c;主要用于处理集合&#xff08;如 List、Map&#xff09;在遍历过程中被修改的场景。 它们的核心区别在于对并发修改的容忍度和实现机制。 1…...

Redis 集群配置

在币圈交易所&#xff0c;Redis 集群的节点数量和内存大小通常根据交易所的规模、访问量、并发需求等因素来决定。一般来说&#xff0c;可以按照以下标准配置&#xff1a; Redis 集群节点数量 小型交易所&#xff08;日活 < 10万&#xff0c;QPS < 10k&#xff09;&…...

容器C++

string容器 string构造函数 #include<iostream> using namespace std; #include<string.h> void test01() {string s1;//默认构造const char* str "hello world";string s2(str);//传入char*cout << "s2" << s2 << endl;s…...

Git 基础入门:从概念到实践的版本控制指南

一、Git 核心概念解析 1. 仓库&#xff08;Repository&#xff09; Git 的核心存储单元&#xff0c;包含项目所有文件及其完整历史记录。分为本地仓库&#xff08;开发者本地副本&#xff09;和远程仓库&#xff08;如 GitHub、GitLab 等云端存储&#xff09;&#xff0c;支持…...

蓝桥杯真题_小蓝和小桥的讨论

小蓝和小桥的讨论 问题描述 小蓝和小桥是一所高中的好朋友&#xff0c;他们正在讨论下一次的课程。这节课需要讨论 nn 个主题&#xff0c;第 ii 个主题对老师来说有 aia**i 的趣味度&#xff0c;对学生来说有 bib**i 的趣味度。 小蓝认为&#xff0c;如果一个主题对老师来说…...

【C++游戏引擎开发】《线性代数》(2):矩阵加减法与SIMD集成

一、矩阵加减法数学原理 1.1 定义 ​逐元素操作:运算仅针对相同位置的元素,不涉及矩阵乘法或行列变换。​交换律与结合律: 加法满足交换律(A + B = B + A)和结合律( ( A + B ) + C = A + ( B + C ) )。 ​减法不满足交换律(A − B ≠ B − A)。1.2 公式 ​ C i j = …...

HTML应用指南:利用POST请求获取全国小鹏汽车的充电桩位置信息

在新能源汽车快速发展的背景下&#xff0c;充电桩的分布和可用性成为影响用户体验的关键因素之一。随着全球对环境保护意识的增强以及政府对新能源政策的支持&#xff0c;越来越多的消费者倾向于选择电动汽车作为日常出行工具。然而&#xff0c;充电设施是否完备、便捷直接影响…...

工具介绍《WireShark》

Wireshark 过滤命令中符号含义详解 一、比较运算符 Wireshark 支持两种比较运算符语法&#xff1a;英文缩写&#xff08;如 eq&#xff09;和 C语言风格符号&#xff08;如 &#xff09;&#xff0c;两者功能等价。 符号&#xff08;英文缩写&#xff09;C语言风格符号含义示…...

深入理解 Linux 中磁盘空间驱动的编写:从原理到实践

在编写 Linux 内核中的磁盘空间驱动时&#xff0c;理解不同类型的存储设备及其在内核中的工作模式至关重要。常见的存储设备主要分为两类&#xff1a;采用 MTD&#xff08;Memory Technology Device&#xff09;模式的原始闪存设备&#xff08;如 NAND、NOR Flash&#xff09;&…...

flutter android端抓包工具

flutter做的android app&#xff0c;使用fiddler抓不了包&#xff0c;现介绍一款能支持flutter的抓包工具Reqable&#xff0c;使用方法如下&#xff1a; 1、下载电脑端安装包 下载地址为【https://reqable.com/zh-CN/download/】 2、还是在上述地址下载 android 端apk&#xf…...

知识周汇 | 用 matplotlib 轻松绘制折线图、散点图、柱状图、直方图

目录 前言 折线图 散点图 柱状图 直方图 组合图&#xff1a;柱状图和折线图 1. 导入库 2. 定义组合图函数 3. 设置中文字体和样式 4. 创建画布和子图 5. 绘制柱状图 6. 绘制折线图 7. 美化图表 8. 保存和显示图表 9. 调用函数 总结 前言 matplotlib 是 Python…...

Ribbon负载均衡的深度解析与应用

在微服务架构中&#xff0c;服务之间的调用频繁且复杂&#xff0c;因此负载均衡显得尤为重要。Spring Cloud生态系统中&#xff0c;Ribbon作为一个客户端负载均衡器&#xff0c;扮演着关键的角色。它不仅能提高系统的响应速度&#xff0c;还能确保系统的稳定性和可用性。接下来…...

Neo4j GDS-06-neo4j GDS 库中社区检测算法介绍

neo4j apoc 系列 Neo4j APOC-01-图数据库 apoc 插件介绍 Neo4j APOC-01-图数据库 apoc 插件安装 neo4j on windows10 Neo4j APOC-03-图数据库 apoc 实战使用使用 Neo4j APOC-04-图数据库 apoc 实战使用使用 apoc.path.spanningTree 最小生成树 Neo4j APOC-05-图数据库 apo…...

Android 删除aar中的一个类 aar包冲突 aar类冲突 删除aar中的一个包

Duplicate class com.xxxa.naviauto.sdk.listener.OnChangeListener found in modules jetified-xxxa-sdk-v1.1.2-release-runtime (:xxx-sdk-v1.1.2-release:) and jetified-xxxb-sdk-1.1.3-runtime (:xxxb-sdk-1.1.3:) A.aar B.aar 有类冲突&#xff1b; 使用 exclude 排除本…...

【老电脑翻新】华硕A456U(换电池+换固态+光驱换机械+重装系统+重装系统后开始菜单失灵问题解决)

前言 电脑华硕A456U买来快10年了&#xff0c;倒是还能用&#xff0c;就是比较卡&#xff0c;cpu占比总是100%&#xff0c;之前已经加过内存条了。想要不换个固态看看。 省流&#xff1a;没太大效果。 记录一下拆机&换固态的过程 准备 西部数据固态硬盘480G WD Green S…...

Unity 简单使用Addressables加载SpriteAtlas图集资源

思路很简单&#xff0c;传入图集名和资源名&#xff0c;利用Addressables提供的异步加载方式从ab包中加载。加载完成后存储进缓存字典里&#xff0c;以供后续使用。 添加引用计数&#xff0c;防止多个地方使用同一图集时&#xff0c;不会提前释放 using UnityEngine; using U…...

stable diffusion本地安装

1. 基本环境准备 安装conda 环境 pytorch基础学习-CSDN博客 创建虚拟环境&#xff1a; conda create -n sd python3.10 一定要指定用3.10&#xff0c;过高的版本会提示错误&#xff1a; 激活启用环境&#xff1a; conda activate sd 设置pip国内镜像源&#xff1a; pip conf…...

MQ 如何保证数据一致性?

大家好&#xff0c;我是苏三&#xff0c;又跟大家见面了。 前言 上个月&#xff0c;我们有个电商系统出了个灵异事件&#xff1a;用户支付成功了&#xff0c;但订单状态死活不改成“已发货”。 折腾了半天才定位到问题&#xff1a;订单服务的MQ消息&#xff0c;像人间蒸发一…...

spring @Autowired对属性、set方法,构造器的分别使用,以及配合 @Autowired 和 @Qualifier避免歧义性的综合使用案例

代码结构 依赖注入 在Spring IoC容器的概念中&#xff0c;主要是使用依赖注入来实现Bean之间的依赖关系的 举例 例如&#xff0c;人类&#xff08;Person&#xff09;有时候会利用动物&#xff08;Animal&#xff09;来完成一些事情&#xff0c;狗&#xff08;Dog&#xff0…...

Ubuntu 系统上完全卸载 Docker

以下是在 Ubuntu 系统上完全卸载 Docker 的分步指南 一.卸载验证 二.卸载步骤 1.停止 Docker 服务 sudo systemctl stop docker.socket sudo systemctl stop docker.service2.卸载 Docker 软件包 # 移除 Docker 核心组件 sudo apt-get purge -y \docker-ce \docker-ce-cli …...

国际机构Gartner发布2025年网络安全趋势

转自&#xff1a;中国新闻网 中新网北京3月14日电 国际机构高德纳(Gartner)14日发布的消息称&#xff0c;网络安全和风险管理在2025年“面临挑战与机遇并存的局面”&#xff0c;“实现转型和提高弹性”对确保企业在快速变化的数字世界中&#xff0c;实现安全且可持续的创新至关…...

设计秒杀系统(高并发的分布式系统)

学海无涯&#xff0c;志当存远。燃心砺志&#xff0c;奋进不辍。 愿诸君得此鸡汤&#xff0c;如沐春风&#xff0c;事业有成。 若觉此言甚善&#xff0c;烦请赐赞一枚&#xff0c;共励学途&#xff0c;同铸辉煌&#xff01; 思路 处理高并发 流量削峰&#xff1a;限流&#xf…...

C# 打印模板设计-ACTIVEX打印控件-多模板加载

一、启动软件 using System; using System.Collections.Generic; using System.Windows.Forms; using System.Data;namespace Print {static class Program{/// <summary>/// 应用程序的主入口点。/// </summary>[STAThread]static void Main(){//使用模板前必须…...

华为HCIE方向那么多应该如何选择?

在华为认证体系里&#xff0c;HCIE作为最高等级的认证&#xff0c;是ICT领域专业实力的有力象征。HCIE设置了多个细分方向&#xff0c;这些方向宛如不同的专业赛道&#xff0c;为期望在ICT行业深入发展的人提供了丰富的选择。今天&#xff0c;咱们就来好好聊聊华为HCIE方向的相…...

五子棋游戏

五子棋 - deveco <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>五子棋 - deveco</title>…...

Vue3.5 企业级管理系统实战(十):面包屑导航组件

1 breadcrumb 组件 1.1 安装插件 path-to-regexp 首先&#xff0c;我们需要安装插件 path-to-regexp&#xff0c;以便在下面的面包屑组件中对路由地址进行解析。 path-to-regexp是一个 JavaScript 库&#xff0c;可将路径字符串转化为正则表达式&#xff0c;广泛用于 Web 开发…...

【python】OpenCV—Hand Detection

文章目录 1、功能描述2、代码实现3、效果展示4、完整代码5、参考6、其它手部检测和手势识别的方案 更多有趣的代码示例&#xff0c;可参考【Programming】 1、功能描述 基于 opencv-python 和 mediapipe 进行手部检测 2、代码实现 导入必要的库函数 import cv2 import media…...

[ComfyUI] SDXL Prompt Styler 自定义节点的作用解析

1. SDXL Prompt Styler 的位置与基本功能 在 ComfyUI 的 “新建节点” → “实用工具” 下,可以找到 Style 节点(SDXL Prompt Styler)。该节点的主要作用是对输入的描述进行结构化处理,并在转换为 Stable Diffusion XL (SDXL) 提示词时,自动补充风格相关的内容,使提示词…...