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

【VUE2】第三期——样式冲突、组件通信、异步更新、自定义指令、插槽

目录

1 scoped解决样式冲突

2 data写法

3 组件通信

3.1 父子关系

3.1.1 父向子传值 props

3.1.2 子向父传值 $emit

3.2 非父子关系

3.2.1 event bus 事件总线

3.2.2 跨层级共享数据 provide&inject

4 props

4.1 介绍 

4.2 props校验完整写法

5 v-model原理 

5.1 应用:表单类组件封装 

5.1.1 不用v-model的写法 

5.1.2 用v-model的写法

5.1.3 sync 修饰符

6 ref 与 $refs

6.1 获取dom元素

6.2 获取组件

7 Vue异步更新与$nextTick

8 自定义指令

8.1 基本用法

8.2 传值

9 插槽

9.1 基本用法

9.2 默认值

9.3 具名插槽

9.4 作用域插槽


1 scoped解决样式冲突

问题:

写在组件中的样式会 全局生效 → 因此很容易造成多个组件之间的样式冲突问题。

解决方法:

可以给组件加上scoped 属性,可以让样式只作用于当前组件

如: 

<style scoped></style>

scoped原理:

自动执行: 

  1. 当前组件内标签都被添加data-v-hash值 的属性

  2. css选择器都被添加 [data-v-hash值] 的属性选择器

最终效果:

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


2 data写法

一个组件的 data 选项必须是一个函数

目的是为了:保证每个组件实例,维护独立的一份数据对象

每次创建新的组件实例,都会新执行一次data 函数,得到一个新对象

如:

<script>
export default {data: function () {return {count: 100,}},
}
</script>

3 组件通信

总结:

父子通信:

1.props & $emit 父向子传值,子通知父改值        3.1

        1.1 v-model简写(不可自定义属性值)        5.1.2

        1.2 sync简写(可自定义属性值)                 5.1.3

2.ref & $refs 父主动拿子的方法与属性                  6.2

非父子通信:

1.event bus 事件总线(任意组件)                       3.2.1

2.跨层级通信(同一家族组件)                             3.2.2


3.1 父子关系

父组件通过 props 将数据传递给子组件
子组件利用 $emit 通知父组件修改更新


3.1.1 父向子传值 props

步骤:

  1. 给子组件以添加属性的方式传值
  2. 子组件内部通过props接收
  3. 模板中直接使用 props接收的值

App.vue(父组件):

<template><!-- 主体区域 --><section id="app"><!--第一步:给子组件挂上list属性,并将值赋值给list属性--><TodoMain :list="list" @del="del"></TodoMain></section>
</template><script>
//...data() {return {list: [{id: 1, content: "吃饭"},{id: 2, content: "睡觉"},{id: 3, content: "打豆豆"}],}},}
</script>

TodoMain.vue(子组件):

注意:此处props为简略用法,完整写法见下文4.2 props校验完整写法

<template><!-- 列表区域 --><section class="main"><ul class="todo-list"><!--第三步:直接使用list变量--><li class="todo" v-for="(item, index) in list" :key="item.id"><!--...--></li></ul></section>
</template><script>
export default {//第二步:props接收数据(简略写法)props: ["list"],
}
</script>

3.1.2 子向父传值 $emit

(此处为子通知父,父为被动,下文中的$refs为父主动拿子) 

步骤

  1. $emit触发事件,给父组件发送消息通知

  2. 父组件监听$emit触发的事件

  3. 提供处理函数,在函数的性参中获取传过来的参数

 TodoMain.vue(子组件):

<template><!-- 列表区域 --><section class="main"><button @click="del(item.id)" ></button></section>
</template><script>
export default {
//...methods: {dela(id) {//第一步:触发delb事件this.$emit("delb", id1)}}
}
</script>

App.vue(父组件):

