vue3+ts笔记

创建项目:

npm create vue@latest

npm install

页面渲染原理:

  • vite项目中,index.html是项目的入口文件,在项目最外层。
  • 加载index.html后,vite解析 <script type="module" src="xxx"> 指向js。
  • vue3中是通过createApp函数创建一个应用实例。

选项 API 和组合 API:

vue3中开始弱化this;

setup将数据和方法交出去,模板中才可以使用,

setup的返回值也可以是一个渲染函数,

setup中不能使用this.,

setup和data,methods可以并存,一般不同时写,

但是setup读不到data中的数据,data可以读到setup的数据。

语法糖:

<script lang= "ts" setup>let a = '1'
</script>

(如果想修改组件名可以下载一个插件npm i vite-plugin-vue-setup-extend -D )

定义响应式数据:

<script lang= "ts" setup>
import {ref,reactive,toRefs,toRef} from 'vue'
// 使用【ref】可以定义基本类型和对象类型的响应式数据 
// 获取及赋值时记得用.value 也可以使用volar插件自动添加.value
let a = ref('1') 
// 使用【reactive】只能定义对象类型的响应式数据 
// 1,不过它无法替换整个对象 修改数据时如果重新分配了一个新的对象 则这个数据不再是响应式数据了  除非使用Object.assign(obj,{name:'姓名2',age:"182"})  如果是使用ref定义的对象类型数据就可以重新分配一个新的对象 因为有.value
// 2,reactive定义的对象类型的数据不适合解构  如果要解构 要使用【toRefs】包裹对象
let obj = reactive({name:'姓名',age:"18"}) 
// 解构
let {name,age} = toRefs(obj)
let newname = toRef(obj,'name')
// 方法
function changeName(){obj.name = '123' //  使用reactivename.value= '123' // 使用reactive和toRefsnewname.value = '456' // 使用reactive和toRef
}
</script>

使用规则:

若需要一个基本类型的响应式数据,必须使用【ref】

若需要一个响应式对象,层级不深,使用ref reactive都可以

若需要一个响应式对象,且层级较深,推荐使用reactive

响应式的底层原理还是getter 和 setter,可以将 ref 视为:

const myRef = {_value: 0,get value() {track()return this._value},set value(newValue) {this._value = newValuetrigger()}
}

computed计算属性:

// 可读可写
<script setup>
import { ref, computed } from 'vue'const firstName = ref('John')
const lastName = ref('Doe')const fullName = computed({// getterget() {return firstName.value + ' ' + lastName.value},// setterset(newValue) {// Note: we are using destructuring assignment syntax here.[firstName.value, lastName.value] = newValue.split(' ')}
})
</script>

watch:

可以监听ref定义的基本类型的数据和对象类型的数据

可以监听reactive定义的对象数据类型的数据,且默认是开启深度监视并且无法 关闭的。

可以监听ref定义或者reactive定义的对象数据类型的数据中的某个属性,若该属性值不是对象类型,需要写成函数形式,若该属性值依然是对象类型,可直接编辑,也可写成函数形式(()=>obj.name)。

<script setup>
import { ref, watch } from 'vue'const sum = ref(0)
const obj = ref({name:'123',age:18})
watch(sum,(newValue,oldValue)=>{console.log(newValue,oldValue)
})
watch(obj,(newValue,oldValue)=>{console.log(newValue,oldValue)
},{deep:true,immediate:true})watch(()=>obj.name,(newValue,oldValue)=>{console.log(newValue,oldValue)
},{deep:true,immediate:true})</script>

watchEffect:

立即运行一个函数,同时响应式地追踪其依赖,并在依赖更新时重新执行该函数,

与watch相比,watchEffect不用明确指出监视的数据(自动监听函数中用到的属性),

<script setup>
import { ref, watchEffect } from 'vue'const height = ref(0)
const width = ref(0)watchEffect(()=>{if(height.value>20 || width.value>30){console.log(1234)}
})</script>

