【Vue-组件】学习笔记
目录
- <<回到导览
- 组件
- 1.项目
- 1.1.Vue Cli
- 1.2.项目目录
- 1.3.运行流程
- 1.4.组件的组成
- 1.5.注意事项
- 2.组件
- 2.1.组件注册
- 2.2.scoped样式冲突
- 2.3.data是一个函数
- 2.4.props详解
- 2.5.data和prop的区别
- 3.组件通信
- 3.1.父子通信
- 3.1.1.父传子(props)
- 3.1.2.子传父($emit)
- 3.2.非父子通信
- 3.2.1.事件总线
- 3.2.2.provide-inject
- 3.3.v-model详解
- 3.4.sync修饰符(已废弃)
- 3.5.(重点)ref和$refs
- 3.6.ref和$refs选择器
- 3.7.$nextTick
- 4.自定义指令
- 4.1.指令的值
- 4.2.封装v-loading指令
- 5.插槽
- 5.1默认插槽
- 5.2.后备内容
- 5.3.具名插槽
- 5.4.作用域插槽
- 6.my-tag组件封装
<<回到导览
组件
1.项目
1.1.Vue Cli
官方提供的一个全局命令工具
,可以快速生成vue项目的标准化基础架子(集成webpack),开箱即用
使用步骤:
-
全局安装(安装一次即可):
yarn global add @vue/cli// 或者 npm i @vue/cli -g
-
查看vue/cli版本:
vue --version
-
创建项目架子:
vue create project-name
-
启动项目:
yarn serve// 或者npm run serve
启动项目的命令并不固定,其取决于package.json文件
1.2.项目目录
-
第三包文件夹(依赖)被删除,只要package.json还存在,就可以安装回来
npm i --force
或者npm i --legacy-peer-deps
1.3.运行流程
1.4.组件的组成
- 语法高亮插件
-
三部分构成
- template:结构 (有且只能一个根元素),在template中,最外层标签只能为div盒子
- script: js逻辑
- style: 样式 (可支持less,需要装包)
-
让组件支持less
- style标签,lang=“less” 开启less功能
- 装包:
yarn add less less-loader -D // 或者 npm i less less-loader -D
1.5.注意事项
-
在组件的template中,最外面必须有一个div盒子
-
组件名称最好采用大驼峰命名法,且至少两个驼峰
-
有时候有些错误改正后依旧报错(列如上面第二个报错),重新启动项目即可
-
启动项目时在项目的根目录下启动(我们项目根目录叫luyou)
2.组件
2.1.组件注册
-
局部注册
-
在components文件夹创建组件 xxx.vue
-
在根组件App.vue导入
// 导入组件 // import xxx from 'xxx.vue的文件路径' import HmHeader from './components/HmHeader'export default{// 局部注册components:{// '组件名':组件对象,// HmHeader:HmHeader 同名可简写HmHeader} }
-
-
全局注册
-
在components文件夹创建组件 xxx.vue
-
在main.js进行全局注册
// 导入组件 // import xxx from 'xxx.vue的文件路径' import HmHeader from './components/HmHeader'// 调用Vue.component进行全局注册 // Vue.component('组件名',组件对象) Vue.component('HmHeader',HmHeader)
一般都用局部注册,如果发现是通用组件,再注册为全局
-
2.2.scoped样式冲突
-
默认组件中的样式会全局生效
-
可以给组件加上scoped属性,可以让样式只作用于当前组件
<style scoped></style>
scoped的原理:
- 组件被都添加 data-v-hash (添加自定义属性)
- css选择器添加 [data-v-hash] (添加自定义属性的属性选择器)
2.3.data是一个函数
在最开始的vue基本语法学习中,data被写为data: {},
键值(值为对象,对象又嵌套键值数据)
但在组件开发中,data选项必须是一个函数
data(){return {// 数据}
}
-
这是因为组件具有复用性,在同一个组件的复用过程中,data里的数据应该不一样,且数据不相互影响
-
将data设置为一个函数,将数据写进return返回值中,每次创建组件都会调用data函数,返回一个独立数据对象,这些独立的对象分别用于保存同一组件的不同次使用的数据。
2.4.props详解
-
定义:在组件使用时,注册的一些
自定义属性
-
作用:向子组件传递数据
-
示例:
export default {props: ['w'], }
在为子组件传递数据时,我们应该为组件的 prop 指定验证要求
props: {校验的属性名: {type: 类型, // Number String Boolean ...required: true, // 是否必填default: 默认值, // 默认值validator (value) {// 自定义校验逻辑return 是否通过校验}} },
- default和required一般不同时写
- default后面如果是复杂类型,则需要以函数的形式return一个默认值
示例:
props: {w: {type: Number,//required: true,default: 0,validator(val) {if (val >= 100 || val <= 0) {console.error('传入的范围必须是0-100之间')return false} else {return true}},},},
2.5.data和prop的区别
- data 的数据是自己的 → 随便改
- prop 的数据是外部的 → 不能直接改,要遵循 单向数据流
单向数据流
:父级props 的数据更新,会向下流动,影响子组件。这个数据流动是单向的
3.组件通信
上面讲到,data是一个函数,同一组件的不同的使用之间数据独立,同样,不同组件之间数据也不共享
3.1.父子通信
3.1.1.父传子(props)
-
父组件通过 props 将数据传递给子组件
-
在父组件中的子组件标签添加动态属性(App.vue)
<MySon :title="say"></MySon>
-
子组件通过props进行接收
export default {data() {return {};},props: ["title"], };
-
3.1.2.子传父($emit)
-
子组件利用 $emit 通知父组件修改更新
-
给父组件元素添加事件和处理方法
<button @click="changeFn">say</button>
changeFn() {// change为后面为子组件添加的事件名// "Hello"为要修改的值,也就是后面的形参newSay// 并不一定要传字符串,也可以将"Hello"改为变量传递this.$emit("change", "Hello"); },
-
触发事件后,利用$emit将父组件发送改变数据的通知
-
在父组件中的子组件标签添加事件,调用修改属性的方法
<MySon :title="say" @change="changeFn"></MySon>
// 形参newSay为传递过来的值"Hello" changeFn(newSay) {this.say = newSay; },
-
3.2.非父子通信
3.2.1.事件总线
概念:创建创建一个都能访问的事件总线,发送方向事件总线发送,
接收方向事件总线发送监听
-
在src文件夹下创建一个utils文件夹,在该文件夹下创建一个js文件
-
创建一个空Vue实例(事件总线)
import Vue from 'vue' const Bus = new Vue() export default Bus
-
接受方和发送方都将数据总线引入
import Bus from '../utils/EventBus'
-
A组件(发送方),触发Bus的$emit事件
// 'sendMsg为发送的数据的标识 Bus.$emit('sendMsg', '这是一个消息')
-
B组件(接受方),监听Bus的 $on事件
created () {// 形参msg为传递的信息('这是一个消息')Bus.$on('sendMsg', (msg) => {this.msg = msg}) }
3.2.2.provide-inject
作用:跨层级共享数据
-
父组件 provide提供数据
export default {provide () {return {// 普通类型【非响应式】color: this.color, // 复杂类型【响应式】userInfo: this.userInfo, }} }
-
.子/孙组件 inject获取数据
export default {inject: ['color','userInfo'],created () {console.log(this.color, this.userInfo)} }
- provide提供的简单类型的数据不是响应式的,复杂类型数据是响应式。(
推荐提供复杂类型数据
) - 子/孙组件通过inject获取的数据,不能在自身组件内修改
3.3.v-model详解
-
v-model本质上是一个语法糖。例如应用在输入框上,就是value属性 和 input事件 的合写
<template><div id="app" ><input v-model="msg" type="text"><!-- 等价于 --><!-- 数据变,视图跟着变 :value --><!-- 视图变,数据跟着变 @input --><input :value="msg" @input="msg = $event.target.value" type="text"></div> </template>
-
$event 用于在模板中,获取事件的形参
-
$event.target.value即获取输入框的值
-
将输入框的值赋值给data里的数据msg,再将msg通过
:value
赋值给输入框,从而实现数据的双向绑定。
注意:
-
不同的表单元素, v-model在底层的处理机制是不一样的。
比如给checkbox使用v-model,底层处理的是
:checked
属性和@change
事件。 -
v-model不能直接绑定父组件传过来的数据,因为父组件通过prop属性传过来的数据不能直接修改。
3.4.sync修饰符(已废弃)
-
在上面的父子通信中,子组件不能直接修改父组件数据,而是通过$emit间接修改
-
通过sync修饰符,子组件可以修改父组件传过来的props值
-
以上面的父子通信为例
父组件:
<!-- 完整写法 --> <MySon :title="say" @update:title="isShow = $event" ></MySon><!-- 简写 --> <MySon :title.sync="say"></MySon>
子组件:
props: {title: Boolean }, this.$emit('update:title', 'Hello')
3.5.(重点)ref和$refs
-
利用ref 和 $refs 可以用于 获取
dom 元素
或组件实例
(要在dom渲染完后才能获取) -
获取元素还可以通过
document.querySeletctor()
获取,但是此方法是从整个页面开始获取的- 类名问题:比如我们在子组件中获取类名为app的元素,如果在此组件之前还有类名为app的元素,则会获取之前的类名为app的元素
- 解决方法:如果我们利用ref 和 $refs 可以用于 获取
dom 元素
,则会从当前组件开始获取,避免类名问题。
-
示例:
-
给要获取的盒子添加ref属性
<div ref="demo">我是渲染图表的容器</div>
-
通过 this.$refs.demo 获取
mounted(){console.log(this.$refs.demo) }
-
3.6.ref和$refs选择器
-
利用ref 和 $refs 还可以用于
组件实例
-
-
在组件示例上,添加ref属性
<MySon ref="demo" ></MySon>
-
通过 this.$refs.demo 获取,控制台会打印组件对象
mounted(){console.log(this.$refs.demo)// 控制台// VueComponent {_uid: 2, _isVue: true, __v_skip: true, _scope: EffectScope, $options: {…}, …} }
-
我们可以通过
this.$refs.demo.子组件方法名
调用子组件方法,或者访问子组件属性,实现组件通信。注意:这种组件通信只是调用了子组件方法或者访问子组件属性,没有实现
双向绑定
。
-
3.7.$nextTick
-
$nextTick用于实现vue的异步更新
-
应用案例:编辑标题, 编辑框自动聚焦
-
-
效果:点击编辑,显示编辑框,并且让编辑框,立刻获取焦点
-
预想代码
this.isShowEdit = true // 显示输入框 this.$ref.input.focus() // 获取焦点
-
预想代码并不能实现该效果,因为:
- 当执行显示输入框代码后,没等dom渲染出显示框,就执行到获取焦点的代码了(因为dom是
异步更新
),我们可以用$nextTick用于实现vue的异步更新。 - vue异步更新的原因是提高性能,当点击编辑按钮的@click绑定的事件执行完毕后,才会更新视图,这样避免每执行完一行代码就更新一次视图。
- 当执行显示输入框代码后,没等dom渲染出显示框,就执行到获取焦点的代码了(因为dom是
-
利用$nextTick实现以上代码的异步更新
this.isShowEdit = true // 显示输入框 this.$nextTick(() => {this.$refs.inp.focus() // 获取焦点 })
- 当执行到$nextTick时,会更新渲染一次dom,输入框渲染出来,再向下执行代码
- 说到dom异步更新,很多人想到利用延时器实现,但是延时器延迟时间是固定的,而执行到dom渲染的时间并不固定(和网络、设备性能有关)。
注意:
$nextTick 内的函数体 一定是箭头函数,这样才能让函数内部的this指向Vue实例
-
4.自定义指令
- 与$nextTick类似,inserted会在指令所在元素被插入页面时触发
-
全局注册(下面以注册实现上面点击聚焦功能为例)
//在main.js中 Vue.directive('focus', {// el为指令绑定的元素 "inserted" (el) {el.focus()} })
-
局部注册
//在Vue组件的配置项中 directives: {"focus": {inserted (el) {el.focus()}} }
-
指令使用
<input v-focus ref="inp" type="text">
4.1.指令的值
与vue内置指令相同,我们也可以为自定义指令设置值
-
示例:我们定义一个v-color指令,v-color的值变化时,带有v-color指令的标签也会变化
-
指令注册(局部注册)
directives: {color: {inserted (el, binding) {el.style.color = binding.value},update (el, binding) {el.style.color = binding.value}} }
- binding.value为指令值
- 指令值修改会触发update函数(update也是一个生命周期钩子)
- 我们指令的值可以设置为变量,这时我们就需要设置update函数
4.2.封装v-loading指令
-
在加载时,页面通常会有一个loading动画效果
-
这个效果通常为一个蒙层(蒙层一般为伪元素)
-
loading的开启和关闭只需要添加移除类即可(因为伪元素是css生成的,自然也可以通过操作css移除)
示例:
<template><div class="main"><div class="box" v-loading = "isLoading"><ul><li v-for="item in list" :key="item.id" class="news"><div class="left"><div class="title">{{ item.title }}</div><div class="info"><span>{{ item.source }}</span><span>{{ item.time }}</span></div></div><div class="right"><img :src="item.img" alt=""></div></li></ul></div></div> </template><script>import axios from 'axios'export default {data () {return {list: [],isLoading: true}},async created () {const res = await axios.get('http://hmajax.itheima.net/api/news')setTimeout(() => {this.list = res.data.data// 移除蒙层this.isloading = false}, 2000)},// 定义指令directives: {loading: {inserted (el, binding) {binding.value?el.classList.add('loading'):el.classList.remove('loading')},update (el, binding) {binding.value?el.classList.add('loading'):el.classList.remove('loading')}}}} </script><style>/* 伪元素 */.loading:before {content: '';position: absolute;left: 0;top: 0;width: 100%;height: 100%;background: #fff url('./loading.gif') no-repeat center;}.box2 {width: 400px;height: 400px;border: 2px solid #000;position: relative;}.box {width: 800px;min-height: 500px;border: 3px solid orange;border-radius: 5px;position: relative;}.news {display: flex;height: 120px;width: 600px;margin: 0 auto;padding: 20px 0;cursor: pointer;}.news .left {flex: 1;display: flex;flex-direction: column;justify-content: space-between;padding-right: 10px;}.news .left .title {font-size: 20px;}.news .left .info {color: #999999;}.news .left .info span {margin-right: 20px;}.news .right {width: 160px;height: 120px;}.news .right img {width: 100%;height: 100%;object-fit: cover;} </style>
知识点:
-
安装axios :
yarn add axios
或npm i axios
-
定义指令部分:
directives: {loading: {inserted (el, binding) {// 如果加载,显示蒙层(移除loading类),否则,显示蒙层binding.value?el.classList.add('loading'):el.classList.remove('loading')},update (el, binding) {binding.value?el.classList.add('loading'):el.classList.remove('loading')}} }
-
-
v-loading工作流程:有些同学看到这里可能有些疑问,组件定义里面的函数是什么时候执行的?
- 上面有提到,inserted会在指令所在元素被
插入页面时触发
- 在上面示例中,先执行created生命周期钩子,向服务器发送获取数据请求,然后再将返回数据更新到 list 中,并改变isLoading
- 上面有提到,inserted会在指令所在元素被
5.插槽
5.1默认插槽
-
让组件内部的一些 结构 支持 自定义
-
语法:
- 组件内需要定制的结构部分,改用
<slot></slot>
占位 - 给插槽传入内容时,可以传入纯文本、html标签、组件
- 在标签内部, 传入结构替换slot
- 组件内需要定制的结构部分,改用
-
示例:弹框插槽
5.2.后备内容
上面示例中,如果不传内容,则会不会显示
我们可以为插槽设置默认显示内容,如果不传内容,则会显示默认显示内容
- 我们只需要在封装组件时,为预留的
<slot>
插槽提供后备内容即可(默认内容)
5.3.具名插槽
一个组件中,很多时候不单单只有一个插槽,这时我们需要使用name属性区分不同插槽。
-
使用name属性区分不同插槽。
-
template
配合v-slot:名字
来分发对应标签 -
为方便书写,上面可以将
v-slot:
替换为#
示例:
-
根组件(App.vue)
<div id="app"><HelloWorld><template #age>年龄</template><template #name>姓名</template><template #gender>性别</template></HelloWorld> </div>
-
子组件(HelloWorld.vue)
<div><slot name="name"></slot><hr /><slot name="age"></slot><hr /><slot name="gender"></slot> </div>
显示顺序取决于子组件的插槽位置
5.4.作用域插槽
-
作用域插槽不属于插槽的一种分类
-
定义slot插槽的同时,可以传值,给插槽绑定数据,这些数据与插槽绑定的组件也可以使用
-
给 slot 标签, 以 添加属性的方式传值(组件中)
<slot :id="item.id" msg="测试文本"></slot>
-
在template中, 通过
#插槽名= "obj"
接收,默认插槽名为 default(根组件中)<MyTable :list="list"><template #default="obj"><button @click="del(obj.id)">删除</button></template> </MyTable>
-
-
所有添加的属性, 都会被收集到一个对象中,我们也可以将这个对象结构来使用
<MyTable :list="list"><template #default="{id, msg}"><button @click="del(id)">删除</button></template> </MyTable>
6.my-tag组件封装
实现功能:
- 双击显示,自动聚焦
- 失去焦点,隐藏输入框
- 回显标签内容
- 内容修改,回车,修改标签信息
代码:
-
MyTag
<template><div class="my-tag"><inputv-if="isEdit" v-focusclass="input"type="text"placeholder="输入标签":value="value"@blur="isEdit = false"@keyup.enter="handleEnter"/><div v-else@dblclick="handleClick"class="text">{{ value }}</div></div> </template><script> export default {props: {value: String},data () {return {isEdit: false}},methods: {handleClick () {// 双击后,切换到显示状态 (Vue是异步dom更新)this.isEdit = true},handleEnter (e) {// 非空处理if (e.target.value.trim() === '') return alert('标签内容不能为空')// 由于父组件是v-model,触发事件,需要触发 input 事件this.$emit('input', e.target.value)// 提交完成,关闭输入状态this.isEdit = false}} } </script><style lang="less" scoped> .my-tag {cursor: pointer;.input {appearance: none;outline: none;border: 1px solid #ccc;width: 100px;height: 40px;box-sizing: border-box;padding: 10px;color: #666;&::placeholder {color: #666;}} } </style>
-
App.vue
<template><div><MyTag v-model="item.tag"></MyTag> </div> </template><script> import MyTag from './components/MyTag.vue'export default {name: 'TableCase',components: {MyTag,},data () {return {// 测试组件功能的临时数据tempText: '水杯', }} } </script><style lang="less" scoped> .table-case {width: 1000px;margin: 50px auto;img {width: 100px;height: 100px;object-fit: contain;vertical-align: middle;} }</style>
-
main.js
import Vue from 'vue' import App from './App.vue' Vue.config.productionTip = false// 封装全局指令 focus Vue.directive('focus', {// 指令所在的dom元素,被插入到页面中时触发inserted (el) {el.focus()} })new Vue({render: h => h(App), }).$mount('#app')
知识点:
-
双击触发事件:@dblclick
-
两种自动聚焦方法:
在实现点击盒子切换为inpu标签并自动聚焦时,我们可以通过ref和refs操作dom,再配合$nextTick异步实现,不过为了提高复用性,我们通过自定义指令,封装到mian.js实现该功能
-
指令修饰符实现回车事件监听,@keyup.enter,由于该案例数据是由父组件传递过来的,所以还要将该值发送给父组件
相关文章:
【Vue-组件】学习笔记
目录 <<回到导览组件1.项目1.1.Vue Cli1.2.项目目录1.3.运行流程1.4.组件的组成1.5.注意事项 2.组件2.1.组件注册2.2.scoped样式冲突2.3.data是一个函数2.4.props详解2.5.data和prop的区别 3.组件通信3.1.父子通信3.1.1.父传子(props)3.1.2.子传父…...
Github上一些使用技巧(缩写、Issue的Highlight)自用
1. GIthub中的一些缩写 LGTM ! 最近经常看到一些迷之缩写,感觉挺有意思的,但是有时候看到一些没见过的缩写还是有点懵逼,不过缩写确实也是很方便去review,这里就记录汇总一下;顺便加了一些git的基操单词(加…...
【团体程序涉及天梯赛】L1~L2实战反思合集(C++)
实战反思汇总记录 仔细审题,想好再写 L1-104 九宫格 - 团体程序设计天梯赛-练习集 易忽略的错误:开始习惯性地看到n就以为是n*n数组了,实际上应该是9*9的固定大小数组,查了半天没查出来 L1-101 别再来这么多猫娘了!…...
ubuntu下的node.js的安装
安装 node-v22.14.0-linux-x64.tar.xz 的步骤如下: 1. 下载和解压 如果尚未下载文件,可以通过 wget 下载(替换为实际下载链接): wget https://nodejs.org/dist/v22.14.0/node-v22.14.0-linux-x64.tar.xz解压文件&…...
VMware-workstation-full-12.5.2 install OS X 10.11.1(15B42).cdr
手把手虚拟机安装苹果操作系统 VMware_workstation_full_12.5.2 unlocker208 Apple Max OS X(M)-CSDN博客 vcpu-0:VERIFY vmcore/vmm/main/physMem_monitor.c:1180 FILE: FileCreateDirectoryRetry: Non-retriable error encountered (C:\ProgramData\VMware): Cann…...
Linux下创建svn库 和 svn安装与操作
1.介绍 SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。适合中小公司的开发人员不多的项目使用,相比git管理工具更简单. 2.安装svn 2.1 国际惯例 首先看…...
React-04React组件状态(state),构造器初始化state以及数据读取,添加点击事件并更改state状态值
1.React组件状态(state) 组件可以拥有状态(state),它是组件数据的私有部分,可以用来管理动态数据。状态仅适用于类组件,或者使用 React 的 Hook 时可以在函数组件中使用。 注意 组件中render方…...
第3课:MCP协议接口定义与开发实践
MCP协议接口开发实战:从标准化设计到跨语言SDK落地 一、引言:为什么接口标准化是多智能体协作的“刚需” 在多智能体系统中,不同语言开发的智能体、异构服务之间的通信效率往往受制于接口兼容性问题。MCP(Model Context Protoco…...
Perl语言的WebAssembly
Perl语言的WebAssembly:将古老的语言带入新世纪 引言 在编程语言发展的历史长河中,Perl作为一门早期广泛使用的脚本语言,以其灵活性和丰富的文本处理能力而闻名。然而,随着互联网和Web技术的迅猛发展,许多开发者开始…...
[ISP] ISP 中的 GTM 与 LTM:原理、算法与与 Gamma 校正的对比详解
在现代图像信号处理(ISP)流水线中,图像增强是提升视觉质量的核心手段之一。尤其是在高动态范围(HDR)内容、弱光环境或复杂光照条件下,Tone Mapping(色调映射)技术的引入成为关键。To…...
健身管理小程序|基于java微信开发健身管理小程序的系统设计与实现(源码+数据库+文档)
健身管理小程序目录 基于微信开发健身管理小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 小程序端: 后台 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码…...
批量将文本合并成单个文件,支持按文件夹合并文本文档
我们的文件夹中有零零碎碎的多个小的文本文件,这对我们存档记录是非常不方便,不友好的。如果我们能够将多个小的文本文件合并成一个完整的大的文本文件,那不管是在共享还是在存档起来都更加的方便。今天给大家介绍一下如何批量将多个文本文件…...
ROS云课三分钟-差动移动机器人巡逻报告如何撰写-中等报告
评语: 成绩中等(70/100),具体如下: 1. 摘要部分 问题描述: 内容空洞:摘要过于简短,仅简要概述了研究内容和实现方法,未突出研究的创新点或重要性。缺乏细节࿱…...
forms实现推箱子小游戏
说明: forms实现推箱子小游戏 效果图: step0:游戏规则 # 推箱子游戏规则说明## 🎯 游戏目标 - 通过控制角色移动,将所有**棕色箱子(3)**推到**红色目标点(4)**上 - 当所有箱子都变为**绿色(7)**时,即完成当前关卡 - 完成全部关…...
图的储存+图的遍历
图的存储 邻接矩阵 #include <iostream>#include <cstring>using namespace std;const int N 1010;int n, m;int edges[N][N];int main() {memset(edges, -1, sizeof edges);cin >> n >> m; // 读⼊结点个数以及边的个数 for(int i 1; i < m; i)…...
蓝桥杯—数字接龙(dfs+减枝)
一.题目 二.思路 一看就是迷宫问题的变种,从左上角到达右下角,要解决 1.8个方向的方向向量,用dx,dy数组代表方向向量 2.要按照一个规律的数值串进行搜索0,1,2,k-1,0,1…...
Solidity智能合约漏洞类型与解题思路指南
一、常见漏洞类型与通俗解释 1. 重入攻击(Reentrancy) 🌀 通俗解释:就像你去银行取钱,柜台人员先给你钱,然后再记账。你拿到钱后立即又要求取钱,由于账还没记,柜台又给你一次钱,这样循环下去你就能拿走银行所有的钱。 漏洞原理:合约在更新状态前调用外部合约,允许…...
临床 不等于 医学-《分析模式》漫谈52
DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 “Analysis Patterns”的第4章“企业财务观察”有这么一句话: An important point about this model——a reflection of its clinical background 2004(机械…...
鸿蒙应用开发中的 Stack 布局模式
在鸿蒙(HarmonyOS)应用开发中,Stack 布局模式是一种非常灵活的布局方式,类似于其他开发框架中的 StackPanel 或 AbsoluteLayout。它允许子组件按照层级关系进行堆叠,后添加的组件会覆盖在先添加的组件之上。开发者可以通过设置组件的位置、大…...
仿modou库one thread one loop式并发服务器
源码:田某super/moduo 目录 SERVER模块: Buffer模块: Socket模块: Channel模块: Connection模块: Acceptor模块: TimerQueue模块: Poller模块: EventLoop模块&a…...
【AI学习】初步了解Gradio
Gradio 是一个开源的 Python 库,专注于快速构建交互式 Web 界面,特别适用于机器学习模型、数据科学项目或任意 Python 函数的演示与部署。它通过极简的代码实现前后端一体化,无需前端开发经验即可创建功能丰富的应用。以下是 Gradio 的核心特…...
C++11QT复习 (十四)
文章目录 Day9 数据结构学习笔记(2025.04.01)一、C基础快速回顾二、STL(标准模板库)三、常见容器及其对应的数据结构四、容器操作演示1. 基本容器使用2. 异构类型容器 五、迭代器详解特点示例用户自定义结构体访问成员 六、算法库…...
ThreadCache
目录 一、Freelist 二、ThreadCache 三、哈希桶映射规则 一、Freelist 在之前整体框架介绍的时候,我们曾说过ThreadCache是一个哈希桶的结构。每一个桶都要存同一个大小的对象块(即最小块的内存)。 那么我们使用FreeList来…...
c++中同步和异步,阻塞和非阻塞原理以及机制
在C中,同步与异步、阻塞与非阻塞是并发编程中的重要概念,它们描述了程序在执行任务时的行为模式。理解这些概念对于设计高效、响应良好的并发程序至关重要。下面我将详细介绍这些概念的原理和机制。 1. 同步与异步 同步(Synchronous&#x…...
Python项目打包指南:PyInstaller与SeleniumWire的兼容性挑战及解决方案
前言 前段时间做一个内网开发的需求,要求将selenium程序打包成.exe放在内网的win7上运行,在掘金搜了一圈也没有发现相关文章,因此将过程中踩到的坑记录分享一下。 本文涵盖了具体打包操作、不同模块和依赖项的兼容性解决方案,以…...
浅谈微信视频号推荐算法
这次可能会稍微有点干货,但保证不晦涩~ 一、算法推荐的本质:猜你喜欢 vs 社交绑架 视频号的推荐系统本质上在做两件事: 预测你的兴趣:通过你的浏览、点赞、评论、分享等行为,分析你的偏好。满足社交需求&…...
selenium 常用方法
selenium 库的常用方法: 方法说明示例代码webdriver.Chrome()初始化 Chrome 浏览器实例。driver webdriver.Chrome()driver.get(url)访问指定的 URL 地址。driver.get("https://example.com")driver.find_element(By, value)查找第一个匹配的元素。elem…...
springboot中使用async实现异步编程
目录 1.说明 2.实现原理 3.示例 4.总结 1.说明 Async 是 Spring 框架提供的一个注解,用于标记方法为异步执行。被标记的方法将在调用时立即返回,而实际的方法执行将在单独的线程中进行。 Async 注解有一个可选属性:指定要使用的特定线程…...
【2024年蓝桥杯Java B组】省赛真题详细解析
【2024年蓝桥杯Java B组】省赛真题 距离比赛仅剩5天,大多数省份可能完成3-4题即可拿到省奖,2025年想要拿到省奖,需要高效利用时间,重点突破关键知识点和题型。这里以【2024年蓝桥杯Java B组省赛真题】为例,梳理我们最后…...
SQL:DDL(数据定义语言)和DML(数据操作语言)
目录 什么是SQL? 1. DDL(Data Definition Language,数据定义语言) 2. DML(Data Manipulation Language,数据操作语言) DDL和DML的区别 什么是SQL? SQL(Structured …...
机器学习核心概念、算法分类与应用场景全解析
文章目录 一、基础任务与算法分类1. 分类任务(监督学习)2. 回归任务(监督学习)3. 聚类任务(无监督学习) 二、关键流程与技术细节1. 数据预处理2. 特征工程3. 数据集划分与评估 三、进阶技术1.深度学习2.强化…...
【leetcode】—416.分割等和子集
✏️ 关于专栏:专栏用于记录 LeetCode 中做题与总结 文章目录 分割等和子集▐ 题目描述▐ 题目示例▐ 题目提示▐ 思路&代码方法:动态规划 分割等和子集 ▐ 题目描述 题目链接:分割等和子集 给你一个 只包含正整数 的 非空 数组 nums …...
jemeter 之mysql驱动问题
问题 java.sql.SQLException: No suitable driver found for jdbc:mysql 解决 先把jar放到lib下 检查 JMeter 的 Classpath 在 JMeter 中,JDBC 驱动需要手动添加到 Classpath 中。 打开 JMeter 安装目录下的 bin/jmeter.properties 文件,找到 user.cla…...
隐私计算的崛起:数据安全的未来守护者
在信息技术(IT)的滚滚浪潮中,一种新兴技术正以惊人速度崭露头角——隐私计算(Privacy-Preserving Computation)。2025 年,随着数据泄露事件频发、全球隐私法规日益严格,以及企业对数据协作需求的…...
Excel计数、求和、统计、计算类函数
目录 一、计数函数1. COUNT2. COUNTA3. COUNTBLANK4. COUNTIF5. COUNTIFS 二、求和函数1. SUM2. SUMIF3. SUMIFS4. SUMPRODUCT 三、统计函数1. AVERAGE2. AVERAGEA3. AVERAGEIF 函数4. AVERAGEIFS 函数 四、其他常用计算函数1. MAX 与 MIN2. RANK3. MOD4. ROUND5. FLOOR6. INT7…...
解决 Kubernetes 中容器 `CrashLoopBackOff` 问题的实战经验
在 Kubernetes 集群中,容器状态为 CrashLoopBackOff 通常意味着容器启动失败,并且 Kubernetes 正在不断尝试重启它。这种状态表明容器内可能存在严重错误,如应用异常、依赖服务不可用、配置错误等。本文将分享一次实际排障过程,并…...
北师大具身AI的虚拟世界扩展!UNREALZOO:为具身智能打造高逼真度的虚拟世界
作者:Fangwei Zhong, Kui Wu, Churan Wang, Hao Chen, Hai Ci, Zhoujun Li, Yizhou Wang 单位:北京师范大学,北京航空航天大学,北京大学,BIGAI,澳门城市大学,新加坡国立大学 论文标题…...
2025 年浙江保安员职业资格考试高效备考指南
浙江以创新活力著称,保安行业也在不断革新。2025 年考试报考条件常规,报名主要通过浙江省保安服务监管信息系统,方便快捷。 理论考试在传统知识基础上,加大对智能安防技术应用的考查,如人脸识别系统、智能监控报警系…...
创意设计:动态彩色数学爱心
设计理念 数学之美:使用心形线的数学方程(心形曲线)生成爱心形状。视觉吸引力:通过 Python 的 colorama 库添加颜色渐变效果。动态感:加入简单的动画,让爱心“跳动”。技术魅力:结合模块化编程…...
C++动态内存管理完全指南:从基础到现代最佳实践
一、动态内存基础原理 1.1 内存分配层次结构 内存类型生命周期分配方式典型使用场景静态存储区程序整个运行期编译器分配全局变量、静态变量栈内存函数作用域自动分配/释放局部变量堆内存手动控制new/malloc分配动态数据结构 1.2 基本内存操作函数 // C风格 void* malloc(s…...
ebpf: CO-RE, BTF, and Libbpf(一)
本文内容主要来源于Learning eBPF,可阅读原文了解更全面的内容。 概述 一个ebpf程序可以在一个kernel版本中编译,而在另外一个kernel版本上运行,即便两个kernel版本中有些结构体有变化。而BTF(BPF Type Format) 是能让ebpf有这种强大兼容性…...
Linux 递归查找并删除目录下的文件
在 Linux 中,可以使用 find 命令递归查找并删除目录下的文件 1、示例命令 find /path/to/directory -type f -name "filename_pattern" -exec rm -f {} 2、参数说明 /path/to/directory:要查找的目标目录type f:表示查找文件&am…...
使用人工智能大模型腾讯元宝,如何快速编写活动记录?
今天我们学习使用人工智能大模型腾讯元宝,如何快速编写活动记录? 手把手学习视频地址https://edu.csdn.net/learn/40402/666457 第一步在腾讯元宝对话框中输入如何协助老师写教研活动记录,通过提问,我们了解了老师写教研活动记录…...
File 类的用法和 InputStream, OutputStream 的用法
1 文件系统的操作 创建文件,删除文件,创建目录,重命名文件,判定文件存在... Java中提供file类进行文件系统操作,使用路径进行初始化表示具体的文件(可以存在,也可以不存在)…...
buuctf--[湖南省赛2019]Findme
目录 前沿 解题过程 分析 p1 P2 p3 p4 p5 前沿 其实对于这道题呢,我的想法是不知道怎么判断的,这个题你说他难吧,他用的都是比较基础的东西,说他简单吧,他有太复杂的过程,总体来讲࿰…...
【从0到1学MybatisPlus】MybatisPlus入门
Mybatis-Plus 使用场景 大家在日常开发中应该能发现,单表的CRUD功能代码重复度很高,也没有什么难度。而这部分代码量往往比较大,开发起来比较费时。 因此,目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国…...
【S32M244 RTD200P04 LLD篇8】S32M244 PWM ADC LLD demo
【S32M244 RTD200P04 LLD篇8】S32M244 PWM ADC LLD demo 一,文档简介二,PWMTRGMUXPDBADC 2ch 软件配置与实现2.1 软硬件版本平台2.2 Demo CT 模块配置2.2.1 引脚配置2.2.2 时钟配置2.2.3 外设配置 2.3主程序调用情况 三, 测试结果 一…...
(蓝桥杯)动态规划蓝桥杯竞赛指南:动态规划解决最少钞票数问题(超详细解析+代码实现)
问题描述 近期,黄开的银行新发行了一种面额为 4 的钞票,使得钞票种类增至 5 种:20、10、5、4 和 1 元。银行在发钞时十分“节俭”,当有客户取钱时,需要以最少的钞票数来满足取款金额。 问题要求: 对于给定…...
深度:善用人工智能推动高等教育学习、教学与治理的深层变革
在人工智能技术与教育深度融合的当下,高等教育正经历着前所未有的范式转型。从学习方式的革新到教学模式的重构,再到治理体系的升级,人工智能已不再仅仅是辅助工具,而是成为重塑高等教育生态的核心驱动力。这一变革浪潮中,生成式人工智能(Generative AI)作为技术前沿的代…...
python全栈-JavaScript
python全栈-js 文章目录 js基础变量与常量JavaScript引入到HTML文件中JavaScript注释与常见输出方式 数据类型typeof 显示数据类型算数运算符之加法运算符运算符之算术运算符运算符之赋值运算符运算符之比较运算符运算符之布尔运算符运算符之位运算符运算符优先级类型转换 控制…...