<template><!-- 主体区域 --><section id="app"><!--监听子组件触发的delb事件,监听到后执行delc函数,并将子组件传过来的id1值用id2接收--><TodoMain @delb="delc"></TodoMain></section>
</template><script>
//...
export default {//...methods: {delc(id2) {console.log(id2)},},}
</script>

此为最基本写法,可以进一步化简:使用v-model或sync修饰符,具体见 5 v-model原理 


3.2 非父子关系

3.2.1 event bus 事件总线

(任意两个组件之间的通信) 

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

Event Bus(事件总线)可以有多个发送方与多个接收方

 第一步:创建事件总线实例

首先创建一个新的 Vue 实例作为事件总线,通常命名为 eventBus

这个实例就像一个中央枢纽,负责管理所有的事件

因为 Vue 实例本身具有 $on(监听事件)、$emit(触发事件)和 $off(移除事件监听器)方法,所以可以利用这些方法来实现事件的发布和订阅

// EventBus.js
import Vue from 'vue'const Bus = new Vue()export default Bus

在使用Bus事件总线时,需要先导入Bus这个实例对象

import Bus from '../utils/EventBus'

第二步:订阅事件(监听事件):

在需要接收数据或响应某个事件的组件中,使用 Bus.$on 方法来监听特定的事件

$on 方法接受两个参数:

第一个参数是事件名称(字符串)

第二个参数是当事件触发时要执行的回调函数

// 组件 A 中监听事件
Bus.$on('sendMsg', (msg) => {this.msg = msg
})

第三步:发布事件(触发事件):

在需要发送数据或通知其他组件的组件中,使用 eventBus.$emit 方法来触发特定的事件

$emit 方法的参数:

第一个参数是事件名称(必须与要监听的事件名称一致)

后面参数不限制个数及数据类型,这些参数会传递给监听该事件的回调函数

Bus.$emit('sendMsg', '这是一个消息')

第四步:取消事件监听(移除事件监听器)

(选学)

在组件销毁或不再需要监听事件时,可以使用 Bus.$off 方法来移除事件监听器,防止内存泄漏

Bus.$off([event, callback])

参数说明:

event(可选):要移除的事件名,可以是一个字符串或一个包含多个事件名的数组。如果省略该参数,则会移除所有事件监听器

callback(可选):要移除的特定回调函数。如果省略该参数,则会移除该事件名下的所有回调函数


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获取的数据,不能在自身组件内修改

inject中的属性值值也可以写成对象形式,可以设置的值:

from 用于指定从祖先组件注入的属性名。如果不使用 from,则默认使用当前定义的属性名作为注入的属性名

default 用于指定注入属性的默认值,当祖先组件没有提供对应的属性时,会使用这个默认值

      inject: {// 使用 from 指定注入属性的来源名称myUserInfo: {from: 'userInfo',// 设置默认值default: {name: '默认姓名',age: 0}},// 没有使用 from,默认使用当前属性名注入someValue: {default: '默认值'}},

4 props

4.1 介绍 

定义:

组件上 注册的一些 自定义属性

作用:

向子组件传递数据

特点:

  1. 可以 传递 任意数量 的prop

  2. 可以 传递 任意类型 的prop


4.2 props校验完整写法

语法:

props: {校验的属性名: {type: 类型,  // Number String Boolean ...required: true, // 是否必填default: 默认值, // 默认值validator (value) {// 自定义校验逻辑return 是否通过校验}}
},

示例:

<script>
export default {// 完整写法(类型、默认值、非空、自定义校验)props: {w: {type: Number,//required: true,default: 0,validator(val) {// console.log(val)if (val >= 100 || val <= 0) {console.error('传入的范围必须是0-100之间')return false} else {return true}},},},
}
</script>

注意:

1.default和required一般不同时写(因为当时必填项时,肯定是有值的)

2.default后面如果是简单类型的值,可以直接写。如果是复杂类型的值,则需要以函数的形式return一个默认


5 v-model原理 

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

<template><div id="app" ><input v-model="msg" type="text"><input :value="msg" @input="msg = $event.target.value" type="text"></div>
</template>

注意:

1.$event 用于在模板中,获取事件的形参

2.不同的表单元素, v-model在底层的处理机制是不一样的,比如给checkbox使用v-model

底层处理的是 checked属性和change事件 


5.1 应用:表单类组件封装 

5.1.1 不用v-model的写法 

(此处就是父子组件通讯的方法 3.1) 

App.vue

<template><div class="app"><BaseSelect :selectId="selectId" @changeCity="selectId = $event"></BaseSelect></div>
</template><script>
import BaseSelect from './components/BaseSelect.vue'
export default {data() {return {selectId: '102',}},components: {BaseSelect,},
}
</script><style>
</style>

BaseSelect.vue

<template><div><select :value="selectId" @change="selectCity"><option value="101">北京</option><option value="102">上海</option><option value="103">武汉</option><option value="104">广州</option><option value="105">深圳</option></select></div>
</template><script>
export default {props: {selectId: String,},methods: {selectCity(e) {this.$emit('changeCity', e.target.value)},},
}
</script><style>
</style>

5.1.2 用v-model的写法

注意:使用前需要先基于5.1.1的代码稍作修改 

 App.vue

<template><div class="app"><!--1.给子组件挂在的属性名为:value 2.监听input事件--><BaseSelect :value="selectId" @input="selectId = $event"></BaseSelect></div>
</template><script>
import BaseSelect from './components/BaseSelect.vue'
export default {data() {return {selectId: '102',}},components: {BaseSelect,},
}
</script><style>
</style>

BaseSelect.vue

<template><div><!--绑定value值--><select :value="value" @change="selectCity"><option value="101">北京</option><option value="102">上海</option><option value="103">武汉</option><option value="104">广州</option><option value="105">深圳</option></select></div>
</template><script>
export default {props: {//接收value值value: String,},methods: {selectCity(e) {//更改所触发的事件为inputthis.$emit('input', e.target.value)},},
}
</script><style>
</style>

完成上述修改后,可以对父组件(App.vue)中的代码进行简化:

原:

<BaseSelect :value="selectId" @input="selectId = $event"></BaseSelect>

改:

<BaseSelect v-model="selectId" ></BaseSelect>

此种方法缺点也显而易见,固定死了属性名必须传value ,

以下方法可以自定义属性名


5.1.3 sync 修饰符

.sync修饰符 就是 :属性名@update:属性名 合写

<!--父组件-->
<!-- .sync写法 -->
<BaseDialog :visible.sync="isShow" />
--------------------------------------
<!-- 完整写法 -->
<BaseDialog :visible="isShow" @update:visible="isShow = $event" />

对比一下上面的v-model

:value=""               变成了        :属性名=""   

@事件类型=""       变成了        @update:属性名=""

因此在组件中可以使用自定义属性名了,

但是在子组件触发的事件变成了  update:属性名

//子组件
props: {visible: Boolean
},this.$emit('update:visible', false)

除此之外其他与上述一样,本质上还是最基本的props、$emit通信


6 ref 与 $refs

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

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

而之前用document.querySelect('.box') 获取的是整个页面中的盒子

6.1 获取dom元素

1.给要获取的盒子添加ref属性

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

2.恰当时机,通过 $refs获取 this.$refs.xxx 获取

console.log(this.$refs.chartRef)

恰当时机:指的是页面渲染完(mouted时期及以后) 


6.2 获取组件

1.给目标组件添加ref属性

<BaseForm ref="baseForm"></BaseForm>

2.恰当时机,通过 this.$refs.xxx 获取目标组件

this.$refs.baseForm.组件方法()this.$refs.baseForm.属性名

7 Vue异步更新与$nextTick

需求:

编辑标题, 编辑框自动聚焦

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

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

代码:

<template><div class="app"><div v-if="isShowEdit"><input type="text" v-model="editValue" ref="inp" /><button>确认</button></div><div v-else><span>{{ title }}</span><button @click="editFn">编辑</button></div></div>
</template><script>
export default {data() {return {title: '大标题',isShowEdit: false,editValue: '',}},methods: {editFn() {// 显示输入框this.isShowEdit = true  // 获取焦点this.$refs.inp.focus() }  },
}
</script> 

问题:

"显示之后",立刻获取焦点是不能成功的!

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

解决方案:

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

语法: this.$nextTick(函数体)

this.$nextTick(() => {this.$refs.inp.focus()
})

注意:$nextTick 内的函数体 一定是箭头函数,这样才能让函数内部的this指向Vue实例


8 自定义指令

8.1 基本用法

全局注册:

//在main.js中
Vue.directive('指令名', {inserted(el) {// 可以对 el 标签,扩展额外功能el.focus()}
})

局部注册:

//在Vue组件的配置项中
directives: {"指令名": {inserted () {// 可以对 el 标签,扩展额外功能el.focus()}}
}

参数介绍:

inserted:被绑定元素插入父节点时调用的钩子函数

el:使用指令的那个DOM元素

注意:

在使用指令的时候,一定要先注册再使用,否则会报错使用指令语法: v-指令名

如:<input type="text" v-focus/>

注册指令时不用v-前缀,但使用时一定要加v-前缀


8.2 传值

1.在绑定指令时,可以通过“等号”的形式为指令 绑定 具体的参数值

<div v-color="color">我是内容</div>

2.通过 binding.value 可以拿到指令值,指令值修改会 触发 update 函数

directives: {color: {inserted (el, binding) {el.style.color = binding.value},update (el, binding) {el.style.color = binding.value}}
}

9 插槽

9.1 基本用法

  1. 组件内需要定制的结构部分,改用<slot></slot>占位

  2. 使用组件时, 如<MyDialog></MyDialog>标签,内部传入结构替换slot

  3. 给插槽传入内容时,可以传入纯文本、html标签、组件


9.2 默认值

在 <slot> 标签内,放置内容, 作为默认显示内容

效果: 

  • 外部使用组件时,不传东西,则slot会显示后备内容

  • 外部使用组件时,传东西了,则slot整体会被换掉


9.3 具名插槽

多个slot使用name属性区分名字

template配合v-slot:名字来分发对应标签

v-slot写起来太长,vue给我们提供一个简单写法 v-slot —> #


9.4 作用域插槽

作用域插槽不是插槽的一种,插槽只有两种:默认插槽与具名插槽 

定义slot 插槽的同时, 是可以传值的。给 插槽 上可以 绑定数据,将来 使用组件时可以用

使用步骤:

1.给 slot 标签, 以 添加属性的方式传值

<slot :id="item.id" msg="测试文本"></slot>

注意:所有添加的属性, 都会被收集到一个对象中

2.在template中, 通过 #插槽名= "obj" 接收,默认插槽名为 default

<MyTable :list="list"><template #default="obj"><button @click="del(obj.id)">删除</button></template>
</MyTable>

注意:传给组件数据,只能写在组价标签身上,不能写在template上,

但是接收组件的数据(#default)可以写在组件标签上(仅限默认插槽)

插槽与组件的选择:

具有逻辑操作的选组件,修改组件部分标签结构选插槽

相关文章:

【VUE2】第三期——样式冲突、组件通信、异步更新、自定义指令、插槽

目录 1 scoped解决样式冲突 2 data写法 3 组件通信 3.1 父子关系 3.1.1 父向子传值 props 3.1.2 子向父传值 $emit 3.2 非父子关系 3.2.1 event bus 事件总线 3.2.2 跨层级共享数据 provide&inject 4 props 4.1 介绍 4.2 props校验完整写法 5 v-model原理 …...

P8685 [蓝桥杯 2019 省 A] 外卖店优先级--优先队列“数组”!!!!!

P8685 [蓝桥杯 2019 省 A] 外卖店优先级 题目 解析优先队列如何判断是否使用优先队列&#xff1f;省略规则优先队列常用操作大顶堆 vs 小顶堆定义队列h队列数组 代码 题目 解析 每个外卖店会在不同的时间点收到订单&#xff0c;我们可以看见测试用例的时间顺序是不同的&#x…...

VsCode + EIDE + OpenOCD + STM32(野火DAP) 开发环境配置

VsCode EIDE OpenOCD STM32(野火DAP) 开发环境配置 接受了新时代编辑器的我&#xff0c;实在受不了Keil的上古编辑页面&#xff0c;周树人说过&#xff1a;由奢入俭难&#xff0c;下面我们一起折腾一下开源软件Vscode&#xff0c; 用以开发51和STM32&#xff0c;有错误之处&…...

JVM类加载器面试题及原理

JVM只会运行二进制文件&#xff0c;类加载器的作用就是将字节码文件加载到JVM中&#xff0c;从而让Java程序能够启动起来。 1. 类加载器的种类 启动类加载器&#xff08;BootStrap ClassLoader&#xff09;&#xff1a;加载JAVA_HOME/jre/lib目录下的库扩展类加载器&#xff…...

在 Maven 中使用 <scope> 元素:全面指南

目录 前言 在 Maven 中&#xff0c; 元素用于定义依赖项的作用范围&#xff0c;即依赖项在项目生命周期中的使用方式。正确使用 可以帮助我们优化项目的构建过程&#xff0c;减少不必要的依赖冲突&#xff0c;并提高构建效率。本文将详细介绍 的使用步骤、常见作用范围、代码…...

tomcat的安装与配置(包含在idea中配置tomcat)

Tomcat 是由 Apache 软件基金会开发的开源 Java Web 应用服务器&#xff0c;主要用于运行 Servlet 和 JSP&#xff08;JavaServer Pages&#xff09;程序。它属于轻量级应用服务器&#xff0c;适用于中小型系统及开发调试场景&#xff0c;尤其在处理动态内容&#xff08;如 Jav…...

问题解决:AttributeError: ‘NoneType‘ object has no attribute ‘text‘

项目环境&#xff1a; 我的环境&#xff1a;Window10&#xff0c;Python3.12&#xff0c;Anaconda3&#xff0c;Pycharm2024.3.4 问题描述&#xff1a; 找不到’text’这个对象 部分代码&#xff1a; Traceback (most recent call last):File "D:\IT DateFiles\PyDate\FQ…...

量子计算测试挑战:软件测试将如何迎接新纪元?

引言 在计算机技术的飞速发展中&#xff0c;量子计算(Quantum Computing)正成为下一个颠覆性的科技热点。随着谷歌、IBM、微软等科技巨头纷纷投入巨资研究量子计算&#xff0c;其应用场景正逐步扩展&#xff0c;从优化计算到密码安全&#xff0c;再到人工智能和材料科学。然而…...

读书报告」网络安全防御实战--蓝军武器库

一眨眼&#xff0c;20天过去了&#xff0c;刷完了这本书「网络安全防御实战--蓝军武器库」&#xff0c;回味无穷&#xff0c;整理概览如下&#xff0c;可共同交流读书心得。在阅读本书的过程中&#xff0c;我深刻感受到网络安全防御是一个综合性、复杂性极高的领域。蓝军需要掌…...

《机器学习数学基础》补充资料:过渡矩阵和坐标变换推导

尽管《机器学习数学基础》这本书&#xff0c;耗费了比较长的时间和精力&#xff0c;怎奈学识有限&#xff0c;错误难免。因此&#xff0c;除了在专门的网页&#xff08; 勘误和修订 &#xff09;中发布勘误和修订内容之外&#xff0c;对于重大错误&#xff0c;我还会以专题的形…...

深度学习与普通神经网络有何区别?

深度学习与普通神经网络的主要区别体现在以下几个方面&#xff1a; 一、结构复杂度 普通神经网络&#xff1a;通常指浅层结构&#xff0c;层数较少&#xff0c;一般为2-3层&#xff0c;包括输入层、一个或多个隐藏层、输出层。深度学习&#xff1a;强调通过5层以上的深度架构…...

Flutter底层实现

1. Dart 语言 Dart 是 Flutter 的主要编程语言。Dart 设计之初就是为了与 JavaScript 兼容&#xff0c;并且可以编译为机器代码运行。Dart 提供了一些特性&#xff0c;如异步支持&#xff08;通过 async 和 await&#xff09;&#xff0c;这使得编写高效的网络请求和复杂动画变…...

【芯片验证】verificationguide上的36道UVM面试题

跟上一篇一样,verificationguide上的36到UVM面试题,通义回答ds判卷。 1. What is uvm_transaction, uvm_seq_item, uvm_object, uvm_component? uvm_transaction、uvm_seq_item、uvm_object、uvm_component是什么? uvm_transaction是UVM中所有事务的基础类,用于表示仿真…...

AI日报 - 2025年3月10日

AI日报 - 2025年3月10日 &#x1f31f; 今日概览&#xff08;60秒速览&#xff09; ▎&#x1f916; AGI突破 | Anthropic CEO预测强AI最早2026年到来 &#x1f52c; SAGE框架提升问答质量61.25%&#xff0c;Reflexion框架将GPT-4成功率提至91% ▎&#x1f4bc; 商业动向 | xA…...

基于深度文档理解的开源 RAG 引擎RAGFlow的介绍和安装

目录 前言1. RAGFlow 简介1.1 什么是 RAGFlow&#xff1f;1.2 RAGFlow 的核心特点 2. RAGFlow 的安装与配置2.1 硬件与软件要求2.2 下载 RAGFlow 源码2.3 源码编译 Docker 镜像2.4 设置完整版&#xff08;包含 embedding 模型&#xff09;2.5 运行 RAGFlow 3. RAGFlow 的应用场…...

TinyWebServer项目笔记——02 半同步半反应堆线程池

目录 1.基础知识 &#xff08;1&#xff09;服务器编程基本框架 &#xff08;2&#xff09;五种I/O模型 &#xff08;3&#xff09;事件处理模式 &#xff08;4&#xff09;并发编程模式 &#xff08;5&#xff09;半同步/半反应堆 &#xff08;6&#xff09;线程池 &a…...

【技术干货】三大常见网络攻击类型详解:DDoS/XSS/中间人攻击,原理、危害及防御方案

1. DDoS攻击 1.1 什么是DDoS攻击&#xff1f; DDoS&#xff08;Distributed Denial of Service&#xff0c;分布式拒绝服务攻击&#xff09;通过操控大量“僵尸设备”&#xff08;Botnet&#xff09;向目标服务器发送海量请求&#xff0c;耗尽服务器资源&#xff08;带宽、CPU…...

用Deepseek写一个五子棋微信小程序

在当今快节奏的生活中&#xff0c;休闲小游戏成为了许多人放松心情的好选择。五子棋作为一款经典的策略游戏&#xff0c;不仅规则简单&#xff0c;还能锻炼思维。最近&#xff0c;我借助 DeepSeek 的帮助&#xff0c;开发了一款五子棋微信小程序。在这篇文章中&#xff0c;我将…...

MWC 2025 | 紫光展锐与中国联通联合发布5G eSIM 平板

2025 年 3 月 3 日至 6 日&#xff0c;在全球移动通信行业的年度盛会 —— 世界移动通信大会&#xff08;MWC 2025&#xff09;上&#xff0c;紫光展锐联合中国联通重磅发布了支持eSIM的5G平板VN300E。 该产品采用紫光展锐T9100高性能5G SoC芯片平台&#xff0c;内置8 TOPS算力…...

跟着 Lua 5.1 官方参考文档学习 Lua (12)

文章目录 5.7 – Input and Output Facilities补充内容io.input ([file])io.read ()io.write ()io.output ([file])io.lines ([filename])io.flush ()io.close ([file])io.open (filename [, mode])io.popen (prog [, mode])io.tmpfile ()io.type (ob)file:read ()file:lines (…...

操作系统控制台-健康守护我们的系统

引言基本准备体验功能健康守护系统诊断 收获提升结语 引言 阿里云操作系统控制平台作为新一代云端服务器中枢平台&#xff0c;通过创新交互模式重构主机管理体验。操作系统控制台提供了一系列管理功能&#xff0c;包括运维监控、智能助手、扩展插件管理以及订阅服务等。用户可以…...

FreeRTOS任务状态查询

一.任务相关API vTaskList&#xff08;&#xff09;&#xff0c;创建一个表格描述每个任务的详细信息 char biaoge[1000]; //定义一个缓存 vTaskList(biaoge); //将表格存到这缓存中 printf("%s /r/n",biaoge); 1.uxTaskPriorityGet&#xff08;&#xf…...

blender学习25.3.6

【02-基础篇】Blender小凳子之凳面及凳脚的创作_哔哩哔哩_bilibili 【03-基础篇】Blender小凳子之其他细节调整优化_哔哩哔哩_bilibili 这篇文章写的全&#xff0c;不用自己写了 Blender 学习笔记&#xff08;一&#xff09;快捷键记录_blender4.1快捷键-CSDN博客 shifta&a…...

Tensorflow 2.0 GPU的使用与限制使用率及虚拟多GPU

Tensorflow 2.0 GPU的使用与限制使用率及虚拟多GPU 1. 获得当前主机上特定运算设备的列表2. 设置当前程序可见的设备范围3. 显存的使用4. 单GPU模拟多GPU环境 先插入一行简单代码&#xff0c;以下复制即可用来设置GPU使用率&#xff1a; import tensorflow as tf import numpy…...

RabbitMQ 2025/3/5

高性能异步通信组件。 同步调用 以支付为例&#xff1a; 可见容易发生雪崩。 异步调用 以支付为例&#xff1a; 支付服务当甩手掌柜了&#xff0c;不管后面的几个服务的结果。只管库库发&#xff0c;后面那几个服务想取的时候就取&#xff0c;因为消息代理里可以一直装&#x…...

每日一题-----面试

一、什么是孤儿进程&#xff1f;什么是僵尸进程&#xff1f; 1.孤儿进程是指父进程在子进程结束之前就已经退出&#xff0c;导致子进程失去了父进程的管理和控制&#xff0c;成为了 “孤儿”。此时&#xff0c;这些子进程会被系统的 init 进程&#xff08;在 Linux 系统中&…...

JSP+Servlet实现对数据库增删改查功能

前提概要 需要理解的重要概念 ​MVC模式&#xff1a; Model&#xff08;person类&#xff09;&#xff1a;数据模型View&#xff08;JSP&#xff09;&#xff1a;显示界面Controller&#xff08;Servlet&#xff09;&#xff1a;处理业务逻辑 ​请求流程&#xff1a; 浏览器 …...

C++【类和对象】

类和对象 1.this 指针2.类的默认成员函数3.构造函数4.析构函数5.拷贝构造函数 1.this 指针 接上文 this指针存在内存的栈区域。 2.类的默认成员函数 定义&#xff1a;编译器自动生成的成员函数。一个类&#xff0c;我们不写的情况下会默认生成六个成员函数。 3.构造函数 函…...

GStreamer —— 2.13、Windows下Qt加载GStreamer库后运行 - “教程13:播放控制“(附:完整源码)

运行效果(音频) 简介 上一个教程演示了GStreamer工具。本教程介绍视频播放控制。快进、反向播放和慢动作都是技术 统称为 Trick Modes&#xff0c;它们都有一个共同点 修改 Normal playback rate。本教程介绍如何实现 这些效果并在交易中添加了帧步进。特别是&#xff0c;它 显…...

MongoDB winx64 msi包安装详细教程

首先我们可以从官网上选择对应版本和对应的包类型进行安装&#xff1a; 下载地址&#xff1a;Download MongoDB Community Server | MongoDB 这里可以根据自己的需求&#xff0c; 这里我选择的是8.0.5 msi的版本&#xff0c;采用的传统装软件的方式安装。无需配置命令。 下载…...