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

【vue3学习P5-P10】vue3语法;vue响应式实现

0、vue2和vue3对比

框架版本API方式双向绑定原理domFragmentsTree-Shaking
vue2选项式API(Options API)基于Object.defineProperty(监听)实现,不能双向绑定对象类型的数据【通过Object.defineProperty里面的set和get做对象劫持,在处理数组等对象类型数据时,则是重写原型方法(push、pop等方法可以被监听)】每次更新diff,都是全量对比<template>标签里面只能有一个根节点<div>标签import语法引用组件:import xxx from xxx
vue3组合式API(Composition API)基于Proxy(劫持)实现,能够双向绑定对象类型的数据只对比有标记的,对标记部分进行更新(大大减少静态内容的对比消耗,动态内容是{{}}双向绑定的内容)<template>标签里面支持多个根节点<div>标签(实现原理:通过虚拟节点实现)import语法引用组件时,将全局API分块,不使用的功能不会出现在基础包中,减少打包体积:import {aaa} from xxx
0.1 vue3新特性:
  • 重写双向数据绑定
  • VDOM性能瓶颈
  • Fragments:增加了Suspense teleport和多v-model用法
  • Tree-Shaking的支持:在保持代码运行结果不变的情况下,去除无用的代码
  • 组合式API(Composition API)
  • setup语法糖
0.2 vue3的三种书写风格
  • Options API
  • setup
  • setup 语法糖
