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

Vue——vue3中的ref和reactive数据理解以及父子组件之间props传递的数据

ref()函数

这是一个用来接受一个内部值,返回一个响应式的、可更改的 ref 对象,此对象只有一个指向其内部值的属性 .value

作用:创建一个响应式变量,使得某个变量在发生改变时可以同步发生在页面上。

模板语句中使用这个变量时可以直接使用变量名来调用,在setup内部调用时则需要在变量明后面加上一个.value获取它的值,原因是因为使用ref()返回的是一个RefImpl对象类型。

RefImpl

RefImplRefImpl是用于实现ref的内部类。它用于包装单个基本数据类型值,并提供.value属性来访问和更新值。当你使用ref函数创建一个响应式引用时,实际上是在内部创建了一个RefImpl实例。

当在控制台上输出一个ref对象时,输出的就是refImpl对象。

 RefImpl用于包装单个值,也可以用来包装一个对象,包装一个对象时,这个ref.value得到的会是一个响应式proxy代理对象。

reactive()函数

 作用:创建一个响应式的对象,不可重新赋值,使用该函数创建的对象也是可以像ref()的一样实现响应式的变化,但是不管是模板语句里面还是setup内部都可以像普通的对象一样调用,但是使用reactive返回的同样是一个Proxy对象类型的数据。如下所示

 ObjectRefImpl

ObjectRefImplObjectRefImpl是用于实现reactive的内部类。它用于包装一个对象,并为该对象的每个属性创建响应式代理。当你使用reactive函数创建一个响应式对象时,实际上是在内部创建了一个ObjectRefImpl实例。

为什么说reactive创建的对象不可重新赋值

reactive 创建的对象可以重新赋值,但不能被重新赋值为一个完全不同的对象。这是因为 reactive 创建的对象是响应式的,它会追踪其属性的变化,并在属性发生变化时触发视图更新。如果你重新赋值整个对象,那么 Vue 将无法继续追踪原始对象的变化,因为它不再引用相同的对象。

下面是一个示例,说明 reactive 创建的对象可以重新赋值:

import { reactive } from 'vue';const state = reactive({name: 'John',age: 30,
});console.log(state.name); // 输出 'John'// 可以重新赋值属性值
state.name = 'Alice';console.log(state.name); // 输出 'Alice'

在上述示例中,我们可以看到我们成功地重新赋值了 state 对象的 name 属性,这是因为我们仅仅修改了属性值,而不是整个对象。

然而,如果尝试将 state 对象重新赋值为一个全新的对象,例如:

state = reactive({ name: 'Bob', age: 25 }); // 这是不允许的

 这将导致一个错误,因为这样做相当于放弃了对原始 state 对象的引用,Vue 将无法继续追踪原始对象的属性变化。如果需要更改整个对象,你应该使用 refcomputed 来处理,而不是 reactive

Proxy对象

Proxy 对象是 JavaScript 中的一个内置对象,它允许你创建一个代理(proxy),用于控制对另一个对象的访问和操作。这个代理对象可以拦截和自定义目标对象的各种操作,例如属性的读取、写入、删除等,从而提供了更高级的元编程能力和数据保护机制。

Proxy 对象的基本语法如下:

const proxy = new Proxy(target, handler);

- `target`:被代理的目标对象,即你想要拦截操作的对象。
- `handler`:一个包含各种拦截操作的处理器对象,它定义了代理对象的行为。例如,你可以使用 Proxy 来创建一个简单的日志记录器,以监视目标对象的属性访问和修改:
 

const target = {name: 'John',age: 30,
};const handler = {get(target, key) {console.log(`Getting ${key}`);return target[key];},set(target, key, value) {console.log(`Setting ${key} to ${value}`);target[key] = value;},
};const proxy = new Proxy(target, handler);console.log(proxy.name); // 会触发代理的get拦截,打印 "Getting name",然后返回 "John"
proxy.age = 31; // 会触发代理的set拦截,打印 "Setting age to 31"

Proxy 的强大之处在于你可以定义自定义行为来拦截目标对象上的各种操作。这使得它在元编程、数据验证、数据保护和许多其他场景中非常有用。

需要注意的是,Proxy 是 ECMAScript 6 的一部分,因此在一些老版本的浏览器中可能不受支持。但现代浏览器和 Node.js 环境中通常都支持 Proxy。

