前端框架Vue3(四)——组件通信及其他API

组件通信

组件关系传递方式
父传子1. props2. v-model3. $refs4. 默认插槽、具名插槽
子传父1.props2.自定义事件3.v-model4.parent5.作用域插槽
祖传孙、孙传祖1.$attrs2.provideinject
兄弟间、任意组件间1.mitt2.pinia

【props】

概述:props是使用频率最高的一种通信方式,常用与:父<=>子

  • 父传子:属性值是非函数
  • 子传父:属性值是函数
    父组件:
<template>
<div class="father">
<h3>父组件,</h3>
<h4>我的车:{{car}}</h4>
<h4>儿子给的玩具:{{toy}}</h4>
<Child car="car" getToy="getToy"/>
</div>
</template>
<script setup lang="ts"name="Father">
import Child from './Child.vue
import ref from "vue";
//数据
const car=ref('奔驰')
const toy =ref()
//方法
function getToy(value:string){toy.value=value
}
</script>
<style scoped>
.father{
background-color:rgb(165,164,164);
padding:20px;
border-radius:10px;
}
</style>
<template>
<div class="child">
<h3>子组件</h3>
<h4>玩具:{{ toy }}</h4>
<h5>父给的车:{{ car }}</h5>
<button @click="send">把玩具交给父亲</button>
</div>
</template>
<script setup lang="ts" name="Child">import { ref } from 'vue';const toy = ref('奥特曼')defineProps(['car','sendToy'])</script>
<style scoped>
.child{
background-color:skyblue;
padding:10px;
box-shadow:00 10px black;
border-radius:10px;
}
</style>

【custom-event】

<template><div class="father"><h3>父组件</h3><h4 v-show="toy">子给的玩具:{{ toy }}</h4><!--给子组件Child绑定事件  --><Child @send-toy="getToy" /></div>
</template><script setup lang="ts" name="Father">
import { ref } from 'vue';
import Child from './Children.vue';
const toy = ref('奥特曼');
// 接收子组件传来的 toy
function getToy(value:string){
console.log('父',value)
toy.value = value
}
</script>
<template>
<div class="child">
<h3>子组件</h3>
<h4>玩具:{{ toy }}</h4>
<button @click="emit('send-toy',toy)">点击</button>
</div>
</template>
<script setup lang="ts" name="ChildEvent">
import { ref } from 'vue'
const toy = ref('奥特曼');
const emit=defineEmits(['send-toy']);
</script>
<style scoped>
.child{
background-color:skyblue;
padding:10px;
box-shadow:00 10px black;
border-radius:10px;
}
</style>

【mitt】

<template><div class="child2"><h3>子组件2</h3><h4>电脑:{{ computer }}</h4><h5>哥哥给的玩具:{{ toy }}</h5></div>
</template><script setup lang="ts" name="Child2">
import emitter from '@/tools/emitter'
import { onUnmounted, ref } from 'vue'const computer = ref('小米')
const toy = ref('')// 给emitter绑定事件
emitter.on('send-toy', (value:unknown) => {if (typeof value === 'string') {toy.value = value}
})onUnmounted(() => {emitter.off('send-toy')
})
</script>
<template>
<div class="child1">
<h3>子组件1</h3>
<h4>玩具:{{ toy }}</h4>
<button @click="emitter.emit('send-toy',toy)">玩具给弟弟</button>
</div>
</template>
<script setup lang="ts" name='Child1'>
import emitter from '@/tools/emitter';
import { ref } from 'vue'const toy=ref('奥特曼')
</script>

【v-model】

<template><div class="father"><h3>父组件</h3><h4>{{ username }}</h4><!-- v-model用在html标签上 --><!-- <input type="text" v-model="username"> --><!-- <input type="text" :value="username" @input="username = (<HTMLInputElement>$event.target).value"> --><!-- v-model用在组件标签上 --><HISTInput v-model="username"></HISTInput><!--  <HISTInput:modelValue="username"@update:modelValue="username=$event"></HISTInput> --></div>
</template>
<template><input type="text":value="modelValue"@input="emit('update:modelValue', (<HTMLInputElement>$event.target).value)">
</template><script setup lang="ts" name="HISTInput">
defineProps(['modelValue'])
const emit=defineEmits(['update:modelValue'])
</script>

