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>

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

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

相关文章

国产集成开发环境工具 CEC-IDE

本周&#xff0c;国内首款适配国产操作系统、自主可控的集成开发环境工具 CEC-IDE 终于开放下载了。公开报道显示&#xff0c;这款集成开发环境工具由数字广东公司联合麒麟软件打造&#xff0c;于今年 6 月份首次亮相。本周&#xff0c;软件上线仅几天内就在知乎和 GitHub 上引…

Jenkins buildDescription 设置html格式及url

文章目录 1.首先安装插件2.更改配置3.接下来就可以在pipline里写脚本了 当然也可以插件方式配置示例1 脚本方式示例2 插件方式 搞了好多种方式都不成功后来发现是配置有问题&#xff0c;其实很简单&#xff0c;记录下也给想用此功能的朋友们一个示例&#xff0c;网上写的例子都…

什么是手术麻醉系统?

一、手术麻醉系统的主要作用 手术麻醉系统能更好、更准确地记录和管理手术与麻醉的临床信息&#xff0c;提高医生和麻醉师的工作效率。它主要用于病人手术与麻醉的申请、审批、安排&#xff0c;精确记录病人在手术过程中的术中医嘱、术中费用等信息&#xff0c;追踪生命体征等…

〔021〕Stable Diffusion 之 提示词反推、自动补全、中文输入 篇

✨ 目录 &#x1f388; 反推提示词 / Tagger&#x1f388; 反推提示词 Tagger 使用&#x1f388; 英文提示词自动补全 / Booru tag&#x1f388; 英文提示词自动补全 Booru tag 使用&#x1f388; 中文提示词自动补全 / tagcomplete&#x1f388; 中文提示词自动补全 tagcomple…

DETRs Beat YOLOs on Real-time Object Detection

目录 1、模型架构1.1高效混合编码器1.1.1 尺度内特征交互模块AIFI1.1.2 跨尺度特征融合CCFM 1.2IoU感知查询选择总结 DETRs在实时目标检测中击败YOLO 问题&#xff1a;DETR的高计算成本&#xff0c;实时检测效果有待提高 解决&#xff1a;提出了一个实时的目标检测器 具体来说…

SpringCloud(35):Nacos 服务发现快速入门

本小节,我们将演示如何使用Spring Cloud Alibaba Nacos Discovery为Spring cloud 应用程序与 Nacos 的无缝集成。 通过一些原生的spring cloud注解,我们可以快速来实现Spring cloud微服务的服务发现机制,并使用Nacos Server作为服务发现中心,统一管理所有微服务。 1 Spring…

elementui el-table在有summary-method时,table数据行将合计行遮挡住了

前端使用框架&#xff1a;elementUI 使用组件&#xff1a;el-table 在表格内添加合计了合计行&#xff0c;根据业务多次调用数据渲染画面后&#xff0c;偶然导致画面变成如下图所示&#xff0c;table的数据行将合计行遮挡住了&#xff0c;且这个现象有时候好用&#xff0c;有…

【ES6】Class中this指向

先上代码&#xff1a; 正常运行的代码&#xff1a; class Logger{printName(name kexuexiong){this.print(hello ${name});}print(text){console.log(text);} }const logger new Logger(); logger.printName("kexueixong xiong");输出&#xff1a; 单独调用函数p…

电脑怎么设置定时关机,2个简单的操作

电脑作为现代生活中不可或缺的工具&#xff0c;我们通常会在工作或娱乐过程中使用它。但有时候&#xff0c;我们可能需要在一段时间后自动关机&#xff0c;例如在下载完成后或在睡觉前。那么电脑怎么设置定时关机呢&#xff1f;为了满足这种需求&#xff0c;电脑提供了多种定时…

Dom-clobbering原理和例题

目录 引入 1.获取标签 2.覆盖 3.多层覆盖 利用Dom-clobbering 1.tostring 2.集合取值 3.层级关系取值 4.三层取值 5.自定义属性 例题 1 2. 3. 引入 分析 引入 先用三个小例子看看dom-clobbering干了什么 1.获取标签 这个例子给img标签分别做了一个id和一个name…