defineExpose:

子组件抛出数据给父组件,

ts:

// 定义一个接口 用于限制person对象的具体属性
export interface PersonInter{id:string,name:string,age:number,x?:number // 可有可无的字段
}// 一个自定义类型
export type Persons = Array<PersonInter>
<script lang="ts" setup name="name">
import {reactive} from 'vue'
import { type PersonInter ,type Persons} from '@/types'let person:PersonInter = {id:'123',name:'张三',age:18}
let personList:Persons = [{id:'123',name:'张三',age:18}]// 给响应式数据加泛型
let personList2 = reactive<Persons>([{id:'123',name:'张三',age:18}])
</script>

生命周期:

<script setup>
import { onBeforeMounted,onMounted,onBeforeUpdate,onUpdate } from 'vue'
// setup就是创建了
onBeforeMounted(() => {console.log('挂载前')
})
onMounted(() => {console.log('挂载完毕*')
})
onBeforeUpdate(() => {console.log('更新前')
})    
onUpdate(() => {console.log('更新完毕*')
})  
onBeforeUnmounted(() => {console.log('卸载前*')
})
onUnmounted(() => {console.log('卸载完毕')
})  
</script>

hooks: 模块化

建一个hooks文件,文件里可以建多个use开头的ts文件,

每个hooks里都有自己的数据,方法,钩子函数等,不同的业务数据可以建不同的hooks文件,这样就实现了数据分离,

例如,建一个useDog.ts文件,

import { reactive,onMounted} from 'vue'export default function(){// 数据let dogList = reactive(['img 地址'])// 方法async function getDog(){// 请求数据dogList.push()}// 钩子onMounted(()=>{})// 向外界提供数据return {dogList,getDog}
}

组件引入hooks:

<script lang="ts" setup>
import useDog from '@/hooks/useDog'const {dogList,getDog} = useDog()</script>

路由:

新建router文件,写好router抛出来,在main.ts中使用路由,同时要在App.vue中使用路由导航来占位内容。

分为history和hash模式

pinia:集中式(数据)状态管理

多个组件共享数据,

安装: npm install pinia

引入:

import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'const pinia = createPinia()
const app = createApp(App)app.use(pinia)
app.mount('#app')

定义:

在store文件夹里新建一个业务名称的ts的文件

例如:用选项式写count.ts

import { defineStore } from 'pinia'export const useCountStore = defineStore('count', {// 放置方法,用于响应组件中的actionsactions:{increment(value:number){// this是当前的storethis.sum + = value}},// 真正存储数据的地方state(){return {sum:6}},getters:{bigSum(state){// return state.sum*10 或者return this.sum*10}}
})

在页面中使用:

<template><div>{{sum}}</div><button @click="add">+</button>
</template>
<script lang="ts" setup>
import {useCountStore} from '@/store/count'
import { storeToRefs } from 'pinia'// 使用
const countStore = useCountStore()
// *解构 使用storeToRefs 会把countStore中的数据转为ref数据(响应式数据)
const { sum } = storeToRefs(countStore)
// 订阅这个属性的变化
sum.$subscribe((mutate,state)=>{console.log(state.sum)
})function add(){countStore.increment(1)
}
</script>

*改为用组合式写count.ts

  • ref()成为state属性
  • computed()成为getters
  • function()成为actions
import { ref,computed } from 'vue'
import { defineStore } from 'pinia'export const useCountStore = defineStore('count', ()=>{const sum = ref(0)const doubleCount = computed(() => sum.value * 2)function increment(value:number){sum.value + = value}return {sum,doubleCount,increment}
})

defineProps:父子组件传参

父组件:

<template><div></div><Child :list="list" :house="house" @send="onSend"></Child>
</template><script setup lang="ts">import {ref} from 'vue'let childdata = ref('')let house = ref('别墅')function onSend(value:string){childdata.value = value}
</script>

