Vue-4: 组件通信学习

Vue-4

文章目录

  • Vue-4
      • 01-scoped组件的样式冲突
          • scoped原理
      • 02-data是一个函数
          • 代码
      • 03-组件通信
          • 组件关系分类:
          • 父子关系组件的使用
      • 04-props详解
        • 01-prop
          • 作用
          • 特点
        • 02-props 校验
          • 03-prop & data 单向数据流
      • 05-小黑记事本(组件版)
          • 核心步骤
          • 添加功能
          • 删除功能
          • 底部合计
          • 清空功能
          • 持久化存储
      • 06-非父子通信-(事件总线)
      • 07-非父子通信-provide & inject
          • 代码示例
      • 08-v-model原理
          • 01-表单类组件封装(下拉菜单)
          • 02-父组件 v-model简化代码
      • 09-sync修饰符
      • 10-ref 和 $refs
          • 1.获取dom元素:
          • 2.获取组件实例
      • 11- Vue 异步更新 、$nextTick

01-scoped组件的样式冲突


默认情况下:写在组件的样式会 全局生效 -> 因此很容易造成多个组件之间的样式冲突问题。

  1. 全局样式:默认组件中的样式会作用到全局
  2. 局部样式:可以给组件加上 scoped属性,可以让样式只作用于当前组件。

<!-- 默认的style样式,会作用于全局样式 加上了 scoped属性样式,只会作用于当前组件样式
-->
<style scoped>
div {border: 2px solid blue;margin: 30px;
}
</style>

推荐加上scoped属性,让组件拥有独立的样式。


scoped原理
  1. 给当前的组件模板所有元素,都会被添加上自定义属性 data-v-hash 利用hash的值[data-v-5f6a9d56]来区分不同组件
  2. css选择器后面被自动处理添加上了属性选择器。div[data-v-5f6a9d56]

最终效果:必须是当前组件的元素,才会有这个自定义属性,才会被这个样式作用到。


02-data是一个函数


  1. 一个组件的data选项必须是一个函数。保证每个组件实例,维护独立的一份数据对象。
  2. 每次创建新的组件实例,都会新执行一次 data 函数,得到一个新对象。

data () {

return {

​ count: 100

}

}


代码

<template><div class="base-count"><button @click="count--">-</button><span>{{ count }}</span><button @click="count++">+</button></div>
</template><script>
export default {data () {return {count: 999}}
}
</script>

每次初始化组件实例的时候,就会调用一次data函数,得到一个独立的对象,不会印象到别人的数据。


03-组件通信


什么是组件通讯呢?

  • 组件通信,就是指 组件与组件之间的数据传递。
  1. 组件的数据是独立的,无法直接访问其他组件的数据。
  2. 想用其他组件的数据 -> 就得使用 组件通信

组件关系分类:
  1. 父子关系

    父传子props 和 子传父$emit

  2. 非父子关系

    1. provide & inject
    2. eventbus
  • 通用(终极)解决方案:Vuex(适合复杂业务场景)

父子关系组件的使用
  1. 父传子props
    // 准备好数据data () {return {myTitle: 'Veu'}},<!-- 1. 给组件标签,添加属性的方式,传值 -->
<SonDemo :title="myTitle"></SonDemo>// 2、通过props进行接收传递过来的属性
props: ['title']//使用
{{ title }}

  1. 子传父 $emit