博弈论基础

简单记录一下博弈论的知识。 博弈的分类&#xff1a; 关键词&#xff1a;正则博弈、扩展博弈、第三类博弈。 市场进入和阻挠博弈&#xff1a; 不完美博弈和不完全博弈&#xff1a; 混合策略和纯策略&#xff1a;

Docker安装部署ElasticSearch(ES)

文章目录 安装前准备创建挂载目录授权相关权限创建elasticsearch.yml文件 拉取镜像运行容器查看运行情况测试 安装前准备 创建挂载目录 用于在宿主机挂载日志&#xff0c;数据等内容 创建/opt/es/data目录 创建/opt/es/logs目录 创建/opt/es/plugins目录 创建/opt/es/conf目录…

docker 安装rabbitmq

前提&#xff1a;安装好docker docker安装_Steven-Russell的博客-CSDN博客 centos7安装docker_centos7 docker 安装软件_Steven-Russell的博客-CSDN博客 1、启动docker systemctl start docker 2、下载镜像 // 可以先search查询一下可用镜像&#xff0c;此处直接下载最新版本…

C#,《小白学程序》第十一课:双向链表(Linked-List)其二,链表的插入与删除的方法(函数)与代码

1 文本格式 /// <summary> /// 改进的车站信息类 class /// 增加了 链表 需要的两个属性 Last Next /// </summary> public class StationAdvanced { /// <summary> /// 编号 /// </summary> public int Id { get; set; } 0; ///…

java八股文面试[数据库]——mysql主从复制

什么是mysql的主从复制&#xff1f; MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式&#xff0c;这样从节点不用一直访问主服务器来更新自己的数据&#xff0c;数据的更新可以在远程连接上进行&#xff0c;从节点…

《Python魔法大冒险》005 魔法挑战:自我介绍机器人

魔法师和小鱼坐在图书馆的一扇窗户旁&#xff0c;窗外的星空闪烁着神秘的光芒。魔法师轻轻地拍了拍小鱼的肩膀。 魔法师&#xff1a; 小鱼&#xff0c;你已经学会了编写简单的魔法程序&#xff0c;现在我要教你如何创造一个有自己思想的机器人&#xff0c;让它能够和我们一样&…

联合教育部高等学校科学研究发展中心,阿依瓦科技创新教育专项正式发布!

7 月 24 日&#xff0c;教育部科技发展中心官网发布了《中国高校产学研创新基金&#xff0d;阿依瓦科技创新教育专项申请指南》。 针对高校在人工智能、智能制造、智慧校园、大数据等领域科研和教研的创新研究&#xff0c;教育部高等学校科学研究发展中心与阿依瓦(北京)技术有…

c++ vs2019 cpp20 规范,set源码分析

&#xff08;1&#xff09;set模板和map模板都是继承于一个父类 所以没有再详细注释。维持红黑树主要的功能都在父类_Tree里了&#xff0c;比如节点的添加&#xff0c;删除&#xff0c;查找。父类红黑树的操作&#xff0c;并不依赖于特定的数据类型。做到了父类模板的通用性。…

Linux命令之用户管理(详解)

Linux命令之用户管理 常用基础命令修改root密码切换用户身份改变当前目录查看命令的用法查看命令之ls 用户管理用户的创建adduser创建useradd创建两种方式的区别 用户删除用户密码重置查看当前所有用户 在介绍Linux用户管理相关的命令之前&#xff0c;我们先介绍一些Linux的一些…

低压配电室电力安全解决方案

低压电气安全监控运维系统是力安科技基于物联网核心技术自主开发的高可靠性安全监测系统。其工作原理是利用物联网、云计算、大数据、数字传感技术及RFID无线射频识别技术来获取低压配电回路电压、电流、温度、有功、无功、功率因数等全电量的采集及配电线路的漏电、温度的实时…