【$attrs】

  1. 概述:$attrs用于实现当前组件的父组件,向当前组件的子组件通信**(祖一孙)**。
  2. 具体说明:$attrs是一个对象,包含所有父组件传入的标签属性。

注意:$attrs会自动排除props中声明的属性(可以认为声明过的props被子组件自己“消费”了)

<template><div></div>
</template><script setup lang="ts" name="GrandChild"></script><style lang="scss" scoped></style>
<template><div class="Child"><h3>孙组件</h3><h4>a:{{ a }}</h4><h4>b:{{ b }}</h4><h4>]c:{{ c }}</h4><h4>d:{{ d }}</h4><h4>x:{{ x }}</h4><h4>y:{{ y }}</h4><h4>z:{{ z }}</h4><button @click="updateA(6)">点我加6</button><GrandChild v-bind="$attrs" /></div>
</template><script setup lang="ts" name="Child">
import GrandChild from './GrandChild.vue';
defineProps(['a','b','c','d','x','y','z','updateA'])
</script><style lang="scss" scoped></style>
<template><div class="father"><h3>父组件</h3><h4>a:{{ a }}</h4><h4>b:{{ b }}</h4><h4>c:{{ c }}</h4><h4>d:{{ d }}</h4><Child :a="a" :b="b" :c="c" :d="d" v-bind="{x:100,y:200}" :updateA="updateA"/></div>
</template><script setup lang="ts" name="Father">
import Child from './ChildPractice.vue'
import { ref } from 'vue'const a=ref(1)
const b=ref(2)
const c=ref(3)
const d=ref(4)
function updateA(value:number){a.value=value
}
</script><style lang="scss" scoped></style>

refs、refs、refsparent】

  1. 概述:
    • $refs用于:父→子。
    • $parent用于:子一父。
  2. 原理如下:
属性说明
$refs值为对象,包含所有被ref属性标识的D0M元素或组件实例。
$parent值为对象,当前组件的父组件实例对象。
<template><div class="father"><h2>父组件</h2><h4>房产:{{ house }}</h4><button @click="changeToy">修改Child1的玩具</button><button @click="changeComputer">修改Child1的玩具</button><button @click="getAllChild($refs)">获取所有的子组件实例对象</button><Child1 ref="c1"></Child1><Child2></Child2></div>
</template><script setup lang="ts" name="FatherPractice">
import { ref } from 'vue';
import Child1 from './Child1Practice.vue';
import Child2 from './Child2Practice.vue';//注意点:当访问obj.c的时候,底层会自动读取value属性,因为c是在obj这个对象中的
/*let obj= reactive({
a:1,
b:2,
c:ref(3)
})
let x =ref(4)
console.log(obj.a)
console.log(obj.b)
console.log(obj.c)
console.log(x)*/
const house = ref(4);
const c1=ref()
function changeToy() {c1.value.a('小牛牛')
}
function changeComputer() {c1.value.b('redmi')
}
function getAllChild(refs:any) {for (const key in refs) {refs[key].b+=3}
}
defineExpose({house
})
</script><style scoped></style>
<template><div class="child1-practice"><h3>子组件1</h3><h4>a:{{ a }}</h4><h4>b:{{ b }}</h4><button @click="minusHouse($parent)">干掉父亲的一套房产</button></div>
</template><script setup lang="ts" name="Child1Practice">
import { ref } from 'vue'
const a = ref(1)
const b = ref(2)
defineExpose({a,b
})function minusHouse (parent:any) {parent.house-=1
}
</script><style scoped></style>
<template><div class="child2-practice"><h2>子组件2</h2><h4>a:{{ a }}</h4><h4>b:{{ b }}</h4></div>
</template><script setup lang="ts" name="Child2Practice">
import { ref } from 'vue';
const a = ref(1)
const b = ref(2)
</script><style scoped></style>

【provide、inject】

  1. 概述:实现祖孙组件直接通信
  2. 具体使用
    • 在祖先组件中通过provide配置向后代组件提供数据
    • 在后代组件中通过inject配置来声明接收数据