子组件:list是父组件传过来的数据

<template><div>{{name}}{{list}}{{house}}</div><button @click="send(name)"></button>
</template><script setup lang="ts">
import {ref} from 'vue'
interface Props {foo: stringbar?: number
}
interface HouseProps {house?:string
}
let name = ref('sansan')
const props = defineProps(['list','send']) // 不限制类型
const props = defineProps<{list:Props}>() // 接收list+限制类型
const props = withDefaults(defineProps<{list?:Props}>(),{list:()=>[]} )// 接收list+限制类型+限制必要性+指定默认值
const props = defineProps<HouseProps>()  // 接收house+限制类型</script>

自定义事件:子传父

父组件:

<template><div></div><Child @send-data="onSend"></Child>
</template><script setup lang="ts">import Child from './child.vue'import {ref} from 'vue'let childdata = ref('')// 取到传过来的数据function onSend(value:string){childdata.value = value}
</script>

子组件:

<template><div>{{name}}</div><button @click="emit('send-data',name)"></button>
</template><script setup lang="ts">import {ref} from 'vue'let name = ref('sansan')const emit = defineEmits(['send-data'])// 使用emit('send-data',value)就可以给父级传参数和事件了
</script>

mitt:不管多么深度或者多么远的组件之间都可以通信;

安装:npm i mitt

在util中引入mitt;

emitter.emit('on-send',name)
emitter.on('on-send',(value:string)=>{// 操作传过来的数据
})
// 销毁组件时解绑emitt的事件
onUnmounted(()=>{emitter.off('on-send')
})

v-model

v-model用在html标签上:

v-model 的本质是input框的value和@input事件

v-model用在组件标签上:

$event到底是什么,

对于原生事件,$event就是事件对象,这时候能用.target,

对于自定义事件,$event就是触发事件时,所传递的数据,不能.target,

举个例子:

父组件:

<child v-model="name"></child>
// 优化
<child v-model:qwe="name"></child>
<child :qwe="name"></child>
// 本质是
<child :modelValue="name" @update:modelValue="name=$event"></child>

子组件:

<template><input :value="modelValue" @input="emit('update:modelValue',$event.target.value)"><input :value="qwe" @input="emit('update:qwe',$event.target.value)">
</template><script setup lang="ts">defineProps(['modelValue','qwe')const emit = defineEmits(['update:modelValue','update:qwe'])
</script>

爷孙组件传参:

v-bind="$attrs" v-on="$listeners"

组件通信:$refs 和

$parent

$refs值为对象,能取到所有被ref属性标识的DOM元素或组件实例,用于父级获取子集数据并且可修改子集数据。

$parent值为对象,能取到当前组件的父组件实例对象,用于子级获取父级数据并修改父级数据。

子级:

<template><div>{{name}}</div><button @click="changeParent($parent)">修改父级的数据</button>
</template><script setup lang="ts">import {ref} from 'vue'let name = ref('sansan')// 改动父组件的数据function changeParent(parent:any){// 因为parent是响应式对象了,当访问parent.parentData的时候,底层会自动读取value属性,所以里面的parentData不用再.value了parent.parentData = 10}// 使用defineExpose把数据交给外部defineExpose({name})  
</script>

父级:

<template><Child ref="child"></Child><button @click="changeName($refs)">修改Child组件的数据</button>
</template><script setup lang="ts">import Child from './child.vue'import {ref} from 'vue'let child = ref()let parentData = ref(4) // 父级数据// 改动子组件的数据function changeName(refs:object){// child.value.name="xxx"// 因为refs是响应式对象了,所以里面的name不用再.value了refs.child.name="xxx"}// 使用defineExpose把数据交给外部defineExpose({parentData})  
</script>

祖孙之间通信:provide 和inject

爷级:

<template><Child ></Child>
</template><script setup lang="ts">import Child from './child.vue'import {ref,provide} from 'vue'const location = ref('North Pole')function updateLocation() {location.value = 'South Pole'}// 向后代提供数据 所有后代都能收到provide('location',{location,updateLocation})</script>

孙级:

<template><button click="updateLocation">{{location }}</button>
</template><script setup lang="ts">import {inject} from 'vue'// 注入上层组件提供的数据const { location, updateLocation } = inject('location')
</script>

插槽

默认插槽,

具名插槽,

作用域插槽:数据在孩子那边,但根据数据生成的结构,由父亲决定,

父级:

<template>// <Child /><Child>// *默认插槽<div>{{name}}</div>// *默认插槽语法糖<div #default>{{name}}</div>// *具名插槽<template v-slot:s2><div>{{name}}</div></template><template v-slot:s1><h2>标题</h2></template><template #s1><h2>标题</h2></template> // 具名插槽语法糖// *作用域插槽 控制子组件的数据展示的结构<template v-slot="params"><div>{{params.game}} {{params.x1}}</div></template>// 作用域插槽结合具名插槽<template v-slot:slotname="params"><div>{{params.game}} {{params.x1}}</div></template></Child>
</template><script setup lang="ts">import Child from './child.vue'import {ref} from 'vue'let name= ref('里面是默认插槽的内容')
</script>

子级:

<template><div>...<slot>默认内容</slot> // 插槽占位<slot name="s1">s1内容</slot>   // *具名插槽<slot name="s2">s2内容</slot>   // *具名插槽<slot :game="game" :x1="x1"></slot>   // *作用域插槽<slot name="slotname" :game="game" :x1="x1"></slot>   // *作用域插槽也可以具名</div>
</template>

其他api:

shallowRef() 和shallowReactive() 绕开深度响应,只作用与顶层属性,避免了对每一个内部属性做响应式所带来的性能成本,提高性能。

readonly:用于创建一个对象的深只读副本,对象的所有嵌套属性都将变为只读,

shallowReadonly:只作用于对象的顶层属性,

toRaw:用于获取一个响应式对象的原始对象,toRaw返回的对象不再是响应式,不会触发试图更新,何时使用:在需要将响应式对象传递给非vue的库或外部系统时,使用toRaw可以确保得到的是普通对象。

markRaw:标记一个对象,使其永远不会变成响应式的。

customRef:创建一个自定义ref,并对其依赖的

回调函数有两个参数,track(跟踪),trigger(触发),

track()在get中调用,告诉vue数据msg很重要 你要对数据msg进行持续关注,

trigger()在set中调用,通知vue一下数据msg变化了

teleport :

小知识:样式:filter:saturate(200%) 就可以修改内容的颜色,可以整体置灰,

Vue 2和Vue 3 的区别(非兼容性改变):

全局API应用实例:

2.x 全局 API3.x 实例 API ( app)
Vue.config应用程序配置
Vue.config.生产提示移除(见下方)
Vue.config.ignoredElementsapp.config.compilerOptions.isCustomElement(见底部)
Vue.组件应用程序组件
Vue.指令应用程序指令
Vue.mixin应用程序.mixin
Vue.useapp.use(见下方)
Vue.原型app.config.globalProperties(见底部)
Vue.扩展移除(见下方)

项目搭建:

1,环境准备:

node > v16.

pnpm

2,初始化项目:

使用vite进行构建,

安装pnpm:npm i pnpm -g

项目初始化命令:pnpm create vite

进入项目根目录安装依赖: pnpm install

运行:pnpm run dev

引入图标:

<template>
<!-- <use xlink:href="#icon-home" fill="red"></use> -->
<!-- 封装成组件 -->
<use :xlink:href="name" :fill="color"></use>
</template>
<script setup lang="ts">// 接受父组件传递过来的参数defineProps({name:String,color:String})
</script>

api封装,用户信息存储,router,

TS

ts是js的超集,js是一种弱类型动态语言

类型声明:

// 类型断言 用来告诉解析器 变量的实际类型
s=a as string 
// 复合类型 
let b:number | boolean 
// 表示空 没有返回值
function fn():void{
}
// 永远不会返回结果
function fn2():never{
}
// 枚举
enum Gender = {male=0,female=1,name,age
}
let i:Gender
// 类型的别名 声明一个某类型的字段
type myType = 1|2|3
let k:myType
// 数组
let arr:number[] = [1,2,3]
let arr:Array<string> = ['a','s','d']
// 元组
let t1:[number,string,number?] = [1,'a']

面向对象

类:对象的模型,程序中可以根据类创建指定类型的对象,

class 类名{属性名:类型;
}// 例子:
class Person{// 实例属性name:string='124'// 静态属性 可以不创建实例直接访问类static age:number=18// 只读属性readonly id:string='1111'// 可以在任意位置访问(修改)public _name:string// 私有属性 只能在类内部进行访问  可以通过在类中添加方法使得私有属性可以被外部访问private _name:string// 受包含的属性 只能在当前类和当前类的子类中使用protected _name:string// 定义方法sayHollow(){ }// 构造函数 会在对象创建时调用constructor(name:string,age:number){// 给属性赋值console.log(this,'this表示当前的实例,可以通过this向新建的对象中添加属性')this.name= namethis.age = age}
}
// 创建实例对象
const per = new Person()
const per = new Person(name:'shanshan',age:12)
console.log(per.name)
console.log(Person.age)
per.sayHollow() // 调用方法

继承:

子类将会拥有父类所有的方法和属性,可以将多个类中共有的代码写在一个父类中,

如果想在子类中加一些自己的方法也可以直接加

class Cat extends Person{// 子类自己的方法run(){}// 子类也可以重写从父类继承过来的方法sayHollow(){}// 使用supermyMethod(){// super就表示当前类的父类super.sayHollow()}// 如果在子类中也写了构造函数,必须要再掉一次父类的构造函数constructor(name:string,age:number){super(name)this.age = age}}

抽象类:专门用来被子类继承 被子类继承时 子类不能创建实例对象 constructor

可以添加抽象方法,

abstract class Animal{name:stringconstructor(name:string,age:number){this.name= name}// 定义抽象方法 子类必须对抽象方法进行重写abstract sayHollow():void
}class Cat extends Animal{sayHollow(){// 必须要实现}
}let cat = new Cat(name:'shanshan')
cat.sayHollow()

接口:

// 用来定义一个类结构
// 接口可以在定义类的时候去限制类的结构
// 接口中的所有属性都不能有实际的值
// 接口只定义对象的结构 不考虑实际值
// 在接口中所有的方法都是抽象方法
interface myInter{name:string;sayHellow():void;
}
const obj:myInter={name:'sansan',
}
// 定义类时,可以使类去实现一个接口,实现接口就是使类满足接口的要求
class MyClass implements myInter {name:string;constructor(name:string){this.name=name}sayHellow(){console.log(1)}
}

泛型:

// 在定义函数或是类的时候,如果遇到类行不明确就可以使用泛型
function fn<T>(a:T):T{return a
}
// 使用
fn(a:10) // 不指定泛型
fn<number>(a:1) // 指定泛型
fn<string>(a:'123') // 指定泛型
// 声明接口
interface Inter {b:number
}
// T extends Inter表示泛型T必须是Inter 实现类(子类)
function fn3<T extends Inter>(a:T):number{return a.b
}
class Myclass<T>{name:T
}
const mc = new Myclass<string>(name:'shanshan')

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

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

相关文章

003-10-02【Spark官网思维笔记】香积寺旁老松树边马大爷家女儿大红用GPT学习Spark入门知识

003-10-02【Spark官网思维笔记】香积寺旁老松树边马大爷家女儿大红用GPT学习Spark入门知识. Spark 快速入门快速开始使用 Spark Shell 进行交互式分析&#xff1a;独立的应用程序其他 1, 使用 Spark Shell 进行交互式分析1.1 基本1.2 有关Dataset操作的更多信息1.3 缓存 2&…

【算法每日一练]-动态规划 (保姆级教程 篇16) #纸带 #围栏木桩 #四柱河内塔

目录 今日知识点&#xff1a; 计算最长子序列的方案个数&#xff0c;类似最短路径个数问题 四柱河内塔问题&#xff1a;dp[i]min{ (p[i-k]f[k])dp[i-k] } 纸带 围栏木桩 四柱河内塔 纸带 思路&#xff1a; 我们先设置dp[i]表示从i到n的方案数。 那么减法操作中&#xff…

邻接矩阵、可达性矩阵、完全关联矩阵、可达性矩阵的计算

邻接矩阵&#xff1a;很简单&#xff0c;就是两个点有关系就是1&#xff0c;没有关系就是0 可达性矩阵&#xff1a;非常简单&#xff0c;两点之间有路为1&#xff0c;没有路为0 可发行矩阵的计算&#xff1a;有n个元素&#xff0c;初始可达性矩阵为A&#xff0c;那么最终的矩阵…

EtherCAT驱动器回零与控制器回零:EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(九)

XPCIE1032H功能简介 XPCIE1032H是一款基于PCI Express的EtherCAT总线运动控制卡&#xff0c;可选6-64轴运动控制&#xff0c;支持多路高速数字输入输出&#xff0c;可轻松实现多轴同步控制和高速数据传输。 XPCIE1032H集成了强大的运动控制功能&#xff0c;结合MotionRT7运动…

HelpLook VS Bloomfire:知识管理工具选哪个合适?

在快速发展的信息社会&#xff0c;知识管理变得越来越重要。无论是企业还是个人&#xff0c;都需要一种有效的工具来管理、搜集和分享知识&#xff0c;以提高效率和协作能力。面对市面上各种各样的知识管理工具&#xff0c;就是不知道怎么去挑合适的。HelpLook和Bloomfire是我今…

单调栈练习(四)— 统计全 1 子矩形

题目 同样的LeetCode原题&#xff1a;题目链接 给你一个 m x n 的二进制矩阵 mat &#xff0c;请你返回有多少个 子矩形 的元素全部都是 1 。 单调栈 解题思路整体和上一篇文章差不多&#xff0c;都是用到了压缩数组的技巧&#xff0c;通过压缩数组来构建一个数组矩阵、以每一…

python代码学习

图像归一化处理&#xff1a; 在代码中看到图像的2种处理方式&#xff1a; img/255.0image image/ 255img/127.5 - 1 image (image-127.5 )/ 127.5 第一种是对图像进行归一化&#xff0c;范围为[0, 1]&#xff0c;第二种也是对图像进行归一化&#xff0c;范围为[-1, 1]&am…

记录仪可作为XCP从站进行数据转发

车辆数据采集系统通常包含多种数据采集设备、多路总线或传感器信号&#xff0c;为了集中监控和管理&#xff0c;需要将这些设备的实时数据传输到上位机。对此&#xff0c;我们将使用基于XCP&#xff08;Universal Measurement and Calibration Protocol&#xff09;协议的数据记…

HDFS相关API操作

文章目录 API文档环境配置API操作准备工作创建文件夹文件上传文件下载文件删除文件的更名和移动获取文件详细信息 API文档 HDFS API官方文档&#xff1a;https://hadoop.apache.org/docs/r3.3.1/api/index.html 环境配置 将Hadoop的Jar包解压到非中文路径&#xff08;例如D:…

在线图表编辑工具Draw.io本地部署并结合内网穿透实现远程协作办公

前言 提到流程图&#xff0c;大家第一时间可能会想到Visio&#xff0c;不可否认&#xff0c;VIsio确实是功能强大&#xff0c;但是软件为收费&#xff0c;并且因为其功能强大&#xff0c;导致安装需要很多的系统内存&#xff0c;并且是不可跨平台使用。所以&#xff0c;今天给…

PHP开发日志 ━━ 不同方法判断某个数组中是否存在指定的键名,测试哪种方法效率高

我们可以用isset($arr[a]) 或者 array_key_exists(a, $arr) 来判断a键名是否存在与$arr数组。 那么这两种方式哪个运行速度快呢&#xff1f; 不多废话了&#xff0c;现在我们写一段代码来测试一下&#xff1a; $array [a > 1, b > 2, c > 3];$start microtime(tru…

如何让软文获取更多流量?

软文推广作为大中小企业常用的推广方式&#xff0c;能够提高品牌形象&#xff0c;打造企业知名度、促进产品转化方面有着非常不错的效果&#xff0c;而且成本较低&#xff0c;风险较小。但有许多企业不清楚软文营销到底怎么做才能获得更多流量&#xff0c;今天媒介盒子就来和大…

Zookeeper+Kafka概述

一 Zookeeper 1.1 Zookeeper定义 Zookeeper是一个开源的、分布式的&#xff0c;为分布式框架提供协调服务的Apache项目。 1.2 Zookeeper特点 Zookeeper&#xff1a;一个领导者&#xff08;leader&#xff09;&#xff0c;多个跟随者&#xff08;Follower&#xff09;组成的…

视频内容的创作要领有哪些?

1. 垂直领域内容输出 作为视频发布者&#xff0c;我们需要确保动态内容与账号定位相匹配&#xff0c;并专注于垂直领域。通过长期稳定的内容输出&#xff0c;我们可以提高账户权重&#xff0c;吸引到更多且更为精确的粉丝流量。确保内容的质量和相关性&#xff0c;将有助于提高…

Python 黑名单IP绕过(127.0.0.1绕过)Payload代码

目录 需求 代码 需求 1. 绕过防护工具中设置的黑名单IP 2. IP包含各种外网IP、局域网IP、127.0.0.1 代码 import socket import structdef ip_default_local(ips, ip):ips.add("127.0.0.1")ips.add("0.0.0.0")ips.add("localhost")def ip_d…

haiku实现简单的dropout模块

Dropout是一种常用的正则化方法&#xff0c;用于减少神经网络的过拟合现象。它的基本思想是在训练神经网络的过程中&#xff0c;随机地将一部分神经元的输出值置为0&#xff0c;从而使得神经网络的结构变得不稳定&#xff0c;从而强制网络学习到更加鲁棒的特征表示。 haiku 自…

Java中使用lamda表达式进行foreach,优雅处理集合List为null的情况

Java中使用lamda表达式进行foreach&#xff0c;优雅处理集合List为null的情况 一&#xff1a;举例方法 在使用Java 8及以上版本的Stream API时&#xff0c;如果你想要优雅地处理可能为空的List&#xff0c;可以使用以下方法 1、提前检查 在调用stream之前&#xff0c;先检查…

基于JAVA的社团管理系统的设计与实现

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;一 、设计说明 1.1 课题背景 互…

网络层详解

目录 前言 一、IP协议 1、IP协议报头 2、协议字段理解 &#xff08;1&#xff09;4位版本 &#xff08;2&#xff09;4位首部长度 &#xff08;3&#xff09;8位服务类型 &#xff08;4&#xff09;16位总长度 &#xff08;5&#xff09;标识、标志与片偏移 &#xf…

【ITK库学习】使用itk库进行图像分割(四):水平集分割

目录 1、水平集2、itkFastMarchingImageFilter 快速步进分割3、itkShapeDetectionLevelSetImageFilter 快速步进分割 1、水平集 水平集是跟踪轮廓和表面运动的一种数字化方法。基于图像的亮度均值、梯度、边缘特征的微分计算&#xff0c;进行水平集分割。在itk中&#xff0c;所…