toRefs方法

toRefs是Vue 3中一个有用的辅助函数,用于将响应式对象的属性转换为普通的响应式引用(ref)。这对于在模板中访问响应式对象的属性以及将它们传递给子组件时非常有用。

下面是toRefs的使用示例:

假设你有一个响应式对象(reactive):

import { reactive, toRefs } from 'vue';const state = reactive({name: 'John',age: 30,
});

使用toRefs将这个响应式对象的属性转换为响应式引用:

const stateRefs = toRefs(state);

现在,stateRefs是一个包含了nameage属性的对象,但这些属性已经被转换为响应式引用。你可以像访问普通的引用一样访问它们的值:

console.log(stateRefs.name.value); // 'John'
console.log(stateRefs.age.value); // 30

在模板中使用时,你可以直接使用stateRefs.namestateRefs.age,Vue会自动解开引用并进行响应式追踪。

使用toRefs的主要优点是,在将响应式对象的属性传递给子组件时,子组件可以直接使用属性的引用,而不需要手动解包。这可以避免一些潜在的问题,例如丢失响应性。

ref和reactive得到的不同响应式对象

ref

  • ref 用于创建响应式引用,它返回一个包装对象,这个包装对象具有一个名为 .value 的属性,该属性用于读取和写入值。
  • 内部实现上,ref 创建了一个名为 RefImpl 的对象,它是 Vue 3 内部的私有类,用于包装值并添加响应性。
  • 你可以通过 ref 创建基本数据类型的响应式数据,例如数字、字符串等。
import { ref } from 'vue';const count = ref(0); // 返回一个 RefImpl 对象
console.log(count.value); // 0
count.value = 1; // 更新值

 reactive

  • reactive 用于创建一个响应式代理对象,它会追踪对象内部属性的变化。
  • 内部实现上,reactive 使用了 JavaScript 的 Proxy 对象,将目标对象包装在代理之下,从而实现响应性。
  • 你可以通过 reactive 创建包含多个属性的响应式对象,通常用于复杂的数据结构。
import { reactive } from 'vue';const state = reactive({name: 'John',age: 30,
}); // 返回一个 Proxy 对象
console.log(state.name); // John
state.age = 31; // 视图会自动更新

reactive对象使用toRefs时发生了什么?

使用 toRefs 将一个 reactive 对象的属性转换为响应式引用(ref)时,会将原始对象的每个属性都包装成独立的 ref,从而使这些属性可以在模板中正常工作并保持响应性。但是这些属性会变成ObjectRefImpl类型。

以下是使用 toRefs 的示例:

import { reactive, toRefs } from 'vue';const state = reactive({name: 'John',age: 30,
});const stateRefs = toRefs(state);console.log(stateRefs.name.value); // 输出 'John'
console.log(stateRefs.age.value); // 输出 30

在上面的示例中,toRefs 函数将 state 对象的每个属性都包装为 ref,并将这些 ref 存储在 stateRefs 对象中。现在,你可以像访问普通的 ref 一样访问这些属性,而不需要 .value

toRefs 的主要作用是确保 reactive 对象的属性在模板中可以正确追踪和更新,因为模板编译器可以正确处理 ref,而 ref 具有 .value 属性,使得属性的访问和修改都能够正常工作。这对于将属性传递给子组件或在模板中使用响应式数据非常有用,因为它确保了属性的正确响应性行为。

需要注意的是,toRefs 创建的 ref 仍然是响应式的,但是它们只包装了原始属性的值,而不是整个对象。这意味着你只能访问和修改属性的值,而不能修改整个对象或添加新的属性。如果需要修改整个对象,你应该使用 reactive 创建一个新的代理对象。

为什么reactive不能用.value访问

reactive 创建的对象不能直接使用 .value 来访问属性的值,因为 reactive 返回的对象是一个代理对象(Proxy),不同于使用 ref 创建的包装对象。

使用 reactive 创建的对象是一个代理,它会在访问和修改属性时自动进行响应式追踪,而不需要额外的 .value 属性。因此,你可以像访问普通 JavaScript 对象一样访问 reactive 对象的属性,而不需要额外的 .value。这正是 Vue 3 中的响应式系统的设计理念之一,使代码更加简洁和自然。

例子

Vue——vue3+element plus实现多选表格使用ajax发送id数组_北岭山脚鼠鼠的博客-CSDN博客