<template><div class="Child"><h3>孙组件</h3><h4>a:{{ a }}</h4><h4>b:{{ b }}</h4><h4>]c:{{ c }}</h4><h4>d:{{ d }}</h4><h4>x:{{ x }}</h4><h4>y:{{ y }}</h4><h4>z:{{ z }}</h4><button @click="updateA(6)">点我加6</button><GrandChild v-bind="$attrs" /></div>
</template><script setup lang="ts" name="Child">
import GrandChild from './GrandChild.vue';
defineProps(['a','b','c','d','x','y','z','updateA'])
</script><style lang="scss" scoped></style>
<template><div class="father"><h3>父组件</h3><h4>银子:{{ money }}</h4><h4>车子:{{ car.name }},价值:{{ car.price }}</h4><Child /></div>
</template><script setup lang="ts" name="Father">
import { provide, reactive, ref } from 'vue'
import Child from './ChildPractice.vue'
const money=ref(1000)
const car=reactive({name:'保时捷',price:100000
})
function changeMoney(value:number){money.value-=value
}
// 向后代提供数据
provide('moneyContext',{money:money.value,changeMoney})
provide('car',car)
</script><style lang="scss" scoped></style>
<template><div class="grand-child"><h3>孙组件</h3><h4>银子:{{money}}</h4><h4>车子:{{ car.brand }},价值{{car.price}}万元</h4><button @click="updateMoney(6)">花钱</button></div>
</template><script setup lang="ts" name="GrandChild">import { inject } from 'vue';const {money,updateMoney}=inject('moneyContext',{money:0,updateMoney:(_:number)=>{}})const car=inject('car',{brand:'未知',price:1000})
</script><style lang="scss" scoped></style>

【slot】

<template><div class="father-practice"><h3>父组件</h3><div class="content"><Category><template v-slot:s2><ul><li v-for="item in games" :key="item.id">{{ item.name }}</li></ul></template><template v-slot:s1><h2>热门游戏列表</h2></template></Category><Category><template v-slot:s2><img :src=imgUrl alt=""></template><template v-slot:s1><h2>今日美食城市</h2></template></Category><Category><template v-slot:s1><video :src="videoUrl"></video></template><template v-slot:s2><h2>近日影视推荐</h2></template></Category></div></div>
</template><script setup lang="ts" name="father-practice">
import { reactive, ref } from 'vue';
import Category from './CategoryPractice.vue';
const games=reactive([{id:1,name:'英雄联盟'},{id:2,name:'王者荣耀'},{id:3,name:'和平精英'},{id:4,name:'穿越火线'},
])
const imgUrl=ref('https://z1.ax1x.com/2023/11/19/piNxLo4.jpg')
const videoUrl=ref('http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4')</script><style scoped>
.father{
background-color:rgb(165,164,164);
padding:20px;
border-radius:10px;
}.content{
display:flex;
justify-content: space-evenly;
}
</style>
<template><div class="category">
<slot names="s1">默认内容1</slot>
<slot name="s2">默认内容2</slot>
</div>
</template><script setup lang="ts" name="CategoryPractice"></script><style scoped>
.category-practice {
background-color: skyblue;
}</style>

其他API

【shallowRef与shallowReactive】

shallowRef
  1. 作用:创建一个响应式数据,但只对顶层属性进行响应式处理。
  2. 用法:
    let =myVar shallowRef(initialValue);
  3. 特点:只跟踪引用值的变化,不关心值内部的属性变化。
shallowReactive
  1. 作用:创建一个浅层响应式对象,只会使对象的最顶层属性变成响应式的,对象内部的嵌套属性则不会变成
    响应式的
  2. 用法:
    const =myobj shallowReactive({...})
  3. 特点:对象的顶层属性是响应式的,但嵌套对象的属性不是。

通过使用shallowRef()shallowReactive()来绕开深度响应。浅层式API创建的状态只在其顶层是
响应式的对所有深层的对象不会做任何处理,避免了对每一个内部属性做响应式所带来的性能成本,
这使得属性的访问变得更快,可提升性能。