<button @click="changeFn">修改title</button>
methods: {changeFn() {// 1、通过$emit,向父组件发送消息通知this.$emit('changeTitle','子组件')}
<!-- 2、父组件:对消息进行监听 -->
<SonDemo :title="myTitle" @changeTitle="handleChange"></SonDemo>
methods: {handleChange (newTitle) {// 3、提供处理函数,提供逻辑this.myTitle = newTitle}},

04-props详解


01-prop

答:prop是组件上注册的一些 自定义属性

作用
  1. 作用: 向子组件传递数据
特点
  1. 可以传递任意数量的 prop
  2. 可以传递 任意类型的 prop

1.导入注册并准备数据在App.vue中
import UserInfo from './components/UserInfo.vue'
export default {// 数据由父组件data函数提供data () {return {username: '小帅',age: 28,isSingle: true,car: {brand: '宝马',},hobby: ['篮球','足球','羽毛球']}},components: {UserInfo}
}
2.给组件注册自定义属性<!-- 组件上注册自定义属性 --><UserInfo:username="username":age="age":isSingle="true":car="car":hobby="hobby"></UserInfo>
3.利用props父传子通信数据props: ['username','age','isSingle','car','hobby']4.子组件使用模板语法进行使用<div class="userinfo"><h3>我是个人信息组件</h3><div>姓名:{{ username }}</div><div>年纪:{{ age }}</div><div>是否单身:{{ isSingle? '是' : '否'}}</div><div>座驾:{{ car.brand}}</div><div>兴趣爱好:{{ hobby.join('、') }}</div></div>

02-props 校验


作用:为组件的prop指定验证要求,不符合要求的,控制台会有错误显示, 帮助开发者,快速发现错误。

语法

  1. 类型校验
  2. 非空校验
  3. 默认值
  4. 自定义校验

写法:需要将原来的写法(数组),改为对象的写法。

props: {

}


  1. 类型校验(基础写法)
  // props: ['w']props: {w: Number  //Number String Boolean Array Object}
}

  1. 完整写法

类型、非空、默认值、自定义

  // 完整写法props: {w: {// 1、类型判断type: Number,// 2、非空判断required: true,// 3、默认值(没有值的时候)default: 0,// 4、自定义判断validator (value) {// console.log(value)if (value >= 0 && value <= 100) {return true} else {console.error('传入的porp w 必须是0~100之间的数字')return false}}}}

03-prop & data 单向数据流

共同点: 都可以给组件提供数据

区别:

  1. data 的数据是自己的 -> 随便修改
  2. prop 的数据是外部的 -> 不能直接改,要遵循 单向数据流

1.自己的数据自己改(谁的数据谁负责)

2.prop传过来的数据(外部的数据),不能直接改

App.vue
<script>
import BaseCount from './components/BaseCount.vue'
export default {data () {return {count: 666}},methods: {// 监听事件的处理函数handleChange (newCount) {// console.log(newCount)this.count = newCount}},
// 注册
components: {BaseCount
}
}==========================分割线=========BaseCount// 不能直接改props: {count: Number},methods: {handleAdd () {this.$emit('changeCount' ,this.count + 1)},handleDel () {this.$emit('changeCount',this.count - 1)}}
}
</script>

单向数据流:父组件的prop更新;会单项的向下流动,影响到子组件数据

口诀:谁的数据谁负责


05-小黑记事本(组件版)


核心步骤
  1. 渲染功能

    1. 提供数据 → 提供在公共的父组件 App.vue中

    2. 通过父传子,将数据传递给 TodoMain

    3. 利用 v-for 渲染

    添加功能

    1. 收集表单数据 → v-model

    2. 监听事件 (回车 + 点击 都要进行添加)

    3. 子传父 ,将任务名称传递给父组件 App.vue

    4. 进行添加, unshift (自己的数据自己负责)

    删除功能

    1. 监听事件 (监听点击事件) 携带 id

    2. 子传父, 将删除的 id 传递给父组件 App.vue

    3. 进行删除 filter (自己的数据自己负责)

    底部合计

    1. 父传子传list → 渲染

    清空功能

    1. 注册监听点击事件

    2. 子传父 → $emit → list = []

    持久化存储

    1. watch深度监视list变化 → 往本地存储 → 进入页面优先往本地存储

##### **渲染功能**
  1. 提供数据 → 提供在公共的父组件 App.vue中

  2. 通过父传子,将数据传递给 TodoMain

  3. 利用 v-for 渲染

1.提供数据 → 提供在公共的父组件 App.vue中list: JSON.parse(localStorage.getItem('list')) || [{ id: 1, name: "打篮球" },{ id: 2, name: "陪女朋友过七夕" },{ id: 3, name: "看电影逛街" },],
2.通过父传子,将数据传递给 TodoMain// 利用组件通信 父传子传递数据props: {list: Array},
3.利用v-for渲染<li v-for="(item,index) in list" :key="item.id" class="todo"><div class="view"><span class="index"> {{index + 1}}.</span> <label>{{ item.name }}</label><button @click="todoDel(item.id)" class="destroy"></button></div></li>

添加功能
  1. 收集表单数据 → v-model

  2. 监听事件 (回车 + 点击 都要进行添加)

  3. 子传父 ,将任务名称传递给父组件 App.vue

  4. 进行添加, unshift (自己的数据自己负责)

1.收集表单数据  → v-model<input@keyup.enter="handleAdd"v-model="todoTask"placeholder="请输入任务"class="new-todo"/>2.监听事件 (回车 + 点击 都要进行添加)<button @click="handleAdd" class="add">添加任务</button>3.子传父 ,将任务名称传递给父组件 App.vuemethods: {handleAdd() {if (this.todoTask.trim() === '') {alert('输入内容不能为空')return}// 数据是App.vue的,需要通知他,让他该this.$emit("addTask", this.todoTask);// 清空数据框内容this.todoTask = "";},},4.进行添加, unshift (自己的数据自己负责)<TodoHeader @addTask="handleAdd"></TodoHeader>handleAdd(newValue) {// 对list数据添加(list是App.vue的)this.list.unshift({ id: +new Date(), name: newValue });},

删除功能
  1. 监听事件 (监听点击事件) 携带 id

  2. 子传父, 将删除的 id 传递给父组件 App.vue

  3. 进行删除 filter (自己的数据自己负责)

1.监听事件 (监听点击事件)  携带 id<button @click="todoDel(item.id)" class="destroy"></button>2.子传父, 将删除的 id 传递给父组件 App.vuemethods: {todoDel (id) {//  2. 子传父, 将删除的 id 传递给父组件 App.vuethis.$emit('changeDel', id)}}3.进行删除  filter (自己的数据自己负责)delTask (id) {// 3. 进行删除  filter (自己的数据自己负责)this.list = this.list.filter(item => item.id !== id)  //与子组件传递过来的id进行匹配过滤},

底部合计
  1. 父传子传list → 渲染
1.父传子传list → 渲染<!-- 底部 --><TodoFooter @removeTask="removeList" :list="list"></TodoFooter><span class="todo-count">合 计:<strong> {{ list.length }} </strong></span>

清空功能
  1. 注册监听点击事件

  2. 子传父 → $emit → list = []

1.注册监听点击事件 <button @click="removeTask" class="clear-completed">清空任务</button>2.子传父 → $emit → list = []methods: {removeTask () {//  2. 子传父 → $emit → list = []this.$emit('removeTask')}}
3.父组件中处理removeList () {// 监听子组件的通知后,执行删除功能this.list = []}

持久化存储
  1. watch深度监视list变化 → 往本地存储 → 进入页面优先往本地存储
  watch: {list: {deep: true,handler (newValue) {// 将监视的list的数据存入到本地localStorage.setItem('list', JSON.stringify(newValue))}}}// 逻辑或终端,本地有 → 用本地的 没有 → 用list数组默认数据list: JSON.parse(localStorage.getItem('list')) || [{ id: 1, name: "打篮球" },{ id: 2, name: "陪女朋友过七夕" },{ id: 3, name: "看电影逛街" },],

06-非父子通信-(事件总线)


作用;非父子组件之间,进行简易消息传递,(复杂场景 → Vuex)

一对多的关系(一个组件发送,只要监听了的都可以访问到)

使用方法:

  1. 创建一个都能访问到的事件总线 (空Vue实例) → utils /EventBus.js
  2. 接收方,监听Bus实例的事件
  3. 发送方,触发 Bus实例的事件

1.创建一个都能访问到的事件总线 (空Vue实例) → utils /EventBus.js

// 1.创建爱一个都能访问到的事件总线(空的 Vue 实例)
import Vue from 'vue'const Bus = new Vue()export default Bus

2.接收方,监听Bus实例的事件

<script>
import Bus from '../utils/EventBus'
export default {created () {// 2.在 A组件(接收方,进行监听Bus的事件 (订阅消息)Bus.$on('sendMsg',(msg) =>{this.msg = msg})},data () {return {msg: ''}}}
</script>

3.发送方,触发 Bus实例的事件

  <script>import Bus from '../utils/EventBus'export default {methods: {clickSend () {//3.B组件(发送方) 触发事件的方式传递参数(发布消息)Bus.$emit('sendMsg','今天是七夕节,准备怎么过呢?可惜一个人过!')}}}</script>

07-非父子通信-provide & inject


作用是跨层级共享数据

provide共享的数据

  1. 简单数据类型:非响应式的
  2. 复杂数据类型:是响应式的

通常使用就是使用包对象的形式(复杂数据类型)共享

代码示例
共享 1.父组件 provide 提供数据
<script>
export default {provide () {return {普通类型(非响应式的)color: this.color,复杂类型(响应式的)
}
}
}使用  2. 子孙组件 inject  取值使用export default {inject: ['color',userInfo],created () {console.log(this.color,this.userInfo)}}
</script>

08-v-model原理


原理:v-model本质上就是一个语法糖。例如应用在输入框上,就是value属性 和 input事件的合写。

子组件不能直接是有个v-model访问父组件的数据的,因为没有权限,需要通过组件通信 + value 和 事件来解决。

**作用:**实现数据双向绑定

  1. 数据变,视图跟着变:value
  2. 视图变,数据跟着变:@input

注意:$event 用于模板中,获取事件的形参

    <!-- v-model原理:等价于 :value和 @input的合体 --><input v-model="msg1" type="text"><br><br><!-- 模板中获取时间的形参,使用$event → 获取 --><input :value="msg2" @input="msg2 = $event.target.value" type="text"><br><br>

01-表单类组件封装(下拉菜单)
  1. 父传子:数据 应该是父组件props传递过来的,v-model拆解绑定数据
  2. 子传父: 监听输入,子传父传值给父组件修改
父组件
<BaseSelect:cityId="selectId"//监听子组件的事件,实现值的修改@changeId="selectId = $event"></BaseSelect>子组件<select :value="cityId" @change="handleChaneg" name="" id=""><option value="101">北京</option><option value="102">上海</option><option value="103">武汉</option><option value="104">深圳</option><option value="105">广州</option></select>
<script>
props: {cityId: String
},
methods: {handleChaneg (e) {this.$emit('changeId',e.target.value)}
}
</script>

这里使用了 :value 和 @change事件 实现子组件和父组件双向绑定


02-父组件 v-model简化代码

父组件 v-model 简化代码,实现 子组件 和 父组件 数据双向绑定

  1. 子组件中:props通过value接受,事件触发input
  2. 父组件中: v-model 给组件直接绑定数据

前提条件:value接收 input事件触发

父传子  使用 value 传值
props: {value: String
},子传父  使用 input 事件触发
methods: {handleChaneg (e) {this.$emit('input',e.target.value)}
}这样父组件中才能使用 v-model<BaseSelectv-model="selectId"></BaseSelect>

09-sync修饰符


**作用:**可以实现 子组件 与 父组件数据的 双向绑定,简化代码

特点: prop属性名 ,可以自定义。非固定的value

场景:封装弹框类的基础组件,visible属性 true显示,false隐藏。

本质:就是**:属性名** 和 @ updata:属性名的 合写

父组件
<BaseDialog :visible.sync="isShow">
</BaseDialog>子组件
props: {//visible就是父组件传过来的属性名visible: Boolean
}methods: {close () {//通知父组件控制显示和隐藏this.$emit('updata:visible',fasle)这里的事件名在父组件中使用了sync修饰符,就相当于省略了事件监听。
}
}

10-ref 和 $refs


作用:利用 ref 和 refs可以用于获取dom元素,或组件实例

特点:查找范围 → 当前组件内(更精确稳定)

1.获取dom元素:

① 目标标签 - 添加 ref属性

<div ref="chartRef">我是渲染图标的容器</div>

②恰当时机,通过this.$refs.chartRef,获取目标标签

mounted () {

​ console.log(this.$refs.chartRef)

}

① 目标标签 - 添加 ref属性
<div ref="mychart" class="base-chart-box"></div>②恰当时机,通过this.$refs.chartRef,获取目标标签const myChart = echarts.init(this.$refs.mychart);

使用ref 和 $refs,哪怕获取到相同的类名元素,我依旧值局限于当前组件我添加了ref属性的元素,其他的我都不管。

querySelector 查找的范围 → 整个页面(很容易出错)


2.获取组件实例

利用res 和 $refs 获取组件实例

①目标组件 - 添加 ref 属性

②恰当时机,通过this.$refs.xxx,获取目标组件,就可以调用组件对象里面的方法

父组件 App.vue代码①目标组件 - 添加 ref 属性<BaseForm ref="baseForm"></BaseForm>②恰当时机,通过this.$refs.xxx,获取目标组件,就可以调用组件对象里面的方法
<script>
// 导入组件
import BaseForm from './components/BaseForm.vue'
export default {
// 注册组件
components: {BaseForm
},
methods: {// 获取数据的执行函数handleGet () {// 获取组件,然后直接调用子组件封装好的方法console.log(this.$refs.baseForm.getValues())},// 重置数据的执行函数handleReset () {this.$refs.baseForm.resetValues()}
}子组件 BaseForm代码<template><form action="">账号:<input v-model="username" type="text"><br><br><hr>密码:<input v-model="password" type="password"><br></form>
</template><script>
export default {data () {return {username: '',password: ''}},methods: {// 方法1:收集表单数据,返回一个对象getValues () {return {username: this.username,password: this.password}},// 方法2:重置表单resetValues () {this.username = ''this.password = ''}}

通过 res 和 $refs 获取组件,然后使用获取到的组件里面的方法。例如上面代码中,父组件中是获取数据和重置数据使用的方法。就是从子组件中封装好的方法。


11- Vue 异步更新 、$nextTick

需求:编辑标题,编辑框自动将聚焦

  1. 点击编辑,显示编辑框

  2. 让编辑框,立刻获取焦点(focus)

    <script>
    this.isShowEdit = true	//显示输入框
    this.$refs.inp.focus()	//获取焦点
    </script>
    

    问题:在Vue中,这样写代码 “显示之后”,立刻获取焦点是不能成功的!

    <script>methods: {handleEdit () {// 1.显示输入框this.isShowEdit = true// 2.让 输入框 获取焦点  (Veu 是异步获取dom元素的)this.$refs.inp.focus()   //执行到这里的时候,其实dom还没有获取到。所以会出现问题}}
    </script>
    

原因:Vue是 异步更新 DOM (提升性能)


解决方发: $nextTick: 等DOM更新后,才会触发执行此方法里面的函数体。

一但DOM加载完毕,立即执行$nextTick方法里面的函数方法

<script>methods: {handleEdit () {// 1.显示输入框this.isShowEdit = true// 2.让 输入框 获取焦点  (Veu 是异步获取dom元素的)this.$nextTick(() => {this.$refs.inp.focus()})}}</script>

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

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

相关文章

Linux:基础指令

目录 Linux的基础指令 1.ls指令 2.pwd指令 3.cd指令 4.touch指令 5.mkdir指令 6.rmdir指令和rm指令 7.man指令&#xff08;重要&#xff09; 8.cp指令&#xff08;重要&#xff09; 9.mv指令&#xff08;重要&#xff09; 10.cat指令 11.nano指令 12.more指令 13.…

Go 1.21新增的 maps 包详解

maps 包提供了几个非常有用的用于操作 map 类型&#xff08;任何类型的 map&#xff09;的函数&#xff0c;本文接下来详细介绍下这几个函数。 maps.Clone 定义如下&#xff1a; func Clone[M ~map[K]V, K comparable, V any](m M) M 返回 m 的一个副本&#xff0c;因为新的…

PHP8的匿名函数-PHP8知识详解

php 8引入了匿名函数&#xff08;Anonymous Functions&#xff09;&#xff0c;它是一种创建短生命周期的函数&#xff0c;不需要命名&#xff0c;并且可以在其作用域内直接使用。以下是在PHP 8中使用匿名函数的知识要点&#xff1a; 1、创建匿名函数&#xff0c;语法格式如下&…

Oracle-rolling upgrade升级19c

前言: 本文主要描述Oracle11g升19c rolling upgrade升级测试&#xff0c;通过逻辑DGautoupgrade方式实现rolling upgrade&#xff0c;从而达到在较少停机时间内完成Oracle11g升级到19c的目标 升级介绍&#xff1a; 升级技术: rolling upgrade轮询升级&#xff0c;通过采用跨版…

transform_train.json文件解析

transform_train.json 文件内容解析transform_matrix 文件内容解析 {"camera_angle_x": 0.6911112070083618,"frames": [{"file_path": "./train/r_0","rotation": 0.012566370614359171,"transform_matrix": [[…

快速掌握MQ消息中间件rabbitmq

快速掌握MQ消息中间件rabbitmq 目录概述需求&#xff1a; 设计思路实现思路分析1.video 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,c…

02.sqlite3学习——嵌入式数据库的基本要求和SQLite3的安装

目录 嵌入式数据库的基本要求和SQLite3的安装 嵌入式数据库的基本要求 常见嵌入式数据库 sqlite3简介 SQLite3编程接口模型 ubuntu 22.04下的SQLite安装 嵌入式数据库的基本要求和SQLite3的安装 嵌入式数据库的基本要求 常见嵌入式数据库 sqlite3简介 SQLite3编程接口模…

2023-08-27力扣每日一题-QWQ

链接&#xff1a; 56. 合并区间 题意&#xff1a; 如题 解&#xff1a; 排序题&#xff0c;先将最早出现且最大的区间放在前面即可&#xff0c;差一点就要补卡了 23:59通过 实际代码&#xff1a; #include<bits/stdc.h> using namespace std; class Solution { pu…

Eclipse(STS):pom.xml 报错:Multiple markers at this line

pom.xml 报错&#xff1a;Multiple markers at this line STS中&#xff0c;项目能够正常运行&#xff0c;但是 pom.xml 报错&#xff1a;Multiple markers at this line 项目本身没有任何修改&#xff0c;之前不报错的&#xff0c;突然报错了。 Multiple markers at this li…

LLM-Rec:基于提示大语言模型的个性化推荐

1. 基本信息 论文题目:LLM-Rec: Personalized Recommendation via Prompting Large Language Models 作者:Hanjia Lyu, Song Jiang, Hanqing Zeng, Yinglong Xia, Jiebo Luo 机构:University of Rochester, University of California Los Angeles, Meta AI, University of Ro…

手写RPC框架--1.介绍与网络传输

介绍与网络传输 0.介绍a.什么是rpcb.rpc的通信流程 1.网络传输a.零拷贝1) 零拷贝的概念2) Netty的零拷贝 b.IO多路复用c.Netty入门1) netty中的helloworld d.封装报文1) 协议结构2) 模拟封装报文 e.序列化f.压缩和解压缩 0.介绍 a.什么是rpc rpc 的全称是 Remote Procedure C…

计算机视觉 – Computer Vision | CV

计算机视觉为什么重要&#xff1f; 人的大脑皮层&#xff0c; 有差不多 70% 都是在处理视觉信息。 是人类获取信息最主要的渠道&#xff0c;没有之一。 在网络世界&#xff0c;照片和视频&#xff08;图像的集合&#xff09;也正在发生爆炸式的增长&#xff01; 下图是网络上…

HTML5-2-链接

HTML使用标签 <a>来设置超文本链接。 超链接可以是一个字&#xff0c;一个词&#xff0c;或者一组词&#xff0c;也可以是一幅图像&#xff0c;您可以点击这些内容来跳转到新的文档或者当前文档中的某个部分。 默认情况下&#xff0c;链接将以以下形式出现在浏览器中&am…

Python高阶函数

高阶函数是在Python中一个非常有用的功能函数&#xff0c;所谓高阶函数就是一个函数可以用来接收另一个函数作为参数&#xff0c;这样的函数叫做高阶函数。高阶函数是函数式编程的基本前提。 函数在 Python 是一等公民&#xff08;First-Class Object&#xff09;&#xff0c;…

数据结构】二叉树篇|超清晰图解和详解:后序篇

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; 是瑶瑶子啦每日一言&#x1f33c;: 你不能要求一片海洋&#xff0c;没有风暴&#xff0c;那不是海洋&#xff0c;是泥塘——毕淑敏 目录 一、核心二、题目 一、核心 我们清楚…

wireshark过滤器的使用

目录 wiresharkwireshark的基本使用wireshark过滤器的区别 抓包案例 wireshark wireshark的基本使用 抓包采用 wireshark&#xff0c;提取特征时&#xff0c;要对 session 进行过滤&#xff0c;找到关键的stream&#xff0c;这里总结了 wireshark 过滤的基本语法&#xff0c;…

帝国CMS仿管理资源吧资料下载网站模板源码/下载会员+积分付费下载功能自动采集资源网站源码

帝国CMS仿管理资源吧资料下载网站模板源码&#xff0c;带下载会员积分付费下载功能自动采集资源网站源码&#xff0c;管理资源吧——为中小企业管理者提供全方位的管理资料下载服务&#xff1b;是一个所有资料免费下载&#xff0c;免注册、免登陆、免积分的公益性的管理知识共享…

PDF校对工具正式上线,为用户提供卓越的文档校对解决方案

为满足当下对数字化文档校对的精准需求&#xff0c;我们今日正式发布全新的PDF校对工具。经过深入的技术研发与细致的测试&#xff0c;该工具旨在为企业和个人用户带来一个高效且准确的PDF文档校对平台。 PDF校对工具的主要特性&#xff1a; 1.全面性校对&#xff1a;工具支持…

React钩子函数之useEffect,useLayoutEffect与useInsertionEffect的区别

React钩子函数在React开发中扮演着非常重要的角色。其中&#xff0c;useEffect、useLayoutEffect和useInsertionEffect是三个常用的钩子函数&#xff0c;它们的作用虽然有些相似&#xff0c;但是也存在一些区别。在本文中&#xff0c;我们将详细介绍这三个钩子函数的区别&#…

【Java】数据类型变量

【Java】数据类型&变量 文章目录 【Java】数据类型&变量1、字面常量2、数据类型3、变量3.1 整型变量3.1.1 整型变量3.1.2 长短整型变量3.1.3 字节型变量 3.2 浮点型变量3.2.1 双精度浮点型3.2.2 单精度浮点型 3.3 字符型变量3.4 布尔型变量3.5 类型转换3.5.1 自动类型转…