// 第一种书写风格:Options API
<template>
</template><script>
export default{data() {return{// 数据}},methods: {}
}
</script><style>
</style>// 第二种书写风格setup
<template><div>{{a}}</div>
</template><script>
setup() {const a = 1// 变量需要手动return才能在dom中使用return{a}
}
</script><style>
</style>// 第三种书写风格setup语法糖(后+lang选择使用是js语言)
<template><div>{{a}}</div>
</template><script setup lang="ts">
const a:number = 1
</script><style>
</style>

1、vue语法

vue语法:

  • 插值语法:{{}}
  • 指令语法:v-
1.1 插值语法
<template><div><p>{{data}}</p></div>
</template><script setup lang="ts">
const data = {name: '张三',age: 30,like: '吃饭'
}
</script><style scoped>
</style>
1.2 vue指令

v-开头的都是vue内置指令
v-text 用来显示文本
v-html 用来展示富文本(支持标签,如<span>xxx</span>,不支持组件,如<组件名>xxx</组件名>
v-if 用来控制元素的显示隐藏(切换真假DOM,false时注释掉dom节点)
v-else-if 表示 v-if 的v-else-if 可以链式调用
v-else v-if条件收尾语句
v-show 用来控制元素的显示隐藏(false时将节点设置不可见,display:none block Css切换,性能比v-if高)
v-on 简写@ 用来给元素添加/绑定事件v-on:click语法糖简写@click
v-bind 简写:用来绑定元素的属性Attr(v-bind:id语法糖简写:id
v-model 双向绑定
v-for 用来遍历元素
v-on 修饰符 冒泡案例
v-once 性能优化只渲染一次
v-memo 性能优化会有缓存

1.2.1 点击事件:动态事件类型切换
// 动态事件切换
<template>// 静态事件<button @click="clickBtn">按钮点击</button>// 动态事件(动态事件切换)<button @[event]="clickBtn">按钮点击</button></template><script>
// const event = "click" // @[event]等于@click
const event = "doubleClick" // @[event]等于@doubleClick
const clickBtn = ()=>{console.log("点击按钮了……")
}
</script>
1.2.2 点击事件:阻止点击冒泡

点击冒泡:当父级节点和子级节点都有点击事件时,点击子级节点也会触发父级节点的点击事件

// 动态事件切换
<template><div @click="parentClick"><button @[event].stop="clickBtn">按钮点击</button></div>
</template><script>
const parentClick = ()=>{console.log("点击了父级")
}
// const event = "click" // @[event]等于@click
const event = "doubleClick" // @[event]等于@doubleClick
const clickBtn = ()=>{console.log("点击按钮了……")
}
</script>

在这里插入图片描述

属性作用
@[event].stop阻止点击冒泡(触发父级节点的点击事件),但是:对单击事件有效,对双击事件无效
@[event].prevent阻止提交表单
@[event].once只触发一次,后面再点击多少次都不会触发
@[event].capture
@[event].middle
@[event].left
@[event].right
@[event].passive
@[event].self
1.2.3 v-bind 绑定元素属性

绑定id、class、style……

<template><div :id="id"><p :style="style">段落段落段落</p><button :class="['a', 'b']" @click.middle="clickBtn()">1按钮</button><button :class="['a']" @[event].passive="clickBtn()">2按钮</button></div>
</template><script setup>
// 事件
const event = "click" // @[event]等于@click
const clickBtn = ()=>{console.log("点击按钮了……")
}// 属性
const id = "myid"
const style = {color: 'green',border: '1px solid green'
}
</script><style scoped>
#myid{background-color: #ccc;
}
.a{background-color: blue;
}
.b{color: red;
}
</style>
1.2.4 v-model 绑定表单元素(ref,响应式,双向绑定)

响应式的数据:双向绑定(通过ref和reactive)
v-model can only be used on <input>, <textarea> and <select> elements.

<template><div><input v-model="data" type="text"/><p>{{data}}</p></div>
</template><script setup>
import {ref} from 'vue'// 双向绑定(通过ref和reactive)
const data = ref('测试内容')
</script><style scoped>
</style>

在这里插入图片描述
在这里插入图片描述

1.2.5 v-once 单次渲染【基本数据类型】(待完善)

v-once:仅渲染元素和组件一次,并跳过之后的更新
在随后的重新渲染,元素/组件及其所有子项将被当作静态内容并跳过染。这可以用来优化更新时的性能

<template><div><!-- 基本数据类型 --><input v-model="msg" type="text"/><!-- 对照组 --><p>对照组 {{msg}}</p><hr /><!-- v-once 实验组 --><!-- 单个元素 --><p v-once>This will never change:{{msg}}</p><!-- 带有子元素的元素 --><div v-once><h1>comment</h1><p>{{msg}}</p></div><!-- 待完善 --><!-- 组件 --><!-- <A v-once :comment="msg" /> --><!-- v-for指令 --><ul><li v-for="i in list" v-once>{{i}}</li></ul></div>
</template><script setup lang="ts">
import {ref} from 'vue'
// import A from 'A.vue' // 报错
// import B from 'B.vue'const msg = ref('测试内容')
const list:string[] = ['春', '夏', '秋', '东']
</script><style scoped>
</style>

在这里插入图片描述
在这里插入图片描述

1.2.6 v-memo 单次渲染【数组】(待完善)
<template><div><!-- v-memo 处理对象数据类型 --><!-- v-for指令 --><p v-for="(item, index) in list">对照组 {{index}}--{{item}}</p><hr /><p v-for="(item, index) in list" v-memo="index == 2">v-memo组 {{index}}--{{item}}</p><!-- 组件 --><!-- <A v-once :comment="msg" /> --></div>
</template><script setup lang="ts">
import {ref, computed} from 'vue'
// import A from 'A.vue'
// import B from 'B.vue'const msg = ref('测试内容')
let list = ref(['春', '夏', '秋', '冬'])// 模拟异步更新
// 定时刷新数据函数-----------还没有写出来,报错
const timer = ref(0)
const index = ref(0)
let count = 1
let list = computed({get() {},set(newVal) {console.log("count: ", count++)list = ['赵', '钱', '孙', '李']console.log(list)}
})
// setTimeout(changeData, 3000)
// setTimeout(changeData, 3000)
// setTimeout(changeData, 3000)
// setInterval(changeData, 3000)</script><style scoped>
</style>
1.2.7 v-for 遍历
<template><div><input v-for="(item, index) in data" type="text" value="item"/><p :key="index" v-for="(item, index) in data">{{index}}--{{item}}</p></div>
</template><script setup lang="ts">
import {ref} from 'vue'const data:string[] = ['春', '夏', '秋', '东']
</script><style scoped>
</style>

在这里插入图片描述
从生成的dom结构来看,使用v-for的标签效果是:循环生成多个完整标签内容(标签+样式+数据),而不仅仅是生成“一个完整标签+多条数据”

2、虚拟dom和diff算法

虚拟DOM就是通过JS来生成一个AST节点树(抽象语法树)

vue3的diff算法:分为三类

  • 无key(三步)
    在这里插入图片描述
  • 有key(五步)
  • 在这里插入图片描述
  • 前序+尾序
  • 乱序(最长递增子序列)
  • 在这里插入图片描述
    在这里插入图片描述

3、Ref 全家桶

  • ref:深层次响应式
  • shallowRef:浅层次响应式
  • isRef:判断是否是ref对象,返回值true或false
  • triggerRef:强制视图更新
  • customRef:自定义ref
3.1 响应式:ref 、shallowRef、triggerRef 或 reactive

(1)非响应式:修改data之后,页面数据不更新

<template><div><p>{{data}}</p><button @click="clickBtn()">修改</button></div>
</template><script setup lang="ts">
let data = {name: "张三"}
const clickBtn = ()=>{data.name = "李四"console.log(data)
}
</script>

在这里插入图片描述
(2)响应式(利用ref双向绑定):修改data之后,页面数据也更新

<template><div><p>{{data}}</p><button @click="clickBtn()">修改</button></div>
</template><script setup lang="ts">
import {ref} from 'vue'	
let data = ref({name: "张三"}) // 使用ref
const clickBtn = ()=>{data.value.name = "李四" // 通过value更新console.log(data)
}
</script>

编辑器报错,但能用(不知道HBuilderX为什么报错,B站老师的vscode就没有报错)
在这里插入图片描述
在这里插入图片描述
(3)响应式:shallowRef

<template><div><p>{{data1}}</p><p>{{data2}}</p><button @click="clickBtn1()">修改(Ref)</button><button @click="clickBtn2()">修改(shallowRef)</button></div>
</template><script setup lang="ts">
import {ref} from 'vue'let data1 = ref({name: "张三"})
let data2 = ref({name: "张三三"})
const clickBtn1 = ()=>{data1.value.name = "李四" // value.name = console.log(data1)
}
const clickBtn2 = ()=>{data2.value = {name: "李四四"} // value = console.log(data2)
}
</script>
3.2 ref、shallowRef、triggerRef

ref、shallowRef 不能同时使用(在一个事件中),shallowRef 会被影响,即使写成xxx.value.name=xxx也会被改变,造成页面(视图)的更新
在这里插入图片描述
triggerRef 强制更新,shallowRef 会被影响,由于 ref 底层调用了 triggerRef,所以 ref、shallowRef 同时使用时 shallowRef 会被影响
在这里插入图片描述

3.3 customRef(自定义ref)
<template><div><p>customRef: {{obj}}</p><button @click="clickBtn()">修改</button></div>
</template><script setup lang="ts">
import {customRef} from 'vue'function MyRef(value){let timer = nullreturn customRef((track,trigger)=>{return{get(){track()return value},set(newValue){// 不防抖,每次点击clickBtn都会触发(然而实际上只更新一次,因为clickBtn中修改每次都是同一个值,并不是变化的)// console.log("触发了")// value = newValue// trigger()// 防抖clearTimeout(timer)timer = setTimeout(()=>{console.log("触发了")value = newValuetimer = nulltrigger()}, 3000)}}})
}const obj = MyRef("王五")const clickBtn = ()=>{obj.value = "修改了"console.log(obj)
}
</script>

在这里插入图片描述

3.5 reactive【绑定表单场景中使用较多(?)】

ref、reactive 区别:

  • ref 支持所有数据类型,reactive 支持引用类型数据Array、Object、Map、Set)
  • ref 取值、赋值都需要加上.value,reactive 不用

基础版例子

<template><div><p>reactive: {{form}}</p><button @click="clickBtn()">修改</button></div>
</template><script setup lang="ts">
import {reactive} from 'vue'type M = {name: string,age: number
}
let form = reactive<M>({name: "张三",age: 30
})const clickBtn = ()=>{form.name = "李四"form.age = 31console.log(form)
}
</script>

在这里插入图片描述
reactive 绑定数组,响应式更新视图

<template><div><ul><li v-for="item in list">{{item}}</li></ul><button @click="clickBtn()">添加</button></div>
</template><script setup lang="ts">
import {reactive} from 'vue'// let list = [] // 非响应式,不会更新视图
let list = reactive([]) // 响应式,动态更新视图
// let list = reactive<string []>([]) // 添加泛型(字符串数组类型)const clickBtn = ()=>{list.push("item")console.log(list)
}
</script>

在这里插入图片描述
异步请求场景模拟,不破坏响应式的数据更新方式示例。解决方案:数组+push+解构

<template><div><ul><li v-for="item in list">{{item}}</li></ul><button @click="clickBtn()">添加</button></div>
</template><script setup lang="ts">
import {reactive} from 'vue'// let list = [] // 非响应式,不会更新视图
let list = reactive([]) // 响应式,动态更新视图
// let list = reactive<string []>([]) // 添加泛型(字符串数组类型)// 模拟异步请求,更新数据
const clickBtn = ()=>{setTimeout(()=>{const res = ['one', 'two', 'three'] // 模拟后端返回数据// list = res // 这样赋值,list数据能更新,但是页面视图不会更新// 因为reactive是Proxy代理的对象,直接赋值会覆盖代理对象,破坏响应式方案// 解决方案list.push(...res) // 数组解构console.log(list)}, 300)
}
</script>

在这里插入图片描述
解决方案二:对象+数组作为对象的一个属性+直接修改对象的数组属性

<template><div><ul><li v-for="item in list.arr">{{item}}</li></ul><button @click="clickBtn()">添加</button></div>
</template><script setup lang="ts">
import {reactive} from 'vue'// 对象+
let list = reactive<{arr:string[]}>({arr: []
}) // 响应式,动态更新视图// 模拟异步请求,更新数据
const clickBtn = ()=>{setTimeout(()=>{const res = ['one', 'two', 'three'] // 模拟后端返回数据// list = res // 这样赋值,list数据能更新,但是页面视图不会更新// 因为reactive是Proxy代理的对象,直接赋值会覆盖代理对象,破坏响应式方案// 解决方案list.arr = resconsole.log(list)}, 300)
}
</script>

在这里插入图片描述

3.6 readonly

把 reactive 的值变成只读
但是 readonly 会受原始变量更新的影响

<script setup lang="ts">
import {reactive} from 'vue'let obj = reactive({name: '张三'})
let obj_read = readonly(obj)
// 不能修改只读属性的值
obj_read.name = '李四' // 编译报错:obj_read 是只读属性
// 能修改原始变量的值
obj.name = '李四'
// 这里,打印 obj、obj_read,发现都会变成'李四'(readonly 会受原始变量更新的影响)
</script>

在这里插入图片描述

3.7 shallowReactive
<template><div><p>{{obj}}</p><button @click="clickBtn()">修改</button></div>
</template><script setup lang="ts">
import {reactive, shallowReactive} from 'vue'let obj:any = shallowReactive({foo: { // 外层bar: { // 二层name: '张三' // 三层}}
})
const clickBtn = ()=>{console.log("点击了")// 修改外层【正确修改】obj.foo = {barChange: '李四'}// 【错误修改】// 修改二层// obj.foo.bar = {// 	nameChange: '赵六' // 非响应式// }// obj.foo.bar.value = {// 	nameChange: '赵六' // 追加元素// }// 修改最内层(三层)// obj.foo.bar.name = '李四' // 非响应式,页面视图不更新// 修改obj// obj = { // 非响应式,页面视图不更新// 	fooChange: '王五'// }// obj.value = { // 响应式;相当于追加一个元素:value:{fooChange: '王五'}// 	fooChange: '王五'// }// console.log(obj)
}
</script><style scoped>
</style>

修改外层【正确修改】:
在这里插入图片描述
修改二层、三层都是非响应式:
在这里插入图片描述

修改obj:
在这里插入图片描述

3.8 shallowRef、shallowReactive

相同:shallowReactive 也是浅层次响应式,与 shallowRef 会被 ref 影响相同,shallowReactive 也会被 reactive 影响
区别:
shallowRef 实现响应式需要通过.value修改数据,shallowReactive 不需要

// shallowRef
let data = ref({name: "张三"})
const clickBtn1 = ()=>{data.value.name = "李四" // 方式一 value.name = data.value = {name: "李四四"} // 方式二 value = console.log(data)
}// shallowReactive
let obj:any = shallowReactive({foo: { // 外层bar: { // 二层name: '张三' // 三层}}
})
const clickBtn1 = ()=>{obj.foo = {barChange: '李四'}
}

4、to 全家桶

  • toRef:将普通数据转成ref对象(响应式),然后响应式修改对象的值(转成ref对象,修改值需要加.value)。只能修改响应式对象的值。非响应式对象的data会改变,但是视图不会改变。接收参数:toRef(对象名, 对象属性)
  • toRefs:批量将数据转成ref对象(响应式),然后响应式修改对象的值
  • toRaw:与toRef相反,将ref对象转成普通对象/普通类型数据,脱离Proxy代理(Proxy实现双向绑定/响应式,脱离Proxy即非响应式)。只想修改数据、不想更新视图的时候可以用toRaw
// toRef 实现响应式修改数据的值
// 转成ref对象
const like = toRef(person, 'like') // 接收参数:toRef(对象名, 对象属性)
// 响应式修改
like.value = '运动' // like是一个ref对象,所以修改值需要加.value// toRefs
const person = reactive({name: '张三',age: 30,like: '吃饭'
})
// 接收参数:对象名;返回值:对象内的所有属性名
const {name, age, like} = toRefs(person) // 解构取值
// 响应式修改
name.value = '李四'
age.value = 31
like.value = '运动'

完整例子
toRef 的例子

<template><div><p>{{person}}</p><button @click="clickBtn()">修改</button></div>
</template><script setup lang="ts">
import {reactive, toRef} from 'vue'const person = reactive({ // 实现对象类型数据的响应式,可以直接使用reactive(reactive实现对象类型数据的响应式,ref实现所有类型数据的响应式)name: '张三',age: 30,like: '吃饭'
})
const clickBtn = ()=>{const like = toRef(person, 'like') // 接收参数:toRef(对象名, 对象属性)like.value = '运动' // like是一个ref对象,所以修改值需要加.valueconsole.log('like:',like)console.log('person:',person)
}
</script>

在这里插入图片描述
toRefs 的例子

<template><div><p>{{person}}</p><button @click="clickBtn()">修改</button></div>
</template><script setup lang="ts">
import {reactive, toRef, toRefs} from 'vue'const person = reactive({name: '张三',age: 30,like: '吃饭'
})
// toRefs实现原理:批量转成ref对象
// const toRefs = <T extends object>(object:T)=>{
// 	const map:any = {}
// 	for(let key in object){
// 		map[key] = toRef(object, key) // 将对象object中的属性key转成ref对象
// 	}
// 	return map // 将object内所有属性转成ref并返回
// }const clickBtn = ()=>{const {name, age, like} = toRefs(person) // 接收参数:对象名;返回值:对象内的所有属性名name.value = '李四'age.value = 31like.value = '运动'console.log('person:',person)
}
</script><style scoped>
</style>

在这里插入图片描述

【补充】ts泛型

<script setup lang="ts">
import {ref} from 'vue'	
import type {Ref} from 'vue' // 添加泛型(方式2)type Data = {name: string
}
let data1 = ref<Data>({name: "张三"}) // 添加泛型(方式1)
let data2:Ref<Data> = ref({name: "张三"}) // 添加泛型(方式2)当类型比较复杂的时候推荐使用
</script>

相关文章:

【vue3学习P5-P10】vue3语法;vue响应式实现

0、vue2和vue3对比 框架版本API方式双向绑定原理domFragmentsTree-Shakingvue2选项式API&#xff08;Options API&#xff09;基于Object.defineProperty&#xff08;监听&#xff09;实现&#xff0c;不能双向绑定对象类型的数据【通过Object.defineProperty里面的set和get做…...

相机图像质量研究(3)图像质量测试介绍

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…...

PaddleDetection学习5——使用Paddle-Lite在 Android 上实现实时的人脸检测(C++)

使用Paddle-Lite在 Android 上实现实时的人脸检测 1 环境准备2. 部署步骤2.1 下载Paddle-Lite-Demo2.2 运行face_detection_demo项目3 使用Opencv对后处理进行优化4 开启手机摄像头进行人脸检测1 环境准备 参考前一篇在 Android 上使用Paddle-Lite实现实时的目标检测功能 2. …...

全套电气自动化样例图纸分享,使用SuperWorks自动化版免费设计软件!

今天给大家分享一套完备的电气自动化样例图纸&#xff0c;结构准确、内容清晰&#xff0c;适合初学者入门操作练习。 整套图纸包含图纸目录、原理图、端子列表、连接列表、元件列表、接线图&#xff0c;具有较高的参考价值&#xff0c;请大家点击自行下载文件&#xff01; 1e8…...

带你实现用自己域名打开Tomcat

文章目录 Tomcat1.1、Tomcat 下载1.2、Tomcat 文件图解1.3、 启动或关闭 Tomcat1.3.1、 启动1.3.2、 关闭程序2.1、 修改端口号2.2、修改主机名称Tomcat 1.1、Tomcat 下载 首先去Tomcat 官网下载找到我们需要下载的版本 1.2、To...

python coding with ChatGPT 打卡第18天| 二叉树:从中序与后序遍历序列构造二叉树、最大二叉树

相关推荐 python coding with ChatGPT 打卡第12天| 二叉树&#xff1a;理论基础 python coding with ChatGPT 打卡第13天| 二叉树的深度优先遍历 python coding with ChatGPT 打卡第14天| 二叉树的广度优先遍历 python coding with ChatGPT 打卡第15天| 二叉树&#xff1a;翻转…...

java基础训练题(1)

1.下列代码段中&#xff0c;存在编译错误的语句是(B C D) byte b1 1,b2 2,b3,b6,b8; final byte b4 4,b5 6,b7; b3 (b1 b2);/*语句1*/ b6 b4 b5 ; /*语句2*/ b8 (b1 b4);/*语句3*/ b7 (b2 b5);/*语句4*/ System.out.println(b3 b6);A: 语句2 B: 语句1 C: 语句3…...

【自定义序列化器】⭐️通过继承JsonSerializer和实现WebMvcConfigurer类完成自定义序列化

目录 前言 解决方案 具体实现 一、自定义序列化器 二、两种方式指定作用域 1、注解 JsonSerialize() 2、实现自定义全局配置 WebMvcConfigurer 三、拓展 WebMvcConfigurer接口 章末 前言 小伙伴们大家好&#xff0c;上次做了自定义对象属性拷贝&#x…...

闲聊电脑(5)装个 Windows(一)

​夜深人静&#xff0c;万籁俱寂&#xff0c;老郭趴在电脑桌上打盹&#xff0c;桌子上的小黄鸭和桌子旁的冰箱又开始窃窃私语…… 小黄鸭&#xff1a;冰箱大哥&#xff0c;上次说到硬盘分区和格式化&#xff0c;弄完之后&#xff0c;就该装系统了吧&#xff1f; 冰箱&#x…...

力扣(leetcode)第414题第三大的数(Python)

414.第三大的数 题目链接&#xff1a;414.第三大的数 给你一个非空数组&#xff0c;返回此数组中 第三大的数 。如果不存在&#xff0c;则返回数组中最大的数。 示例 1&#xff1a; 输入&#xff1a;[3, 2, 1] 输出&#xff1a;1 解释&#xff1a;第三大的数是 1 。 示例 2&a…...

使用wda框架实现IOS自动化测试详解

目录 1、weditor元素定位工具 1.1、weditor的安装和使用 2、wda iOS自动化框架 2.1、wda概述 2.2、wda安装 2.3、wda的使用 2.3.1、全局配置 2.3.2、创建客户端 2.3.3、APP相关操作 1、启动APP 2、关闭APP 3、获取APP状态信息 4、获取当前APP的运行信息 2.3.4、设…...

LeetCode--代码详解 2.两数相加

2.两数相加 题目 难度&#xff1a;中等 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数…...

【Django开发】美多商城项目第3篇:用户注册和图片验证码开发(附代码,文档已分享)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论django商城项目开发相关知识。本项目利用Django框架开发一套前后端不分离的商城项目&#xff08;4.0版本&#xff09;含代码和文档。功能包括前后端不分离&#xff0c;方便SEO。采用Django Jinja2模板引擎 Vue.js实现…...

代码随想录算法训练营DAY10 | 栈与队列 (1)

理论基础及Java实现参考文章&#xff1a;栈和队列 一、LeetCode 232 用栈实现队列 题目链接&#xff1a;232.用栈实现队列https://leetcode.cn/problems/implement-queue-using-stacks/ 思路&#xff1a;使用两个栈stack1、stack2实现队列&#xff1b;stack1用来存储入队元素&…...

flinkjar开发 自定义函数

编写自定义加密函数&#xff0c;继承ScalarFunction类&#xff0c;实现eval方法&#xff0c;参数个数类型和返回值根据业务来自定义。 import org.apache.flink.table.functions.ScalarFunction; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax…...

Golang 学习(一)基础知识

面向对象 Golang 也支持面向对象编程(OOP)&#xff0c;但是和传统的面向对象编程有区别&#xff0c;并不是纯粹的面向对象语言。 Golang 没有类(class)&#xff0c;Go 语言的结构体(struct)和其它编程语言的类(class)有同等的地位&#xff0c;Golang 是基于 struct 来实现 OOP…...

C++学习:string的了解

1.string的介绍 #include<string> 对于字符串的操作 自动处理内存的分配和释放 2.string的声明与初始化 1.std::string str1;空的 2.string str2 "afhsihsa" 3.string str3 str2 4.string str3 str2.substr(0,5) .substr(位置&#xff0c;长度) 5.c…...

Webpack源码浅析

webpack启动方式 webpack有两种启动方式&#xff1a; 通过webpack-cli脚手架来启动&#xff0c;即可以在Terminal终端直接运行&#xff1b; webpack ./debug/index.js --config ./debug/webpack.config.js通过require(webpack)引入包的方式执行&#xff1b;其实第一种方式最终…...

Hadoop:HDFS学习巩固——基础习题及编程实战

一 HDFS 选择题 1.对HDFS通信协议的理解错误的是&#xff1f; A.客户端与数据节点的交互是通过RPC&#xff08;Remote Procedure Call&#xff09;来实现的 B.HDFS通信协议都是构建在IoT协议基础之上的 C.名称节点和数据节点之间则使用数据节点协议进行交互 D.客户端通过一…...

SASS 官方文档速通

前言&#xff1a;参考 Sass 中文网。 一. 特色功能 Sass 是一款强化 CSS 的辅助工具&#xff0c;在 CSS 语法的基础上增加了变量、嵌套、混合、导入等高级功能。有助于组织管理样式文件&#xff0c;更高效地开发项目。 二. 语法格式 .scss 拓展名&#xff1a;在 CSS3 语法的基…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...