<template><div class="App">
<h2>求和:{{ sum }}</h2>
<h2>姓名:{{ person.name }}</h2>
<h2>年龄:{{ person.age }}</h2>
<h2>车:{{ car.brand }}</h2>
<button @click="changeSum">sum+1</button>
<button @click="changeName">修改名字</button>
<button @click="changeAge">修改年龄</button>
<button @click="changePerson">修改整个人</button>
<button @click="changeBrand">修改品牌</button>
<button @click="changeColor">修改颜色</button>
<button @click="changeEngine">修改发动机</button>
<button @click="changeCar">修改整个车</button>
</div>
</template><script setup lang="ts" name="App">
import {  ref, shallowRef,shallowReactive } from 'vue'
const sum=shallowRef(0)
const person=ref({name:'张三',age:18})
// const car =reactive({
// brand:'奔驰',
// options:{
// color:'红色',
// engine:''
// }
// })
const car =shallowReactive({
brand:'奔驰',
options:{
color:'红色',
engine:''
}
})
function changeSum(){sum.value+=1
}
function changeName (){person.value.name='李四'
}function changeAge (){person.value.age =60
}function changePerson (){person.value={name:'王五',age:19}
}
function changeBrand(){
car.brand='宝马'
}
function changeColor(){
car.options.color='紫色'
}
function changeEngine(){
car.options.engine ='V12'
}
function changeCar(){
Object.assign(car)
}
</script><style scoped>
.App{background-color: #ddd;border-radius: 10px;box-shadow: 0 0 10px;padding: 10px;
}
button{margin:0 5px;
}
</style>

【readonly与shallowReadonly】

readonly
  1. 作用:用于创建一个对象的深只读副本。
  2. 用法:
    const original reactive({...}) const readOnlyCopy= readonly(original);
  3. 特点
    • 对象的所有嵌套属性都将变为只读。
    • 任何尝试修改这个对象的操作都会被阻止(在开发模式下,还会在控制台中发出警告)。
  4. 应用场景:
    • 创建不可变的状态快照。
    • 保护全局状态或配置不被修改。
shallowReadonly
  1. 作用:与readonly类似,但只作用于对象的顶层属性。
  2. 用法:
    const original reactive({...}) const shallowReadOnlyCopy shallowReadonly(original);
  3. 特点:
    • 只将对象的顶层属性设置为只读,对象内部的嵌套属性仍然是可变的。
    • 适用于只需保护对象顶层属性的场景。
<template><div class="app">
<h2>当前sum求和为:{{sum}}</h2>
<h2>当前sum2求和为:{{sum2}}</h2>
<h2>当前汽车为:{{car}}</h2>
<h2>当前汽车为:{{car2}}</h2>
<button @click="changeSum">sum1+1</button>
<button @click="changeSum2">sum2+1</button>
<button @click="changeBrand">修改品牌</button>
<button @click="changeBrand2">修改品牌</button>
<button @click="changeColor">修改颜色</button>
<button @click="changePrice">修改价格</button>
<button @click="changeColor2">修改颜色</button>
<button @click="changePrice2">修改价格</button>
</div>
</template><script setup lang="ts" name="App">
import { reactive, readonly, ref, shallowReadonly } from 'vue'
const sum = ref(0)
const sum2=readonly(()=>sum.value+1)
const car=reactive({brand:'audi',options:{color:'red',price:100000}
})
function changeSum(){sum.value+=1
}
const car2=shallowReadonly(car)
function changeSum2(){sum2.value+=1
}
function changeColor(){car.options.color='blue'
}
function changePrice(){car.options.price+=10
}
function changeBrand(){car.brand='hongqi'
}
function changeBrand2(){car2.brand='hongqi'
}
function changeColor2(){car.options.color='blue'
}
function changePrice2(){car.options.price+=10
}
</script><style scoped>
.app{background-color: #ddd;border-radius: 10px;box-shadow: 0 0 10px;padding: 10px;
}
button{margin:0 5px;
}
</style>

【toRaw与markRaw】

toRaw
  1. 作用:用于获取一个响应式对象的原始对象,toRaw返回的对象不再是响应式的,不会触发视图更新

官网描述:这是一个可以用于临时读取而不引起代理访问/跟踪开销,或是写入而不触发更改的特殊方
法。不建议保存对原始对象的持久引用,请谨慎使用。
何时使用?一一在需要将响应式对象传递给非Vue的库或外部系统时,使用toRaw可以确保它们收
到的是普通对象

  1. 具体编码:
