指令补充+样式绑定+计算属性+监听器
一、指令补充
1. 指令修饰符
1. 作用: 借助指令修饰符, 可以让指令更加强大
2. 分类:
1> 按键修饰符: 用来检测用户的按键, 配合键盘事件使用. keydown 和 keyup
语法:
@keydown.enter/v-on:keydown.enter 表示当enter按下的时候触发
@keyup.enter/v-on:keyup.enter 表示当enter抬起的时候触发
2> 事件修饰符: 简化程序对于阻止冒泡(子元素和上级元素有相同的事件,子元素事件的触发会向上传递会触发上级元素的同名事件),阻止默认行为的操作(比如a标签的默认行为就是,点击链接会跳转)
语法:
@事件名.stop/v-on:事件名.stop -> 阻止冒泡
@事件名.prevent/v-on:事件名.prevent -> 阻止默认行为
@事件名.stop.prevent -> 可以连用 即阻止事件冒泡也阻止默认行为
3> 双向绑定修饰符: 可以让v-model的功能更加强大
语法: v-model = "数据"
v-model.trim="数据": 把输入框的首位空格去掉再同步给数据
v-model.number="数据": 尝试把输入框的值转成数字再同步给数据
v-model.lazy="数据": 当失焦的时候再同步给数据, 而不是实时同步
关于冒泡
总体代码
按键修饰符和事件修饰符
<script setup>
// 处理按键函数
const onkeyDown = () => {console.log('onKeyDown')
}
// p标签的点击事件
const onPClick = () => {console.log('onPClick')
}
const onDivclick = () => {console.log('onDivclick')
}
const onAClick = () =>{console.log('onAClick')
}</script>
<template><div @click="onDivclick"><!-- 按键修饰符 --><!-- 检测用户按的是不是回车键,是回车键就触发搜索 --><!-- 可以配合键盘来使用 keydown.enter keyup.enter --><input type="text" v-on:keydown.enter="onkeyDown"><!-- 事件修饰符 --><!-- 阻止a的默认行为 --><!-- .prevent: 阻止默认行为 --><a href="https://baidu.com" @click.prevent="onAClick">百度一下</a><!-- .stop: 阻止冒泡,同名事件不会向上传递--><p @click.stop="onPClick"></p><!-- 一起使用,阻止默认行为,阻止向上冒泡 --><!-- 既不跳转,也不冒泡 修饰符的链式调用,俩个同时阻止--><a href="https://baidu.com" @click.prevent.stop="onAClick">百度一下</a></div>
</template><style scoped>
div {width: 400px;height: 200px;background: plum;
}div a {display: block;width: 100px;text-decoration: none;background: tomato;text-align: center;color: #fff;
}div p {width: 200px;height: 100px;background: rebeccapurple;
}
</style>
双向绑定修饰符
<script setup>
import { ref, reactive } from 'vue'
const goods = reactive({name: '',price: ''
})
</script><template><div><!-- .lazy修饰符 -->名称: <input type="text" v-model.lazy="goods.name"><br/><br/>价格: <input type="text" v-model="goods.price"><br/><br/><!-- .trim修饰符 --><!-- 去除首位空格 -->名称: <input type="text" v-model.trim="goods.name"><br/><br/>价格: <input type="text" v-model="goods.price"><br/><br/><!-- .number -->名称: <input type="text" v-model.trim="goods.name"><br/><br/>价格: <input type="text" v-model.number="goods.price"></div>
</template><style scoped></style>
结果
2. v-model作用在其他元素上
v-model双向绑定指令: 可以快速设置或获取表单控件的值, 比如: 输入框, 文本域,下拉菜单, 单选框,复选框. 用在不同的表单控件上, v-model都能够正确设置或获取相应的值, 但内部采用的方式和关联的属性有所不同.
输入框: v-model -> input[type=text/search] -> value
文本域: v-model -> textarea -> value
下拉框: v-model -> select -> value
单选框: v-model -> radio -> value (需要手动添加value属性)
复选框: v-model -> checkbox ->
1. 只有一个复选框: v-model绑定布尔值, 关联的是复选框的checked属性(当前复选框是否选中)
2. 有多个复选框: v-model绑定数组, 关联的是复选框的 value 属性, 需要手动给复选框添加 value 属性
具体代码
<script setup>
import { ref } from 'vue'
// 自我介绍
const info = ref('')
// 收集城市
//里面写选择下拉框的 value
const city = ref('SH')
// 血型
//里面写单选框的 value
const blood = ref('ab')
// 是否选中
const isAgree = ref(false)
// 收集爱好
const hobby = ref(['lq','ppq'])
</script>
<template><div><!-- 文本域 --><!-- 文本域里面默认有value 无需添加 --><textarea cols="30" rows="4" placeholder="请输入自我介绍" v-model="info"></textarea><br /><br /><br /><!-- 下拉菜单 --><!-- 每次选择就会把value放在city里面 --><!-- v-model 绑定的是下拉框的 value值 --><!-- select 里面默认有value无需手动添加 --><select v-model="city"><option value="BJ">北京</option><option value="SH">上海</option><option value="SZ">深圳</option><option value="HZ">杭州</option></select><br /><br /><br /><!-- 单选框 多个当中只能选择一个, 需要单选框手动添加value--><input type="radio" value="a" v-model="blood">A<input type="radio" value='b' v-model="blood">B<input type="radio" value='ab' v-model="blood">AB<input type="radio" value='o' v-model="blood">O<br><br><!-- 复选框 --><!-- 只有一个复选框的情况 --><input type="checkbox" v-model="isAgree">是否同意用户协<br><br><br><!-- 有多个复选框的情况 --><!-- 此时收集结果, 需要用到数组 --><input type="checkbox" value="lq" v-model="hobby">篮球<input type="checkbox" value="ymq" v-model="hobby">羽毛球<input type="checkbox" value="ppq" v-model="hobby">乒乓球<input type="checkbox" value="zq" v-model="hobby">足球<br><input type="checkbox" value="cf" v-model="hobby">吃饭<input type="checkbox" value="sj" v-model="hobby">睡觉<input type="checkbox" value="ddd" v-model="hobby">打豆豆<input type="checkbox" value="xx" v-model="hobby">学习</div></template><style scoped></style>
运行结果
三、样式绑定
概念
1. 为了方便程序员给元素动态的设置样式, Vue扩展了 v-bind 语法(绑定属性)允许我们通过绑定class或者style属性, 通过数据控制元素的样式.
2. 分类: 1>绑定 class 2> 绑定style
1. class样式绑定
class的绑定语法: v-bind:class="三元表达式或对象"/ :class="三元表达式或对象"
1> 三元绑定: :class=" 条件 ? '类名1' : '类名2' "
2> 对象绑定: :class="{类名1:布尔值1,类名2:布尔值2,...", 布尔值为true,添加类名; 否则移除类名
具体代码
<script setup>
import { ref } from 'vue'
// 是否激活
const isActive = ref(true)
</script>
<template><div><!-- 1.三元绑定 --><!-- 满足条件则类选择器指向的标签为红色 --><p v-bind:class="isActive ? 'active' : ''">Active1</p><!-- 2. 对象绑定(用的多) --><p :class="{ active: isActive }">Active2</p><!-- 3. 静态class和动态class可以共存, 二者会合并 --><!-- 此时有俩个类一般多个类会通过空格来进行分割 active item --><p class="item" :class="{ active: isActive }">Active3</p></div>
</template><style scoped>
/* 类名为active */
.active {color: red;
}
</style>
案例一: 京东秒杀-tab栏切换导航高亮
需求:
当我们点击哪个tab页签时,哪个tab标签就⾼亮
步骤:
1> 静态布局+样式
2> 列表渲染 绑定给背景变成红色,字体变成黑色的类v-bind:class{}
3> 点谁谁亮 添加点击事件,点击谁就把谁的下标赋值给激活下标
具体代码
<script setup>
import { ref } from 'vue';// 1> 静态布局+样式// 2> 列表渲染
// 如果是要对数组进行动态操作: 删除, 添加此时才用ref(响应式)
// tabs 栏数组
const tabs = [{ id: 1, name: "京东秒杀" },{ id: 2, name: "每日特价" },{ id: 3, name: "品牌秒杀" }]
// 3> 点谁谁亮
//激活的下标, 默认第一个高亮
const activeIndex = ref(0)
</script><template><div><ul><!-- index和activeIndex的值一样就把设置显示红色的类加上去 --><li v-for="(item, index) in tabs" :key="item.id"><!-- 把点击的下标值赋值给控制激活的下标 --><a @click="activeIndex = index" href="#" :class="{ active: activeIndex === index }">{{ item.name }}</a></li></ul></div>
</template><style>
* {margin: 0;padding: 0;
}ul {/* 去除小黑点 */list-style: none;display: flex;border-bottom: 2px solid #e01222;padding: 0 10px;
}ul li {width: 100px;height: 50px;line-height: 50px;text-align: center;
}ul li a {display: block;text-decoration: none;color: #333;font-weight: bold;
}ul li a.active {/* 背景为红色 */background: #e01222;/* 字体颜色为白色 */color: #fff;
}
</style>
2. style样式绑定
使用介绍
style样式绑定:
1. 语法: :style="{css属性名1:表达式1,css属性名2:表达式2,...}"
具体代码
<script setup>
import { reactive, ref } from 'vue';
// 字体颜色
const colorStr = ref('red')
// 响应式样式对象
const styleObj = reactive({color: 'green',background: 'yellow'
})
</script>
<template><div><p v-bind:style="{ color: colorStr }">Style1</p><p :style="styleObj">Style2</p></div>
</template>
<style></style>
案例二: 进度条
需求: 点击哪个按钮,上面进度条就跑到多少
核心: 修改inner盒子里面的宽度即可完成进度条的显示, 此时它这个数字会跟随点击按钮而改变
完整代码:
<script setup>
import { ref } from 'vue'
// 份数: 一共四份
const x = ref(0)
</script>
<template><div class="progress"><!-- 拼接为百分数 --><div class="inner" v-bind:style="{ width: (x / 4) * 100 + '%' }"><span>{{ (x / 4) * 100 + '%' }}</span></div></div><!-- 每次点击把x赋值 --><button @click="x = 1">设置25%</button><button @click="x = 2">设置50%</button><button @click="x = 3">设置75%</button><button @click="x = 4">设置100%</button>
</template>
<style>
.progress {height: 25px;width: 400px;border-radius: 15px;background-color: #272425;border: 3px solid #272425;box-sizing: border-box;margin-bottom: 30px;
}.inner {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: -25px;bottom: -25px;
}
</style>
四、计算属性
1. 基本使用
1. 定义: 基于现有的数据, 计算得到新数据; 当现有的数据发生变化了, 计算属性会重新计算得到新结果.(购物车, 基于商品的数组大小统计出商品数,后续数组发生变化, 商品数也会发生变化)
2. 语法:
import {computed} form 'vue'
const 新数据 = computed(()=>{
//编写计算代码
return 计算结果
})
案例: 求商品的总数
const goodList = [
{ id: 1, name: '篮球', num: 1 },
{ id: 2, name: '玩具', num: 3 },
{ id: 3, name: '书籍', num: 2 }
]//我们可以使用computed计算把每个商品的数量进行累加
具体代码:
<script setup>
import { ref, computed } from 'vue'
// 商品列表(原始数据)
const goodsList = ref([{ id: 1, name: '篮球', num: 1 },{ id: 2, name: '玩具', num: 3 },{ id: 3, name: '书籍', num: 2 }
])
// 计算属性
// 总数是依赖于这个对象数组得到的,因此goodList是totalNum的依赖
const totalNum = computed(() => {// 求和return goodsList.value.reduce((prev, item) => prev + item.num, 0)
})
// 访问对象的计算属性
console.log(totalNum.value)
</script>
<!-- 基于现有的原始数据 goodsList 计算得到总数量 -->
<!-- 此时推荐把总数量声明为 计算属性 -->
<template><div><h3>商品清单</h3><table><thead><tr><th>名字</th><th>数量</th></tr></thead><tbody><tr v-for="(item) in goodsList" :key="item.id"><td>{{ item.name }}</td><td>{{ item.num }}</td></tr><p>商品总数: {{ totalNum }} 个</p><!-- 复习v-text --><p>商品总数: <span v-text="totalNum"></span>个</p></tbody></table></div>
</template><style scoped>
table {width: 350px;border: 1px solid #333;
}table th,
table td {border: 1px solid #333;
}table td {text-align: center;
}
</style>
4. 什么时候使用计算属性?
当需要基于原始/已知数据计算求得新结果
5. 计算属性的使用
1> computed和ref/reactive一致, 既可以配合插值, 也可以配合指令使用
2> 在js中要获取计算属性, 需要通过 计算属性.value
6. 注意:
1> 计算属性必须有返回值, 该返回值就是计算属性的返回结果
2> 当依赖发生变化, 计算属性会重新计算
2. 计算属性 VS 普通函数
计算属性和普通函数的区别
计算属性:
1. 概念: 封装一段计算求值的代码
2. 语法:
1> 配合插值或指令
2> js操纵的时候, 需要 .value
普通函数:
1. 概念: 封装一段任意的js代码
2. 语法:
1> 配合插值或指令使用: 函数名(实参列表)
2> 配合事件使用, @click="函数名(实参列表)"
计算属性的优势
带缓存
1. 当依赖不变, 多次调用同一个计算属性, 函数体只会执行一次, 因为第一次函数体执行完毕后会缓存计算结果
2. 当依赖发生变化的时候, 计算属性才会重新计算, 并缓存新的结果.
3. 普通函数不带缓存, 调用一次, 会执行一次.
什么时候用函数, 什么时候用计算属性
1. 当要搭配事件的时候使用函数
2. 基于已有属性计算新值使用计算属性
3. 计算属性完整写法
什么时候使用完整写法?
需要修改计算属性的时候(给计算属性赋值)
问题
默认是的简易写法, 计算属性是只读的(只能展示, 不能赋值),如果赋值就会报警.
我们可以看出, 我们computed的简写计算出来的值是不能修改的(只读)
解决方法
需要用到计算属性的完整写法: get + set
完整写法的语法
1> 简易写法: const 计算属性 = computed(()=>{return 计算结果})
2> 完整写法:
const 计算属性 = computed({
// 使用计算属性的时候, 自动触发get, get 内部必须返回计算结果
get(){
return 计算结果
},
//修改计算属性自动触发 set, val 参数表示要给计算属性赋予的值
set(val){
}
})
代码演示
<script setup>
import { computed } from 'vue';
//简易写法只能读不能写
const username = computed(()=>{return "小黑子"
})
//完整写法
const username2 = computed({// get: function(){// return "小白子"// },get(){return "小白子"},// value是给计算属性赋予的新值// 只要给计算属性赋值, 就会触发 set 函数的执行set(value){console.log(value)}
})
</script>
<template><div><input type="text"v-model="username"></div><div><input type="text"v-model="username2"></div>
</template><style scoped></style>
结果解析
五 案例三: 全选反选
需求:
1> 点击选项 对应的字会变成 灰色
2> 点击全选 对应的全部的字变成 灰色
3> 点击反选 对应的选项取反
具体代码
<script setup>
import { ref, computed } from 'vue'
// 计划列表
const planList = ref([// 默认是false{ id: 12, name: '跑步', done: false },{ id: 76, name: '看书', done: false },{ id: 31, name: '撸码', done: false },{ id: 49, name: '追剧', done: false }
])
//是否全选
const isAll = computed({// 使用计算属性自动触发 getget() {// 检测每一个return planList.value.every((item) => item.done)},//修改计算属性自动触发 setset(val) {//value 给计算属性赋予的新值, 此时就是全选复选框的状态// 点击全不选, 然后小选的就被全选的值所赋值console.log(val)//遍历 planList 数组, 把每个小选的 done 属性和 val 保持一致即可planList.value.forEach((item) => item.done = val)}
})
//点击反选, 直接遍历当前数组对象, 然后对里面的done属性进行取反即可
const onTouch = () => {//遍历 planList数组, 对每个对象的 done 属性取反即可planList.value.forEach(item => item.done = !item.done)}</script>
<template><div class="container"><P><span><input type="checkbox" id="all" v-model="isAll"><!-- label 和input的id保持一致,点击文字可以控制复选框选不选中--><label for="all">全选</label></span><button @click="onTouch">反选</button></P><ul><li v-for="item in planList"><input type="checkbox" v-model="item.done"><!-- 根据对象里面的值来控制 --><span :class="{ completed: item.done }">{{ item.name }}</span></li></ul></div></template><style lang="scss">
* {margin: 0;padding: 0;
}ul {list-style: none;li {display: flex;justify-content: space-between;align-items: center;padding-left: 5px;height: 40px;border-bottom: 1px solid #ccc;span.completed {// 如果加上这个类就会把字体变成灰色并且有一条线color: #ddd;text-decoration: line-through;}}
}.container {width: 400px;margin: 100px auto;padding: 15px 18px;background: plum;p {display: flex;justify-content: space-between;align-items: center;height: 40px;border-bottom: 1px solid #ccc;padding: 3px 6px;}input {margin-left: 8px;}}
</style>
六、侦听器
侦听器: 监视 == 盯着看
1. 作用: 监视响应式数据(ref/reactive数据)变化, 当数据变了, 可以更改DOM或异步操作. 比如监视搜索框关键字的变化, 比如监视搜索框关键字的变化, 变了之后, 可以用最新的关键字发送请求, 拿到最新的联想建议列表.
2. 语法: 需要使用到 watch 函数进行声明
import {watch} from 'vue'
watch(响应式数据,(newVal,oldVal) => {
//newVal: 新值
//oldVal: 旧值
}
具体代码
<script setup>
import { ref, watch, reactive } from 'vue'
//搜索关键字
const keyword = ref('')
//监视 keyword 这个 ref 响应式数据
//只要 keyword 变了, 每次都会执行 watch 的回调函数
watch(keyword, (newVal, oldVal) => {//先打印新值, 再打印旧值console.log(newVal, oldVal)
})
// 响应式对象
const obj = reactive({username: '',password: ''
})
watch(obj, (newVal, oldVal) => {// 对象的新和就值一样,因为指向的是同一块地址console.log(newVal, oldVal)console.log(newVal === oldVal)console.log(newVal === obj)
})
</script>
<template><div><input type="text" v-model="keyword" placeholder="请输入关键字"><br><input type="text" v-model="obj.username" placeholder="请输入用户名"><br><input type="text" v-model="obj.password" placeholder="请输入密码"></div>
</template><style scoped></style>
七、案例成绩管理
需求
1> 输入科目和分数,点击添加,这个数据就会加到表格中去.
2> 点击删除按钮, 就可以删除这个数据.
3> 每次操作完都会重新计算总分和平均分.
4> 如果没有数据, 就会显示(暂无数据)
主要功能实现:
添加
1> 收集表单的值: v-model指令 + 修饰符trim和number
2> 点击添加按钮: 做非空校验 + 阻止默认行为
3> 通过校验后, 需要给 scoreList 数组里面新增一个对象(数据驱动视图的思想) 使用了 对象的...进行展开
4> 清空表单
删除
1> 绑定点击事件, 传入下标作为实参
2> 删除确定的提示
3> 调用 splice() 进行删除
4> 当数据删除完毕, 需要展示 暂无数据 的提示
底部统计:
1> 总分: 计算属性 + reduce()求和
2> 平均分: 总分/数组的长度 + 三元判断
数据持久化: 点击浏览器的刷新, 我们表单里面的值会保持上一次的状态
1> 监视 scoreList 的变化, 当它变了之后, 只需要把最新的只存储到本地, 通过 localStorage 进行存储
2> 当页面刷新的时候, 从本地中取出上次存储 scoreList, 基于整个值进行 table 的列表渲染即可
具体代码
<script setup>
import { ref, reactive, computed, watch } from 'vue'
//本地存储的键名
const SCORE_LIST_KEY = 'score-list-key';
//从前端本地取值,而不是用我们这里对象数组里面写的值
// 取的时候需要反序列化
// console.log(localStorage.getItem('score-list-key'))
// console.log(JSON.parse(localStorage.getItem('score-list-key')))
// 成绩列表
const scoreList = ref(//第一次进来,locastorage里面没有值, 默认为null, 那么就返回默认值JSON.parse(localStorage.getItem(SCORE_LIST_KEY)) || [{ id: 19, subject: '语⽂', score: 94 },{ id: 27, subject: '数学', score: 57 },{ id: 12, subject: '英语', score: 92 }]
)
//成绩表单
const scoreForm = reactive({subject: '',//科目score: ''//科目的分数
})
//添加
const onAdd = () => {//非空校验if (!scoreForm.subject || !scoreForm.score) {return alert("科目名称或分数不能为空")}//给数组新增对象scoreList.value.push({// 把对象的键值对放进去...scoreForm,//展开 scoreform, 把 scoreform 中的键值对全部拿过来,放到新对象中id: Date.now()// 时间戳// 就相当于下面的代码// subject: '',//科目// score: ''//科目的分数})//清空表单scoreForm.score = ''scoreForm.subject = ''
}
//删除
const onDel = (i) => {// console.log(i)if (window.confirm("确认删除吗?")) {scoreList.value.splice(i, 1)}
}
//计算得到总分数
const totalScore = computed(() => {return scoreList.value.reduce((prev, item) => prev + item.score, 0)
})
//计算得到平均分
const avgScore = computed(() => {//0/0=NaNreturn scoreList.value.length > 0? totalScore.value / scoreList.value.length: 0;
})
//监视
//watch 里面监视的是响应式数据
watch(scoreList, (newVal) => {//监视 scoreList 的变化, 当 scoreList 变了,将最新的值进行序列化后, 存储到本地localStorage.setItem(SCORE_LIST_KEY, JSON.stringify(newVal))
},{deep: true}//开启深度监听
)</script>
<template><div class="score-case"><div class="table"><table><thead><tr><th>编号</th><th>科⽬</th><th>成绩</th><th>操作</th></tr></thead><tbody><!-- 列表渲染 --><!-- 使用 v-for 循环生成每一行 --><tr v-for="(item, index) in scoreList" :key="item.id"><td>{{ index + 1 }}</td><td>{{ item.subject }}</td><!-- v-bind 绑定熟悉值,小于60绑定red这个类 --><td v-bind:class="{ red: item.score < 60 }">{{ item.score }}</td><!-- 绑定点击事件, 把下标作为参数传进去 --><td><a href="#" @click="onDel(index)">删除</a></td></tr></tbody><!-- 添加条件渲染,数组长度为0再展示 --><tbody v-if="scoreList.length === 0"><tr><td colspan="5"><span class="none">暂⽆数据</span></td></tr></tbody><tfoot><tr><td colspan="5"><span>总分: {{ totalScore }}</span><span style="margin-left: 50px">平均分: {{ avgScore }}</span></td></tr></tfoot></table></div><form class="form"><div class="form-item"><div class="label">科⽬:</div><div class="input"><!-- 收集表单的值 --><!-- 和v-model进行双向数据绑定 并且去除首尾空格--><input type="text" placeholder="请输⼊科⽬" v-model.trim="scoreForm.subject" /></div></div><div class="form-item"><div class="label">分数:</div><div class="input"><!-- 双向数据绑定, 只能输入数字 --><input type="number" placeholder="请输⼊分数" v-model.number="scoreForm.score" /></div></div><div class="form-item"><div class="label"></div><div class="input"><!-- 绑定添加函数 --><!-- 消除表单的默认刷新行为 --><button class="submit" @click.prevent="onAdd">添加</button></div></div></form></div>
</template>
<style>
.score-case {width: 1000px;margin: 50px auto;display: flex;
}.score-case .table {flex: 4;
}.score-case .table table {width: 100%;border-spacing: 0;border-top: 1px solid #ccc;border-left: 1px solid #ccc;
}.score-case .table table th {background: #f5f5f5;
}.score-case .table table tr:hover td {background: #f5f5f5;
}.score-case .table table td,
.score-case .table table th {border-bottom: 1px solid #ccc;border-right: 1px solid #ccc;text-align: center;padding: 10px;
}.score-case .table table td.red,
.score-case .table table th.red {color: red;
}.score-case .table .none {height: 100px;line-height: 100px;color: #999;
}.score-case .form {flex: 1;padding: 20px;
}.score-case .form .form-item {display: flex;margin-bottom: 20px;align-items: center;
}.score-case .form .form-item .label {width: 60px;text-align: right;font-size: 14px;
}.score-case .form .form-item .input {flex: 1;
}.score-case .form .form-item input,
.score-case .form .form-item select {appearance: none;outline: none;border: 1px solid #ccc;width: 200px;height: 40px;box-sizing: border-box;padding: 10px;color: #666;
}.score-case .form .form-item input::placeholder {color: #666;
}.score-case .form .form-item .cancel,
.score-case .form .form-item .submit {appearance: none;outline: none;border: 1px solid #ccc;border-radius: 4px;padding: 4px 10px;margin-right: 10px;font-size: 12px;background: #ccc;
}.score-case .form .form-item .submit {border-color: #069;background: #069;color: #fff;
}
</style>
相关文章:
指令补充+样式绑定+计算属性+监听器
一、指令补充 1. 指令修饰符 1. 作用: 借助指令修饰符, 可以让指令更加强大 2. 分类: 1> 按键修饰符: 用来检测用户的按键, 配合键盘事件使用. keydown 和 keyup 语法: keydown.enter/v-on:keydown.enter 表示当enter按下的时候触发 keyup.enter/v-on:keyup.enter 表示当…...
基于Android的病虫害防治技术系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 基于Android的病虫害防治技术系统设计的目的是为用户提供一个病虫害防治技术管理的平台。与PC端应用程序相比,病虫害防治技术管理的设计主要面向于广大用户,旨在为用户提供一个查看科普内容,进行病虫识别、发帖交流的平台。 基于Androi…...
ffmpeg 使用不同编码器编码hevc的速度
1.核显uhd630 编码器hevc_qsv ffmpeg版本2024-03-14 2.73X 转码完成后大小 971mb 2.1680V4 编码器 libx265 ffmpeg版本2025-05-07 1.42x 转码完成后大小 176mb 3.RX588 编码器hevc_amf ffmpeg版本2024-03-14 转码完成后大小 376MB 4.1680v4dg1rx584 编码器hevc_amf ffm…...
【硬件模块】数码管模块
一位数码管 共阳极数码管:8个LED共用一个阳极 数字编码00xC010xF920xA430xB040x9950x9260x8270xF880x8090x90A0x88B0x83C0xC6D0xA1E0x86F0x8E 共阴极数码管:8个LED共用一个阴极 数字编码00x3F10x0620x5B30x4F40x6650x6D60x7D70x0780x7F90x6FA0x77B0x7…...
NO.64十六届蓝桥杯备战|基础算法-简单贪心|货仓选址|最大子段和|纪念品分组|排座椅|矩阵消除(C++)
贪⼼算法是两极分化很严重的算法。简单的问题会让你觉得理所应当,难⼀点的问题会让你怀疑⼈⽣ 什么是贪⼼算法? 贪⼼算法,或者说是贪⼼策略:企图⽤局部最优找出全局最优。 把解决问题的过程分成若⼲步;解决每⼀步时…...
ubuntu22.04LTS设置中文输入法
打开搜狗网址直接下载软件,软件下载完成后,会弹出安装教程说明书。 网址:搜狗输入法linux-首页搜狗输入法for linux—支持全拼、简拼、模糊音、云输入、皮肤、中英混输https://shurufa.sogou.com/linux...
基于YOLOv8的热力图生成与可视化-支持自定义模型与置信度阈值的多维度分析
目标检测是计算机视觉领域的重要研究方向,而YOLO(You Only Look Once)系列算法因其高效性和准确性成为该领域的代表性方法。YOLOv8作为YOLO系列的最新版本,在目标检测任务中表现出色。然而,传统的目标检测结果通常以边…...
常见设计系统清单
机构设计系统toB/toC网站GoogleMaterial DesignCm3.material.ioIBM CarbonDesign SystemBcarbondesignsystem.comSalesforceLightning Design SystemBlightningdesignsystem.comMicrosoftFluent Design SystemCfluent2.microsoft.design阿里Ant DesignCant.designSAPFiori Desi…...
React编程高级主题:错误处理(Error Handling)
文章目录 **5.2 错误处理(Error Handling)概述****5.2.1 onErrorReturn / onErrorResume(错误回退)****1. onErrorReturn:提供默认值****2. onErrorResume:切换备用数据流** **5.2.2 retry / retryWhen&…...
【设计模式】代理模式
简介 假设你在网上购物时,快递员无法直接将包裹送到你手中(比如你不在家)。 代理模式的解决方案是: 快递员将包裹交给小区代收点(代理),代收点代替你控制和管理包裹的访问。 代收点可以添加额外…...
局域网:电脑或移动设备作为主机实现局域网访问
电脑作为主机 1. 启用电脑的网络发现、SMB功能 2. 将访问设备开启WIFI或热点,用此电脑连接;或多台设备连接到同一WIFI 3. 此电脑打开命令行窗口,查看电脑本地的IP地址 Win系统:输入"ipconfig",回车后如图 4.…...
图论的基础
E - Replace(判环,破环成链) #include <bits/stdc.h> #include <atcoder/dsu>using namespace std; using namespace atcoder;const int C 26;int main() {int n;cin >> n;string s, t;cin >> s >> t;if (s …...
Jetpack Compose CompositionLocal 深入解析:局部参数透传实践
Jetpack Compose CompositionLocal 深入解析:局部参数透传实践 在 Jetpack Compose 中,如何优雅地在组件之间传递数据,而不需要层层传参? CompositionLocal 就是为了解决这个问题的! 1. 什么是 CompositionLocal&#…...
第十五届蓝桥杯大赛软件赛省赛Python 大学 C 组:3.数字诗意
题目1 数字诗意 在诗人的眼中,数字是生活的韵律,也是诗意的表达。 小蓝,当代顶级诗人与数学家,被赋予了”数学诗人”的美誉。他擅长将冰冷的数字与抽象的诗意相融合,并用优雅的文字将数学之美展现于纸上。 某日&…...
Oracle数据库数据编程SQL<8 文本编辑器Notepad++和UltraEdit(UE)对比>
首先,用户界面方面。Notepad是开源的,界面看起来比较简洁,可能更适合喜欢轻量级工具的用户。而UltraEdit作为商业软件,界面可能更现代化,功能布局更复杂一些。不过,UltraEdit支持更多的主题和自定义选项&am…...
P12013 [Ynoi April Fool‘s Round 2025] 牢夸 Solution
Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1,a2,⋯,an),有 m m m 个操作分两种: add ( l , r , k ) \operatorname{add}(l,r,k) add(l,r,k):对每个 i ∈ [ l , r ] i\in[l,r] i∈[l,r] 执行 …...
PostgreSQL LIKE 操作符详解
PostgreSQL LIKE 操作符详解 引言 在数据库查询中,LIKE 操作符是一种非常常用的字符串匹配工具。它可以帮助我们实现模糊查询,从而提高查询的灵活性。本文将详细介绍 PostgreSQL 中的 LIKE 操作符,包括其语法、使用方法以及一些注意事项。 LIKE 操作符语法 LIKE 操作符通…...
【前端】【Nuxt3】Nuxt3的生命周期
路由导航和中间件执行顺序 路由导航开始 中间件执行顺序: 全局中间件(middleware/*.global.js)布局中间件(在definePageMeta中定义的布局级中间件)页面中间件(在definePageMeta中定义的页面级中间件&#…...
热更新简介+xLua基础调用
什么是冷更新 开发者将测试好的代码,发布到应用商店的审核平台,平台方会进行稳定性及性能测试。测试成功后,用户即可在AppStore看到应用的更新信息,用户点击应用更新后,需要先关闭应用,再进行更新。 什么是…...
大钲资本押注儒拉玛特全球业务,累计交付超2500条自动化生产线儒拉玛特有望重整雄风,我以为它破产倒闭了,担心很多非标兄弟们失业
1. 交易概况 时间与主体:大钲资本于2025年4月1日正式宣布完成对儒拉玛特自动化技术(苏州)有限公司及其全球子公司和关联企业的收购。交易通过大钲资本旗下美元基金设立的儒拉玛特(新加坡)公司作为控股主体进行,交易金额未披露。 收购范围:包括儒拉玛特亚太、欧洲、北美等…...
FPGA系统开发板调试过程不同芯片的移植步骤介绍
目录 1.我目前使用的开发板 2.不同开发板的移植 步骤一:芯片型号设置 步骤二:约束修改 步骤三、IP核更新 关于FPGA系统开发板调试过程中不同芯片的移植。我需要先理清楚FPGA开发中移植到不同芯片的一般流程。首先,移植通常涉及到更换FPG…...
算法设计与分析5(动态规划)
动态规划的基本思想 将一个问题划分为多个不独立的子问题,这些子问题在求解过程中可能会有些数据进行了重复计算。我们可以把计算过的数据保存起来,当下次遇到同样的数据计算时,就可以查表直接得到答案,而不是再次计算 动态规划…...
ModuleNotFoundError: No module named ‘matplotlib_inline‘
ModuleNotFoundError: No module named matplotlib_inline 1. ModuleNotFoundError: No module named matplotlib_inline2. matplotlib-inlineReferences 如果你在普通的 Python 脚本或命令行中运行代码,那么不需要 matplotlib_inline,因为普通的 Python…...
Mysql 中的 B+树 和 B 树在进行数据增删改查后的结构调整过程是怎样的?
B 树的增、删、改、查数据的调整过程 在 MySQL 中,B 树 是一种广泛用于存储引擎(如 InnoDB)中的索引结构。B 树的结构使得它非常适合于处理大量数据的插入、删除和查询等操作。B 树是一种自平衡的树数据结构,其中所有的值都存储在…...
在Rust生态中探索高性能HTTP服务器:Hyperlane初体验
在Rust生态中探索高性能HTTP服务器:Hyperlane初体验 最近在调研Rust的HTTP服务器方案时,发现了一个有趣的新项目——Hyperlane。这个轻量级库宣称在保持简洁API的同时,性能表现可圈可点。作为Rust生态的长期观察者,我决定深入体验…...
AI医疗诊疗系统设计方案
AI医疗诊疗系统设计方案 1. 项目概述 1.1 项目背景 随着人工智能技术的快速发展,将AI技术应用于医疗诊疗领域已成为提升医疗服务效率和质量的重要途径。本系统旨在通过AI技术辅助医生进行诊疗服务,提供智能化的医疗决策支持。 1.2 项目目标 提供全面…...
k8s的StorageClass存储类和pv、pvc、provisioner、物理存储的链路
k8s的StorageClass存储类和pv、pvc、provisioner、物理存储的链路 StorageClass能自动创建pv 在控制器中,直接声明storageClassName,不仅能自动创建pvc,也能自动创建pv stoageclass来自于provisioner,provisioner来自于pod&#x…...
【移动编程技术】作业1 中国现代信息科技发展史、Android 系统概述与程序结构 作业解析
单选题(共 20 题,每题 5 分,满分 100 分) (单选题) 1946 年第一台计算机问世,计算机的发展经历了 4 个时代,它们是()。 选项: A. 模拟计算机、数字计算机、混合计算机、智…...
SQL Server数据库异常-[SqlException (0x80131904): 执行超时已过期] 操作超时问题及数据库日志已满的解决方案
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,获得2024年博客之星荣誉证书,高级开发工程师,数学专业,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开发技术,…...
使用ollama部署本地大模型(没有GPU也可以),实现IDEA和VS Code的git commit自动生成
详情 问豆包,提示词如下:收集下ollama相关信息,包括但不限于:官网地址/GitHub地址/文档地址 官网地址 https://ollama.com/ GitHub 地址 https://github.com/ollama/ollama 文档地址 https://github.com/ollama/ollama/blo…...
线程同步与互斥(上)
上一篇:线程概念与控制https://blog.csdn.net/Small_entreprene/article/details/146704881?sharetypeblogdetail&sharerId146704881&sharereferPC&sharesourceSmall_entreprene&sharefrommp_from_link我们学习了线程的控制及其相关概念之后&#…...
ngx_test_full_name
定义在 src\core\ngx_file.c static ngx_int_t ngx_test_full_name(ngx_str_t *name) { #if (NGX_WIN32)u_char c0, c1;c0 name->data[0];if (name->len < 2) {if (c0 /) {return 2;}return NGX_DECLINED;}c1 name->data[1];if (c1 :) {c0 | 0x20;if ((c0 &…...
R 列表:深入解析及其在数据分析中的应用
R 列表:深入解析及其在数据分析中的应用 引言 在R语言中,列表(List)是一种非常重要的数据结构,它允许将不同类型的数据项组合在一起。列表在数据分析、统计建模以及数据可视化中扮演着关键角色。本文将深入探讨R列表…...
智能体中的知识库、数据库与大模型详解
前言 在 LLM(大语言模型)驱动的智能体架构中,知识库(Knowledge Base)、数据库(Database)和大模型(LLM)是关键组成部分,它们共同决定了智能体的理解能力、决策…...
AMD Versal™ AI Core Series VCK190 Evaluation Kit
AMD Versal™ AI Core Series VCK190 Evaluation Kit AMD VCK190 是首款 Versal™ AI Core 系列评估套件,可帮助设计人员使用 AI 和 DSP 引擎开发解决方案,与当前的服务器级 CPU 相比,该引擎能够提供超过 100 倍的计算性能。Versal AI Core …...
ARM-外部中断,ADC模数转换器
根据您提供的图片,我们可以看到一个S3C2440微控制器的中断处理流程图。这个流程图展示了从中断请求源到CPU的整个中断处理过程。以下是流程图中各个部分与您提供的寄存器之间的关系: 请求源(带sub寄存器): 这些是具体的…...
【从零实现Json-Rpc框架】- 项目实现 - 客户端注册主题整合 及 rpc流程示意
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
AWS 云运维管理指南
一、总体目标 高可用性:通过跨可用区 (AZ) 和跨区域 (Region) 的架构设计,确保系统运行可靠。性能优化:优化AWS资源使用,提升应用性能。安全合规:利用AWS内置安全服务,满足行业合规要求(如GDPR、ISO 27001、等保2.0)。成本管控:通过成本优化工具,减少浪费,实现FinOp…...
vector的实现:
我们之前讲了vector的接口,我们今天来看一下vector的底层的实现: 在gitee上面我们的这个已经实现好了,我们看gitee就可以:vector的实现/vector的实现/vector的实现.h 拾亿天歌/拾亿天歌 - 码云 - 开源中国 我们在这强调比较难的…...
flutter 专题 九十六 Flutter开发之常用Widgets
上一篇,我们介绍了基础Widgets,接下来,我们看一下Flutter开发中一些比较常见的Widget。 Flutter Widget采用现代响应式框架构建,这是从 React 中获得的灵感,中心思想是用widget构建你的UI。 Widget描述了他们的视图在…...
Linux环境下内存错误问题排查与修复
最近这几天服务器总是掉线,要查一下服务器的问题。可以首先查看一下计算机硬件,这是一台某鱼上拼凑的服务器: sudo lshw -shortH/W path Device Class Description system NF5270M3 (To be filled by O…...
flutter 专题 六十八 Flutter 多图片上传
使用Flutter进行应用开发时,经常会遇到选图、拍照等需求。如果要求不高,Flutter图库选择可以使用官方提供的image_picker,如果需要多选,那么可以使用multi_image_picker插件库。multi_image_picker库支持图库管理,多选…...
与总社团联合会合作啦
2025.4.2日,我社团向总社团联合会与暮光社团发起合作研究“浔川代码编辑器v2.0”。至3日,我社团收到回复: 总社团联合会: 总社团联合会已收到浔川社团官方联合会的申请,经考虑,我们同意与浔川社团官方联合…...
技巧:使用 ssh 设置隧道代理访问 github
问题 由于不可知的原因,在国内服务器不能访问 Github。但是有clone代码需求,这里介绍一种可行的方法。 解决办法 使用 ssh 设置代理,让代理服务器请求 github 解决。 第一步 ssh -fND 1080 用户名代理服务器IP这里的意思是监听 1080 端口…...
安装 TabbyAPI+Exllamav2 和 vLLM 的详细步骤
在 5090 显卡上成功安装 TabbyAPIExllamav2 和 vLLM 并非易事,经过一番摸索,我总结了以下详细步骤,希望能帮助大家少走弯路。 重要提示: 用户提供的 PyTorch 安装使用了 cu128,这并非标准 CUDA 版本。请根据你的系统实…...
Linux 进程信号
目录 信号 生活角度的信号 技术应用角度的信号 signal函数 信号概念 用kill -l命令可以察看系统定义的信号列表 信号处理常见方式概览 信号的产生 通过键盘组合键发送信号 通过系统函数向进程发信号 由软件条件产生信号 由硬件异常产生信号 信号的保存 阻塞信号 …...
【学习篇】fastapi接口定义学习
fastapi学习链接:用户指南 1. 路径参数 访问fastapi接口的默认http路径为http://127.0.0.1:8000,/items为定义的接口函数read_item的路径,/{item_id}这个用大括号括起来的参数就是路径参数,接口函数可以通过引用这个路径参数名称…...
第十二步:react
React 1、安装 1、脚手架 npm i -g create-react-app:安装react官方脚手架create-react-app 项目名称:初始化项目 2、包简介 react:react框架的核心react-dom:react视图渲染核心react-native:构建和渲染App的核心…...
MySQL简介
MySQL 是由瑞典 MySQL AB 公司开发的一款开源关系型数据库管理系统(RDBMS),现归属 Oracle 公司。以下是其核心特点及简介: 1. 基础特性 - 开源免费:遵循 GPL 协议,个人及中小型企业可免费使用,…...
AIGC时代Kubernetes企业级云原生运维实战:智能重构与深度实践指南
文章目录 一、AIGC技术栈与Kubernetes的深度融合1. 智能配置生成:从YAML到自然语言2. 动态资源优化:AI驱动的弹性伸缩 二、智能运维体系架构深度解析四维能力矩阵增强实现:关键组件升级代码示例: 三、企业级实战策略深度实践策略1…...