继上次之后再次实现了一个弹出式的编辑框,然后要将某一行tableItem数据传送给子组件进行展示.

然后这里就要用到props。

效果如下

控制台输出了一些数据

这是父组件里面的输出。

除了传进来的表格的行数据以外,又准备了一个reactive包装的对象rea和一个ref包装的对象a和一个ref类型的tableitem接收表格的行数据。一共三个。

const tableItem = ref()let rea = reactive({ name: "yhy", age: 23 })const a = ref({ name: 'John', age: 30 });var onEdit = (data) => {tableItem.value = data //发送当前行数据给组件console.log(data)   //输出了一个Proxy数据console.log("tableItem部分———————Ref————————————————————————")console.log(tableItem) //输出了一个RefImpl数据console.log(tableItem.value)console.log(tableItem.value.shopname) //console.log("rea部分——————Reactive—————————————————————————")console.log(rea)console.log(rea.name)console.log(toRefs(rea))console.log(toRefs(rea).name)console.log("a部分———————Ref————————————————————————")console.log(a);console.log(a.value);console.log(a.value.name);//console.log(tableItem.value.get(name))  //会提示不是一个对象//console.log(tableItem.get(name))      //会提示console.log(tableItem.value.get(name))showDialog.value = true         //显示表单dialogFormVisible.value = true  //显示弹窗}

输出如下

103行是得到的表格数据,可以看见是Proxy类型的对象,说明和reactive创建的一样的,都是响应式的对象。

tableItem

106得到的是RefImpl数据,这个正是ref返回得到

107得到的是将表格数据(proxy或者说reactive)赋给ref.value之后得到的,虽说ref一般都是用来封装数值,但是像这样封装对象也是可以的。

108就是ref.value.shopname得到的,因为ref.value是reactive类型的对象所以可以直接用.属性名的方式得到。

rea

110和111一个是reactive的直接输出,一个是其属性的输出。

112是使用了toRefs将一个响应式对象(proxy)变成了普通对象,将其属性变成了ObjectRefImpl类似ref那样。

113是输出了这个转换后的普通对象的属性,可以看见是ObjectRefImpl类型,这时可以使用value访问它的值。

a部分

和tableItem差不多,都是封装了一个对象进了value,但是这里那个对象使用了Proxy代理对象。

子组件里面的输出

    props: {tableItem: {},},setup(props) {const tableItem2 = ref();const temp = ref();tableItem2.value = toRefs(props).tableItem.valueconsole.log("1--------")console.log(props);       //props是一个proxy代理对象console.log("2--------")console.log(props.tableItem)  //里面包着的tableItem也是一个代理对象console.log("3--------")//console.log(props.tableItem.value)   console.log(props.tableItem.shopname)  //Proxy代理对象不需要用value,可以直接访问console.log("4--------")temp.value = toRefs(props.tableItem)  //使用一个ref接受tableItem这个reactive创建的proxy对象然后将里面的属性全部变成了拥有ObjectRefImpl类型console.log(temp)console.log(temp.value.shopname)        //为什么这里ObjectRefImpl不需要用valueconsole.log(temp.value.shopname.value)  //shopname是ObjectRefImpl类型,但是.value输出undefinedconsole.log("5--------")console.log(toRefs(props).tableItem)   //tableItem变成了ObjectRefImpl类型,但是value还是proxy类型console.log("6--------")console.log(toRefs(props).tableItem.value)  //这里tableItem是ObjectRefImpl类型,用.value输出了proxy类型console.log(toRefs(props).tableItem.value.shopname) //
}

 

 1下可以看见传进来的props也是一个proxy代理对象,要用到的数据在里面也是一个对象的形式

2里输出了传来的tableItem(reactive)   3里直接输出了里面的属性

4里先是用toRefs将reactive对象变成普通对象(属性变成了ObjectRefImpl)封装进一个ref对象temp.value里面,然后又成了proxy代理对象,但里面的6个属性还是ObjectRefImpl类型的

然后之前说过这里ObjectRefImpl和ref一样需要用value访问数据,这里却不用,并且用了也访问不到.........

5里面使用toRefs将props变成了普通对象,并将其下的tableItem变成了ObjectRefImpl类型,但是tableItem.value是proxy代理对象,其下的6个属性类型没变。

所以6里面可以用.value输出一个proxy类型,用.value.shopname输出一个沙县小吃。

特例

那么toRefs 修改后的数据的属性变成了ObjectRefImpl类型了,但是如果属性是一个对象时,并且这个对象里面里面还包含了多个属性时要怎么访问这个对象里面的多个属性?

当使用 toRefs 修改后的数据的属性是一个对象,并且这个对象里面包含了多个属性时,你可以直接使用 .value 访问该属性,然后再使用点符号或中括号符号来访问该对象内部的多个属性。

下面是一个示例,说明如何访问 toRefs 修改后的数据对象内部的多个属性

import { reactive, toRefs } from 'vue';const state = reactive({person: {name: 'John',age: 30,},city: 'New York',
});const stateRefs = toRefs(state);// 访问对象属性
console.log(stateRefs.person.value.name); // 输出 'John'
console.log(stateRefs.person.value.age); // 输出 30console.log(stateRefs.city.value); // 输出 'New York'

在上述示例中,我们首先使用 .value 访问 personcity 这两个属性,然后再使用点符号或中括号符号访问这些属性内部的属性。这样可以访问 person 对象内的 nameage 属性以及 city 属性。

总之,使用 toRefs 修改后的数据对象的属性仍然需要使用 .value 来访问,然后再使用标准的属性访问语法来访问对象内部的多个属性。这样可以访问和操作对象内部的数据。

父组件代码

<template ><div id="shoplist"><el-table ref="multipleTableRef" :data="data.arr" style="width: 100%" height="90%" stripe@selection-change="handleSelectionChange"><template #default><el-table-column type="selection" width="40" /><el-table-column property="shopname" label="店名" width="120" show-overflow-tooltip /><el-table-column property="score" label="评分" sortable width="80" /><el-table-column property="sales" label="销量" sortable width="80" /><el-table-column property="type" label="类型" width="70" /><el-table-column property="operations" label="操作" width="70"><template #default="scope"> <el-button link type="primary" @click="onEdit(scope.row)"size="small">Edit</el-button></template></el-table-column></template></el-table><div style="margin-top: 20px; margin-left:20px"><el-button @click="toggleSelection(data.arr)">全选</el-button><el-button @click="toggleSelection()">清除</el-button><el-button @click="delete_post">批量删除</el-button></div></div><el-dialog v-model="dialogFormVisible" title="Shipping address"><dialog-component v-if="showDialog" :showDialog="showDialog" :tableItem="tableItem"></dialog-component></el-dialog>
</template><script>
import { onMounted, ref } from 'vue';
import { getCurrentInstance } from 'vue'
import { reactive, toRefs } from '@vue/reactivity';
import $ from 'jquery'
import DialogComponent from '../components/DialogComponent.vue';
export default {name: 'ElementView',components: {DialogComponent},setup() {const instance = getCurrentInstance(); //这个玩意不能用在生产环境好像const multipleTableRef = ref(null);const multipleSelection = ref([])const data2 = ref([])const list = reactive([])const tableItem = ref({ name: 'yhy' })const dialogFormVisible = ref(false)const showDialog = ref()let rea = reactive({ name: "yhy", age: 23 })const a = ref({ name: 'John', age: 30 });var toggleSelection = (rows) => {console.log(instance) //输出了这个vue组件的实例对象console.log(instance.refs.multipleTableRef)  //输出了一个代理对象var ultipleTabInstance = toRefs(instance.refs.multipleTableRef)//将代理对象转换为了普通对象,不转会报错console.log(ultipleTabInstance);  //输出了一个普通对象if (rows) {rows.forEach(row => {ultipleTabInstance.toggleRowSelection.value(row, undefined)console.log(row)});} else {ultipleTabInstance.clearSelection.value()}}//备用方案onMounted(() => {// console.log(multipleTableRef);})//该方法用于将表格数据赋给ref变量var handleSelectionChange = (val) => {console.log(val)multipleSelection.value = val;}//此处是实现删除逻辑的方法var delete_post = () => {data2.value = multipleSelection.valueconsole.log(data2.value)data2.value.forEach(a => {console.log(a.id)list.unshift(a.id)})console.log(list)//将该id数组传到后端进行批量删除$.ajax({url: "http://127.0.0.1:4000/posts/add2",type: "POST",headers: {'Content-Type': 'application/json;charset=utf-8',},data: JSON.stringify({ "content": list }), success(resp) {if (resp === "success") {console.log("caa")list.value = null}}});}var onEdit = (data) => {tableItem.value = data //发送当前行数据给组件console.log(data)   //输出了一个Proxy数据console.log("tableItem部分———————Ref————————————————————————")console.log(tableItem) //输出了一个RefImpl数据console.log(tableItem.value)console.log(tableItem.value.shopname) //console.log("rea部分——————Reactive—————————————————————————")console.log(rea)console.log(rea.name)console.log(toRefs(rea))console.log(toRefs(rea).name)console.log("a部分———————Ref————————————————————————")console.log(a);console.log(a.value);console.log(a.value.name);//console.log(tableItem.value.get(name))  //会提示不是一个对象//console.log(tableItem.get(name))      //会提示console.log(tableItem.value.get(name))showDialog.value = true         //显示表单dialogFormVisible.value = true  //显示弹窗}//到这里为止都是加上的var data = reactive({arr: [{id: 1,shopname: "沙县小吃",score: 5.5,sales: 1200,hh: 12,type: "快餐"},{id: 2,shopname: "法式牛排餐厅",score: 7.5,sales: 2400,hh: 12,type: "西餐"},{id: 3,shopname: "沙县大吃",score: 6.5,sales: 200,hh: 12,type: "快餐"},{id: 4,shopname: "南昌瓦罐汤",score: 6.9,sales: 2400,hh: 12,type: "快餐"},]})return {data,multipleTableRef,toggleSelection,handleSelectionChange,delete_post,data2,onEdit,showDialog,tableItem,dialogFormVisible,close,rea, a}}
}
</script><style></style>

子组件代码

<template><el-form label-width="120px"><el-form-item label="Activity name"><el-input v-model="tableItem2.shopname" :value="tableItem2.shopname" /></el-form-item><el-form-item label="Activity name"><el-input v-model="tableItem2.score" :value="tableItem2.score" /></el-form-item><el-form-item label="Activity name"><el-input v-model="tableItem2.sales" :value="tableItem2.sales" /></el-form-item><el-form-item label="Activity name"><el-input v-model="tableItem2.type" :value="tableItem2.type" /></el-form-item><el-form-item><el-button type="primary" @click="onSubmit">Create</el-button><el-button>Cancel</el-button></el-form-item></el-form>
</template>
<script>
import { toRefs } from '@vue/reactivity';
import { ref } from 'vue';export default ({name: 'DialogComponent',props: {tableItem: {},},setup(props) {const tableItem2 = ref();const temp = ref();tableItem2.value = toRefs(props).tableItem.valueconsole.log("1--------")console.log(props);       //props是一个proxy代理对象console.log("2--------")console.log(props.tableItem)  //里面包着的tableItem也是一个代理对象console.log("3--------")//console.log(props.tableItem.value)   console.log(props.tableItem.shopname)  //Proxy代理对象不需要用value,可以直接访问console.log("4--------")temp.value = toRefs(props.tableItem)  //使用一个ref接受tableItem这个reactive创建的proxy对象然后将里面的属性全部变成了拥有ObjectRefImpl类型console.log(temp)console.log(temp.value.shopname)        //为什么这里ObjectRefImpl不需要用valueconsole.log(temp.value.shopname.value)  //shopname是ObjectRefImpl类型,但是.value输出undefinedconsole.log("5--------")console.log(toRefs(props).tableItem)   //tableItem变成了ObjectRefImpl类型,但是value还是proxy类型console.log("6--------")console.log(toRefs(props).tableItem.value)  //这里tableItem是ObjectRefImpl类型,用.value输出了proxy类型console.log(toRefs(props).tableItem.value.shopname) //const onSubmit = () => {console.log(tableItem2.value)}return {onSubmit,tableItem2,}},
})</script><style scoped></style>

相关文章:

Vue——vue3中的ref和reactive数据理解以及父子组件之间props传递的数据

ref()函数 这是一个用来接受一个内部值&#xff0c;返回一个响应式的、可更改的 ref 对象&#xff0c;此对象只有一个指向其内部值的属性 .value。 作用&#xff1a;创建一个响应式变量&#xff0c;使得某个变量在发生改变时可以同步发生在页面上。 模板语句中使用这个变量时…...

新手如何备考PMP考试?

回头看来&#xff0c;从战略上来说&#xff1a; 备考第一重点&#xff1a;要有一个清晰的目标——我要过&#xff01; 第二重点&#xff1a;足够重视它——把它的优先级调整到仅次于工作&#xff1a;万籁俱寂&#xff0c;唯有学习。 第三重点&#xff1a;自律——有了第一点…...

FPGA输出lvds信号点亮液晶屏

1 概述 该方案用于生成RGB信号&#xff0c;通过lvds接口驱动逻辑输出&#xff0c;点亮并驱动BP101WX-206液晶屏幕。 参考&#xff1a;下面为参考文章&#xff0c;内容非常详细。Xilinx LVDS Output——原语调用_vivado原语_ShareWow丶的博客http://t.csdn.cn/Zy37p 2 功能描述 …...

算法面试-深度学习基础面试题整理(2023.8.29开始,每天下午持续更新....)

一、无监督相关&#xff08;聚类、异常检测&#xff09; 1、常见的距离度量方法有哪些&#xff1f;写一下距离计算公式。 1&#xff09;连续数据的距离计算&#xff1a; 闵可夫斯基距离家族&#xff1a; 当p 1时&#xff0c;为曼哈顿距离&#xff1b;p 2时&#xff0c;为欧…...

FireFox禁用HTTP2

问题 最近需要调试接口&#xff0c;但是&#xff0c;Chrome都是强制使用h2协议&#xff0c;即HTTP/2协议。为了排除h2协议排除对接口调用的影响&#xff0c;需要强制浏览器使用HTTP1协议。 解决 FireFox 设置firefox的network.http.http2.enabled为禁用&#xff0c;这样就禁…...

搭建HTTPS服务器

HTTPS代理服务器的作用与价值 HTTPS代理服务器可以帮助我们实现网络流量的转发和加密&#xff0c;提高网络安全性和隐私保护。本文将指导您从零开始搭建自己的HTTPS代理服务器&#xff0c;让您更自由、安全地访问互联网。 1. 准备工作&#xff1a;选择服务器与操作系统 a. 选…...

无人化在线静电监控系统的组成

无人化在线静电监控系统是一种用于检测和监控静电情况的系统&#xff0c;它可以自动地实时监测各个区域的静电水平&#xff0c;并在出现异常情况时发出报警信号。静电监控报警器则是该系统中的一个重要组成部分&#xff0c;用于接收和传达报警信号。 无人化在线静电监控系统通…...

element ui级联选择器数据处理

后端同事返回的级联选择器数据的children是childrens&#xff0c;而组件渲染只识别children&#xff0c;所以需要props自定义传入&#xff0c;代码如下 <el-form-item label"应用页面&#xff1a;" prop"appId"><el-cascader:props"{ child…...

zookeeper-3.6.4集群搭建

1、上传zookeeper安装包并解压 上传路径&#xff1a;/opt/software/ 解压路径&#xff1a;/opt/module/ 2、创建数据目录及日志目录 #数据目录&#xff1a;/data/zookeeper/data/ #3台机器创建存储目录&#xff1a; sudo mkdir -p /data/zookeeper/data#日志目录&#xff1a…...

15种下载文件的方法文件下载方法汇总超大文件下载

15种下载文件的方法&文件下载方法汇总&超大文件下载 15种下载文件的方法Pentesters经常将文件上传到受感染的盒子以帮助进行权限提升&#xff0c;或者保持在计算机上的存在。本博客将介绍将文件从您的计算机移动到受感染系统的15种不同方法。对于那些在盒子上存在且需要…...

Windows安装配置Rust(附CLion配置与运行)

Windows安装配置Rust&#xff08;附CLion配置与运行&#xff09; 前言一、下载二、安装三、配置标准库&#xff01;&#xff01;&#xff01;四、使用 CLion 运行 rust1、新建rust项目2、配置运行环境3、运行 前言 本文以 windows 安装为例&#xff0c;配置编译器为 minGW&…...

【ROS】例说mapserver静态地图参数(对照Rviz、Gazebo环境)

文章目录 例说mapserver静态地图参数1. Rviz中显示的地图2. mapserver保存地图详解3. 补充实验 例说mapserver静态地图参数 1. Rviz中显示的地图 在建图过程中&#xff0c;rviz会显示建图的实时情况&#xff0c;其输出来自于SLAM&#xff0c;浅蓝色区域为地图大小&#xff0c…...

【RapidAI】P0 项目总览

RapidAI 项目总览 ** 内容介绍 ** Author&#xff1a; SWHL、omahs Github&#xff1a; https://github.com/RapidAI/Knowledge-QA-LLM/ CSDN Author&#xff1a; 脚踏实地的大梦想家 UI Demo&#xff1a; ** 读者须知 ** 本系列博文&#xff0c;主要内容为将 RapidAI 项目逐…...

初识c++

文章目录 前言一、C命名空间1、命名空间2、命名空间定义 二、第一个c程序1、c的hello world2、std命名空间的使用惯例 三、C输入&输出1、c输入&输出 四、c中缺省参数1、缺省参数概念2、缺省参数分类3、缺省参数应用 五、c中函数重载1、函数重载概念2、函数重载应用 六、…...

【面试经典150题】跳跃游戏Ⅱ

题目链接 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i]i j < n 返回到达 nums[n…...

20230831-完成登录框的按钮操作,并在登录成功后进行界面跳转

登录框的按钮操作&#xff0c;并在登录成功后进行界面跳转 app.cpp #include "app.h" #include <cstdio> #include <QDebug> #include <QLineEdit> #include <QLabel> #include <QPainter> #include <QString> #include <Q…...

039 - sql逻辑操作符

前提&#xff1a; 做两个表employee和movie&#xff0c;用来练习使用&#xff1b; 表一&#xff1a;employee -- 创建表employee CREATE TABLE IF NOT EXISTS employee(id INT NOT NULL AUTO_INCREMENT,first_name VARCHAR(100) NOT NULL,last_name VARCHAR(100) NOT NULL,t…...

DbLInk使用

DbLInk介绍 DbLink是一种数据库连接技术&#xff0c;在不同的数据库之间进行数据传输和共享。它提供了一种透明的方法&#xff0c;让一个数据库访问另一个数据库的数据。 DbLink的优点是可以在多个数据库间实现数据共享&#xff0c;并且为不同数据库间的数据访问提供了便捷的…...

2.3 Vector 动态数组(迭代器)

C数据结构与算法 目录 本文前驱课程 1 C自学精简教程 目录(必读) 2 Vector<T> 动态数组&#xff08;模板语法&#xff09; 本文目标 1 熟悉迭代器设计模式&#xff1b; 2 实现数组的迭代器&#xff1b; 3 基于迭代器的容器遍历&#xff1b; 迭代器语法介绍 对迭…...

【ES6】Proxy的高级用法,实现一个生成各种 DOM 节点的通用函数dom

下面的例子则是利用get拦截&#xff0c;实现一个生成各种 DOM 节点的通用函数dom。 <body> </body><script>const dom new Proxy({}, {get(target, property) {return function(attrs {}, ...children) {const el document.createElement(property);for …...

气象站是什么设备?功能是什么?

气象站是一种用于测量和记录气象数据的设备。它通常是由各种传感器及其数据传输设备、固定设备和供电设备组成&#xff0c;可以测量风速、风向、温度、湿度、气压、降水量等气象要素&#xff0c;并将这些数据记录下来&#xff0c;以便进一步分析和研究。 气象站通常设置在广阔…...

227. 基本计算器 II Python

文章目录 一、题目描述示例 1示例 2示例 3 二、代码三、解题思路 一、题目描述 给你一个字符串表达式 s &#xff0c;请你实现一个基本计算器来计算并返回它的值。 整数除法仅保留整数部分。 你可以假设给定的表达式总是有效的。所有中间结果将在 [-2^31, 2^31 - 1]的范围内…...

python中字典常用函数

字典常用函数 cmp(dict1,dict2) &#xff08;已删除&#xff0c;直接用>,<,即可&#xff09; 如果两个字典的元素相同返回0&#xff0c;如果字典dict1大于字典dict2返回1&#xff0c;如果字典dict1小于字典dict2返回-1。 先比较字典的长度&#xff0c;然后比较键&#x…...

leetcode88合并两个有序数组

题目&#xff1a; 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&…...

Ceph入门到精通-Nginx 大量请求 延迟优化

优化nginx以处理大量请求并减少延迟可以通过以下几种方法实现&#xff1a; 调整worker_processes和worker_connections参数&#xff1a;增加worker_processes值可以增加nginx的进程数量&#xff0c;提高并发处理能力。增加worker_connections参数的值可以增加每个worker进程可…...

Vulnstack----5、ATTCK红队评估实战靶场五

文章目录 一 环境搭建二 外网渗透三 内网信息收集3.1 本机信息收集3.2 域内信息收集 四 横向移动4.1 路由转发和代理通道4.2 抓取域用户密码4.3 使用Psexec登录域控4.4 3389远程登录 五、痕迹清理 一 环境搭建 1、项目地址 http://vulnstack.qiyuanxuetang.net/vuln/detail/7/ …...

QT 5.8

QT与Qt Creator&#xff0c;前者是框架&#xff0c;类似与MFC&#xff0c;而后者是QT的编译器&#xff0c;也可以使用Visual studio编辑&#xff0c;编译需要其他的 Index of /new_archive/qt/5.8/5.8.0...

AIGC+思维导图:提升你的学习与工作效率的「神器」

目录 一、产品简介 二、功能介绍 2.1 AI一句话生成思维导图 2.2百万模版免费用 2.3分屏视图&#xff0c;一屏读写 2.4团队空间&#xff0c;多人协作 2.5 云端跨平台化 2.6 免费够用&#xff0c;会员功能更强大 2.7 支持多种格式的导入导出 三、使用教程 3.1 使用AI…...

javaScript:DOM元素的获取(静态/动态获取)

目录 一.dom元素获取的意义与使用场景 使用场景&#xff08;绝大多数js操作都需要dom操作&#xff09; 总结/疑问解答&#xff01; 二.DOM元素获取的常用方法&#xff08;重点&#xff09; 获取dom元素&#xff08;动态&#xff09; document.gerElementbyId() docume…...

数据结构前言

一、什么是数据结构&#xff1f; 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。 上面是百度百科的定义&#xff0c;通俗的来讲数据结构就是数据元素集合与数据元素集合或者数据元素与数据元素之间的组成形式。 举个…...

辽宁省人民政府网站官网/营销策划推广公司

在我们用pl/sql的Tools导出用户对象时&#xff0c;例如导出一个表&#xff0c;则导出的t_test.sql的前几行如下&#xff1a; spool test.log prompt prompt Creating table t_test prompt prompt 这里的prompt的作用相当于一般的操作系统命令echo&#xff0c;输出后面的信…...

建设网站交纳党费/怎么建自己的网站?

用SQL Server2005同义词链接Oracle数据库可以将Oracle中的表&#xff0c;视图等映射到SQL2005中&#xff0c;直接在SQL2005中操作Oracle的数据&#xff0c;非常简单方便。 下面具体一部一部讲解如何实现的。 环境&#xff1a;Windows2005SQL2005&#xff0c;数据库名字为amd Or…...

如何做网站运营/北京学电脑的培训机构

docker run -t -i ubuntu:14.04 /bin/bash 新建并启动容器 -t 让Docker分配一个伪终端&#xff08;pseudo-tty&#xff09;并绑定到容器的标准输入上 -i 让容器的标准输入保持打开 -d 让容器在后台以守护态&#xff08;Deamonized&#xff09;形式运行 -v 创建一…...

如何在租用的服务器上部署自己的网站 mysql/霸榜seo

文章目录 知识点实例代码目录代码实现知识点 configure_fileconfigure_file 指令通过读取输入文件中的内容,将 CMakeLists.txt 文件中的变量转变为 C/C++ 中可识别的宏定义, 然后存入另一个文件中 我们使用了如下 CMAKE_PROJECT_VERSIONCMAKE_PROJECT_VERSION_MAJORCMAKE_PRO…...

做网站的设计尺寸/免费域名注册永久

Python在行的开头使用间距来确定代码块何时开始和结束。你可以得到的错误是&#xff1a; 意外的缩进。这行代码在开始时比前一行有更多空格&#xff0c;但前一行不是子块的开头&#xff08;例如if / while / for语句&#xff09;。块中的所有代码行必须以完全相同的空格字符串开…...

wordpress做直播网站吗/广告网络推广怎么做

#如果node加入不了master或者加入成功但是&#xff0c;在master中显示不出来。排查错误:1. 运行&#xff0c;kubelet, 查看日志&#xff0c;一般是kubelet的运行和docker启动方式不匹配。调整&#xff1a;vim /etc/docker/daemon.json修改&#xff1a;native.cgroupdrivercgro…...