import {reactive,toRaw,markRaw,isReactive} from "vue";
//toRaw 
//响应式对象
let person =reactive({name:tony',age:18))
//原始对象
let rawPerson =toRaw(person)
//markRaw 
let citysd markRaw([
{id:'asdda01',name:'北京'}{id:'asdda02',name:'上海'}{id:'asdda3',name:'天津'}{"name":"重庆","id":"asdda04"}
])
//根据原始对象citys去创建响应式对象citys2--创建失败,因为citys被markRaw标记了
let citys2 =reactive(citys)
console.log(isReactive(person))
console.log(isReactive(rawPerson))
console.log(isReactive(citys))
console.log(isReactive(citys2))
markRaw
  1. 作用:标记一个对象,使其永远不会变成响应式的。

例如使用mockjs时,为了防止误把mockjs变为响应式对象,可以使用markRaw去标记mockjs

  1. 编码:
//markRaw 
let citys= markRaw([
{id:'asdda01',name:'北京'}{id:'asdda02',name:'上海'}{id:'asdda03',name:'天津'}{id:"asdda04",name:"重庆"}
])
//根据原始对象citys去创建响应式对象citys2--创建失败,因为citys被markRaw标记了
let citys2 =reactive(citys)

【customRef】

作用:创建一个自定义的ref,并对其依赖项跟踪和更新触发进行逻辑控制。
实现防抖效果(useSumRef.ts):

import {customRef from "vue";
export default function(initValue:string,delay:number){
let msg= customRef((track,trigger)=>{
let timer:number
return{
get(){
track()//告诉Vue数据msg很重要,要对msg持续关注,一旦变化就更新
return initValue
},
set(value){
clearTimeout(timer)
timer =setTimeout(()=>
initValue =value
trigger()//通知Vue数据msg变化了
}delay);
}
}
})

provide与inject

  • 作用:实现祖孙组件间通信
  • 套路:父组件有一个
    provide选项来提供数据,子组件有一个inject选项来开始使用这些数据
  • 具体写法:
    1. 祖组件中:
    setup(){......let car=reactive({name:'奔驰',price:'4o万'})provide('car',car)......}
    
    1. 孙组件中:
setup(props,context){const car =inject('car')return {car}}

响应式数据的判断

  • isRef:检查一个值是否为一个ref对象
  • isReactive:检查一个对象是否是由reactive:创建的响应式代理
  • isReadonly:检查一个对象是否是由readonly:创建的只读代理
  • isProxy:检查一个对象具否是由reactive或者readonly方法创建的代理

Fragment

  • 在Vue2中:组件必须有一个根标签
  • 在Vue3中:组件可以没有根标签,内部会将多个标签包含在一个Fragment虚拟元素中
  • 好处:减少标签层级,减小内存占用

【Teleport】

  • 什么是Teleport?一一Teleport是一种能够将我们的组件html结构移动到指定位置的技术。
<teleport to='body'>
<div class="modal" v-show="isShow">
<h2>我是一个弹窗</h2>
<p>我是弹窗中的一些内容</p>
<button @click="isShow=false">关闭弹窗</button>
</div>
</teleport>

【Suspense】

  • 等待异步组件时渲染一些额外内容,让应用有更好的用户体验
  • 使用步骤:
    • 异步引入组件
    • 使用Suspense包裹组件,并配置好defaultfallback
import defineAsyncComponent,Suspense from "vue";
const Child =defineAsyncComponent(()=>import('./Child.vue'))
<template>
<div class="app">
<h3>我是App组件</h3>
<Suspense>
<template v-slot:default>
<Child/>
</template>
<template v-slot:fallback>
<h3>加载中.....</h3>
</template>
</Suspense>
</div>
</template>

【全局API转移到应用对象】

  • app.component
  • app.config
  • app.directive
  • app.mount
  • app.unmount
  • app.use

【其他】

  • 过渡类名v-enter修改为v-enter-from、过渡类名v-leave修改为v-leave-from
  • keyCode作为v-on修饰符的支持。
  • v-model指令在组件上的使用已经被重新设计,替换掉了v-bind.sync
  • v-ifv-for在同一个元素身上使用时的优先级发生了变化。
  • 移除了$on$off$once实例方法。
  • 移除了过滤器filter
  • 移除了$children实例propert

Composition API的优势

  1. Options API存在的问题
    使用传统OptionsAPI中,新增或者修改一个需求,就需要分别在data,methods,computed.里修改。
  2. Composition API的优势
    我们可以更加优雅的组织我们的代码,函数。让相关功能的代码更加有序的组织在一起。

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

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

相关文章

07【C++ 初阶】类和对象(中篇) --- 类的默认成员函数

文章目录前言类的6个默认成员函数1.构造函数1.1 构造函数特性1.1.1 函数名与类名相同1.1.2 无返回值1.1.3 对象实例化时编译器自动调用对应的构造函数1.1.4 构造函数可以重载1.1.5 默认构造只能有一个1.1.6 默认构造的必要性1.2 构造函数的初始化列表2.析构函数2.1 析构函数特性…

第二次CISSP考试通过!

今天我终于临时通过了 CISSP 考试&#xff01;这第二次的精神压力一点也不比第一次小。我在第 101 道题 时通过&#xff0c;还剩大约 30 分钟。我当时真的以为自己又要像上次那样时间不够了。第一次考试的失败经历&#xff1a;第一次考试是我刚参加完为期 5 天的强化 Boot Camp…

USRP捕获手机/路由器数据传输信号波形(上)

目录&#xff1a; USRP捕获手机/路由器数据传输信号波形&#xff08;上&#xff09; USRP捕获手机/路由器数据传输信号波形&#xff08;中&#xff09; USRP捕获手机/路由器数据传输信号波形&#xff08;下&#xff09; 一、前期准备 1.1 场景与系统 手机、路由器与天线的…

基于STM32F103的FM1702驱动程序

基于STM32F103微控制器与复旦微电子FM1702SL射频读卡芯片的驱动开发方案&#xff0c;整合了硬件配置、寄存器操作和通信协议实现&#xff1a;一、硬件连接设计 1. 管脚映射表FM1702SL引脚STM32F103引脚功能说明VDD3.3V电源输入GNDGND地线SCKPA5(SPI1_SCK)SPI时钟MISOPA6(SPI1_M…

京东商品评论API指南

一、引言京东商品评论API(JD.item_review)是京东开放平台提供的重要接口&#xff0c;允许开发者获取商品的详细评论数据。通过该接口可以获取包括评论内容、评分、评论时间、用户昵称等信息&#xff0c;为商品分析、用户行为研究等提供数据支持‌。二、接口概述1. 接口基本信息…

网络编程概述与UDP编程

一、 网络编程概述 1.1 概述 在现代软件开发与系统交互场景里&#xff0c;基于 Socket 的网络多进程通信占据核心地位&#xff0c;其适用场景广泛且深入到各类数字化交互中&#xff1a; 直播场景&#xff1a;主播端通过 Socket 建立的网络连接&#xff0c;将音视频流以数据包…

新手教程:用外部 PostgreSQL 和 Zookeeper 启动 Dolphinscheduler

本文将带你一步步通过外部PostgreSQL和Zookeeper来启动Apache DolphinScheduler。无论你是新手还是有经验的开发者&#xff0c;都能轻松跟着这些步骤在Linux/Unix环境中完成安装和配置。除了常见的安装步骤&#xff0c;我们还会分享一些集群部署的技巧&#xff0c;让你轻松扩展…

安宝特案例丨AR+AI赋能轨道交通制造:破解人工装配难题的创新实践

在轨道交通装备制造领域&#xff0c;小批量、多品种的生产特性与高度依赖人工经验的作业模式长期并存&#xff0c;导致效率瓶颈与质量隐患并存。安宝特通过AR&#xff08;增强现实&#xff09;AI&#xff08;人工智能&#xff09;技术融合&#xff0c;在螺栓紧固、内饰装配、制…

基于LSTM-GRU混合网络的动态解析:美联储维稳政策与黄金单日跌1.5%的非线性关联

摘要&#xff1a;本文通过构建多因子量化模型&#xff0c;结合自然语言处理&#xff08;NLP&#xff09;技术对美联储政策文本进行情绪分析&#xff0c;解析经济数据、市场情绪及宏观环境对黄金价格的复合影响机制。研究基于LSTM时间序列预测框架&#xff0c;验证关键事件对金价…

RabbitMQ消息确认机制有几个confirm?

RabbitMQ 的消息确认机制中&#xff0c;“confirm” 这个词主要出现在两个关键环节&#xff0c;对应两种确认&#xff1a;✅ 两种 confirm&#xff08;确认&#xff09;机制确认类型触发方说明Publisher Confirm&#xff08;生产者确认&#xff09;生产者 → Broker消息是否成功…

vue项目启动时因内存不足启动失败

可以使用increase-memory-limit跟npm install cross-env插件npm install increase-memory-limit npm install cross-env安装后需要在package.json文件中加入如下代码"scripts": {"fix-memory-limit": "cross-env LIMIT3072 increase-memory-limit&quo…

WEditor:高效的移动端UI自动化脚本可视化编辑器

WEditor&#xff1a;高效的移动端UI自动化脚本可视化编辑器前言一、核心特性与优势1. 可视化操作&#xff0c;降低门槛2. 跨平台支持3. 丰富的控件层级展示4. 快捷键高效操作5. 开源可扩展二、安装与环境配置1. 环境准备Android 设备用户需额外准备ADB 安装与配置步骤2. 安装依…

面试高频题 力扣 283.移动零 双指针技巧 原地修改 顺序保持 C++解题思路 每日一题

目录零、题目描述一、为什么这道题值得你花几分钟看懂&#xff1f;二、题目拆解&#xff1a;提取其中的关键点三、明确思路&#xff1a;双指针的巧妙配合四、算法实现&#xff1a;双指针的代码演绎五、C代码实现&#xff1a;一步步拆解代码拆解时间复杂度和空间复杂度六、实现过…

arrch64架构下调用pyvista报错

arrch64架构下调用pyvista报错 问题 python编程使用到了pyvista&#xff0c;使用conda新建了环境&#xff0c;但是使用的时候报错 Traceback (most recent call last):File "/home/ztl/MGGBSAR/src/trans_las_3D.py", line 16, in <module>import pyvista as p…

功能强大编辑器

时间限制&#xff1a;1秒 内存限制&#xff1a;128M题目描述你要帮助小可创造一个超级数字编辑器&#xff01;编辑器依旧运行在Linux下&#xff0c;因此你只能通过指令去操控他。指令有五种&#xff1a; In X 表示在光标左侧插入一个数字 Del 表示删除光标左侧一个数字 …

【力扣】面试经典150题总结01-数组/字符串

1.合并两个有序数组&#xff08;简单&#xff09;要求直接在num1上操作&#xff0c;已经预留了空间&#xff0c;所以直接倒着从大到小插入。当其中一个数组遍历完&#xff0c;就把另一个数组剩余的部分插入。2.移除元素&#xff08;简单&#xff09;要求原地移除数组中所有val元…

基于 Hadoop 生态圈的数据仓库实践 —— OLAP 与数据可视化(一)

目录 一、OLAP 与 Impala 简介 1. OLAP 简介 2. Impala 简介 &#xff08;1&#xff09;Impala 是什么 &#xff08;2&#xff09;为什么要使用 Impala &#xff08;3&#xff09;适合 Impala 的使用场景 &#xff08;4&#xff09;Impala 架构 &#xff08;5&#xff…

PyTorch L2范数详解与应用

torch.norm 是什么 torch.norm(dot_product, p=2, dim=-1) 是 PyTorch 中用于计算张量 L2 范数的函数, 1. 各参数解析 dot_product:输入张量,在代码中形状为 [batch_size, seq_len](每个元素是 token 隐藏状态与关注向量的点积)。 p=2:指定计算L2 范数(欧几里得范数)…

循环神经网络RNN原理精讲,详细举例!

第一部分&#xff1a;为什么需要RNN&#xff1f;在了解RNN是什么之前&#xff0c;我们先要明白它解决了什么问题。传统的神经网络&#xff0c;比如我们常见的前馈神经网络&#xff08;Feedforward Neural Network&#xff09;或者卷积神经网络&#xff08;CNN&#xff09;&…

如何用USRP捕获手机信号波形(中)手机/基站通信

目录&#xff1a; 如何用USRP捕获手机信号波形&#xff08;上&#xff09;系统及知识准备 如何用USRP捕获手机信号波形&#xff08;中&#xff09;手机/基站通信 如何用USRP捕获手机信号波形&#xff08;下&#xff09;协议分析 四、信号捕获结果 4.1 时域波形 我怀疑下面…