vue3 组件之间传值

vue3 组件之间传值

非常好,为啥突然开这样一篇博文,首先是因为 vue3 是未来发展的趋势。其次,vue 官方已经确认,将于2023年最后一天停止对 vue2 项目的维护,这个是官方发出的通知,并且呢,尤雨溪团队也已经将 vue3 作为了 vue 的默认版本了,同时呢,无论是 elementUI 和 ant-d 组件库团队,也已经很早之前就发布了针对于 vue3 的组件库。接下来,我们要真正的开始内卷 vue3 了家人们!

前言

vue2.7 是现在,也是最后一个 vue2 版本的更新,官方已经发布通告,vue2 版本将于 2023年12月31日 停止维护,但是停止维护不代表不能使用哈,我们可以继续使用 vue2 版本开发我们的项目,只不过,官方团队已经不会在对 vue2 版本进行更新,这个更新包括了安全性和兼容性的更新修复问题。如果我们继续使用 vue2 版本开发项目的话,我们可能就需要面对一个问题,就是如何向用户解释:你买了我们的电脑,但我们给你配的是 window xp 系统。

在这里插入图片描述

vue3 组件通信

使用过 vue2 的兄弟们,在开发项目里面最常用的东西是啥子嘞?首先组件通信排第一吧!牛的嘞,这一节,就说一下 vue3 的组件通信方式哈。

好的,首先要注意一点,学习这一部分的话需要用到一些其他的知识点:第一个是 vue3 的基础语法,可以看我之前的博文;再一个就是 TypeScript,当然也可以看我之前的博文。都没有问题了,下面的东西就很简单了。

props 传值

在 vue2 里面可以使用 props 传值,在 vue3 里面依旧可以使用,但是改了个名字,叫 defineProps 获取父组件传递的数据,且在组件内部不需要引入 defineProps 方法就可以直接使用。

下面案例稍微讲一下哈,首先我们创建一个 vue3 的项目,我们编写两个组件:

编写父组件

首先编写一个父组件

<!-- 模板语法 -->
<template><p class="ed-father-title">父组件</p><div class="ed-father-con"></div>
</template><script setup lang="ts"></script><style scoped>
.ed-father-title {margin: 10px;font-size: 25px;color: hotpink;font-weight: 550;
}.ed-father-con {height: 400px;background-color: beige;padding: 15px;
}
</style>

执行效果就是下面的样子:

在这里插入图片描述

编写子组件

接下来继续开发一个组件作为子组件:

<template><p class="ed-son-title">子组件</p><div class="ed-son-con"></div>
</template><script setup lang="ts"></script><style scoped>
.ed-son-title {margin: 10px;font-size: 20px;color: red;font-weight: 550;
}.ed-son-con {height: 300px;background-color: cadetblue;padding: 15px;
}
</style>

编写完成之后呢,我们在父组件里面引入这个子组件。

父组件引入子组件

引入子组件呢,就需要两个步骤就可以了,首先引入子组件文件,然后在 dom 上使用子组件就可以了。

<!-- 模板语法 -->
<template><p class="ed-father-title">父组件</p><div class="ed-father-con"><!-- 使用子组件 --><sonModel></sonModel></div>
</template><script setup lang="ts">
// 引入子组件
import sonModel from './sonModel.vue';</script><style scoped>
.ed-father-title {margin: 10px;font-size: 25px;color: hotpink;font-weight: 550;
}.ed-father-con {height: 400px;background-color: beige;padding: 15px;
}
</style>

然后我们看一下效果:

在这里插入图片描述

非常棒,效果已经引入进来了。

父组件向子组件传递参数

首先我们在父组件创建一个变量,然后把这个变量传递给子组件,让子组件接收这个变量。

父组件创建变量

父组件创建一个 num,设置他的值为 10:

// 创建变量
const num = ref(10)

父组件把值传递给子组件

然后呢,我们把这个变量传递给子组件,和 vue2 的方式是一样的:

<!-- 使用子组件 -->
<sonModel :num="num"></sonModel>

这样我们就把父组件的变量传递给子组件了,这里我们传递的是变量,当然我们也可以直接写死传递一个常量进去:

<!-- 使用子组件 -->
<sonModel :num="num" msg="我是ed."></sonModel>

好,到这里应该都明白就不再赘述了。

接下来就是子组件通过 defineProps 方法获取父组件传递进来的数据,同样也是很简单,注意一点,defineProps 方法是不需要引入的,直接使用即可。

子组件接收数据:方式一

let props = defineProps({num: {type: Number,  // 接收数据的类型default: 0   // 默认值},msg: {type: String,  // 接收数据的类型default: 'hello'   // 默认值}
})

OK,结束了。我们看一下:

在这里插入图片描述

没问题,子组件已经有这两个数据了,我们可以直接在页面上显示一下子:

<template><p class="ed-son-title">子组件</p><div class="ed-son-con"><p class="ed-txt">父组件传递的num:{{ num }}</p><p class="ed-txt">父组件传递的msg:{{ msg }}</p></div>
</template>

看一下效果:

在这里插入图片描述

没问题,可以正常使用!这是子组件接受参数的第一种方式。

子组件接收数据:方式二

第二种方式和第一种一样,只不过不需要那么繁琐的配置,简单配置也是可以的了。

// 子组件接收父组件传参方式二
let props = defineProps(['num', 'msg'])

这样是也是可以的,效果是一模一样的,只不过取消了对数据类型的限制,和 vue2 其实是一样的哈!

在这里插入图片描述

页面效果也是一样的。

自定义事件

首先呢,自定义事件也是可以进行组件间传值的,先说一下哈,在 vue 里面嘞,有两种事件,一种是原生DOM事件,一种是自定义事件

原生事件

原生事件都知道的,像是 click、dbclick、change、mouseenter 这些都是原生事件。

比如下面的代码:

<div @click="divClickFun"></div>

给 div 标签绑定了一个原生事件 click,他默认会给事件回调注入 enent 事件对象,当然点击事件想注入多个参数也是可以的,但是切记,注入的事件对象必须叫做 $event

<div  @click="divClickFun(10,'我是ed.', $event)">点击</div>

我们看一下打印的结果:

在这里插入图片描述

如果我们传递的不是以 $event 命名的话,我们看一下:

<div  @click="divClickFun(10,'我是ed.', event)">点击</div>

看一下打印的数据:

在这里插入图片描述

就是 undefined 了,所以注意:注入的事件对象务必叫做 $event。

在 vue3 框架里面呢,click、dbclick、change 这类原生DOM事件,无论是在标签还是组件上面都算是原生DOM事件;但是在 vue2 中不是这样的,在 vue2 中组件标签上面,需要通过 native 修饰符才能变成原生DOM事件,这个知道就可以哈!

自定义事件

自定义事件,可以实现子组件给父组件传递数据,在项目中是非常非常重要的,也是经常使用到的。

比如最开始的案例,我们在父组件引入的子组件标签上追加一个自定义事件:

<sonModel @getData="getDataFun" :num="num" msg="我是ed."></sonModel>

上面这个代码写 vue2 的应该都知道哈,就不赘述了,就是自己写一个自定义事件 getData ,触发之后调用 getDataFun 方法。

那么怎么触发这个自定义事件 getData 呢?

我们需要在子组件内部触发,比如说我们在子组件内部编写一个按钮,点击按钮的时候,触发这个自定义事件,并且传值。

子组件内部编写按钮

<button @click="toFatherData()">向父组件传递数据</button>

编写一个按钮,有一个点击事件,点击执行 toFatherData() 方法。

使用 defineEmits 方法

接下来我们需要了解一个新的方法,叫做 defineEmits ,这是 vue3 提供的一个方法,不需要引入,直接使用即可。这个方法需要传递一个数组进去,数组的元素就是将来数组需要触发的自定义事件类型,这个方法会返回一个 $emit 方法来触发自定义事件。

说的比较多,看下面的代码就可以了:

let $emit = defineEmits(["getData"]);

因为子组件想出发父组件的 getData 传递参数,所以传递列表的数组元素就得包含这个将来可能会触发的自定义事件方法。

触发自定义方法

上面我们已经编写了一个按钮,按钮带有点击事件,$emit 也已经有了,接下来就是触发父组件的自定义事件了,接下来我们完善按钮的点击事件:

// 按钮点击事件
let toFatherData = () => {$emit("getData", "我是子组件传递的数据", "大家好,我是ed.");
}

当我们点击按钮的时候,事件回调内部调用 $emit 方法去触发自定义事件,第一个参数为触发事件类型,第二个、三个、N个参数即为传递给父组件的数据。

父组件打印子组件传递的数据

上面一个步骤呢,子组件成功触发了父组件的自定义事件,然后父组件自定义事件触发之后,他会走一个函数,我们在这个函数里面就可以获取到子组件传递回来的数据,我们打印一下:

// 父组件接收打印子组件传递回来的数据
const getDataFun = (data: string, data2: string) => {console.log(data, data2);
}

我们看一下打印的结果:

在这里插入图片描述

可以看到,当子组件的按钮被点击,父组件可以正常打印出子组件传递回来的数据了。

注意事项

但是注意一点哈,跟上面案例没关系了,看下面的代码:

<sonModel @click="clickFun" @getData="getDataFun" :num="num" msg="我是ed."></sonModel>

getData 方法是一个自定义事件对吧,click 方法是一个原生事件,但是,如果我们在子组件的 defineEmits 中定义了 click ,那么,click 就被定义成为自定义事件了:

let $emit = defineEmits(["getData", "click"]);

好的,到这里 自定义事件 传递数据就结束了。

全局事件总线传值

上面我们说了使用 propsemit 实现父子组件之间的传值,那就有一个问题,如果是兄弟组件之间通信呢?当然了,使用 props 链也是可以的:子组件1把数据传递到父组件,父组件在把数据传递给子组件2。这是完全没有问题的,除了复杂一些。

其实还有一种方式能够更快的实现兄弟组件之间传值,那就是全局事件总线,全局事件总线可以实现任意组件间的通信。

在 vue2 里面,可以根据 VM 和 VC 关系推理出全局事件总线,但是 vue3 里面没有 vue 构造函数,也就没有 Vue.prototype. 以及组合式API没有 this ,那在 vue3 里面想要实现全局事件总线功能就有些许的不现实,其实,在 vue3 中如果想使用全局事件总线可以采用 mitt 插件。

mitt

mitt npm 地址:https://www.npmjs.com/package/mitt

这里呢,就单纯的说一下怎么简单的使用哈,详细的大家去上面的网站看哈。

Mitt 有啥优点呢,稍微说一下,就一下:

  • 零依赖,体积小,压缩后就200b。
  • 提供了完整的 TypeScript 的支持,能自动推断参数类型。
  • 基于闭包实现,没有 this 困扰。
  • 为浏览器编写,但也支持其他 JavaScript 。
  • 与框架无关,可以与任何框架搭配使用。
mitt 安装

安装其实也比较简单,直接一行命令就可以安装完成:

npm i mitt

等待命令执行完成就可以了。

使用 mitt

使用的话和 vue2 的 bus 差不多,我们先创建一个 EventBus.ts 文件。

在这里插入图片描述

在文件中创建事件总线对象并对外暴露,然后就可以在使用事件总线的地方导入了。

import mitt from "mitt";
export default mitt();

很简单,就两行代码:

在这里插入图片描述

接下来就是在需要的组件中使用了。

使用的方式比较简单,还是上面案例,我们子组件直接通过 mitt 给父组件通信,不用 emit 了。

子组件发送数据

首先在子组件内部,引入我们上面创建的文件:

import EventBus from '../utils/EventBus';

然后我们重写按钮点击事件,通过 mitt 给父组件传值:

// 按钮点击事件
let toFatherData = () => {// $emit("getData", "我是子组件传递的数据", "大家好,我是ed.");EventBus.emit('sendData', {name: '我是ed.', age: 18})
}

看上面代码,EventBus.emit( type , evt ) 方法呢,就是用 mitt 发送数据,这个方法有两个参数,一个是 type:要调用的事件类型;一个是 evt:可以理解为传递的参数,建议是对象。

好了,这样的话,子组件就向父组件传递了数据,接下来就是父组件接受子组件传递的数据。

父组件接收数据

同样父组件需要先引入 EventBus 这个文件,任何组件用到就需要引入。

import EventBus from '../utils/EventBus';

引入完成,父组件接收 mitt 传递的数据,需要使用一个方法,叫做 EventBus.on( type, handler ),这个方法也需要两个参数:type 是要调用的事件类型,比如上面子组件发送数据的时候使用的是 sendData,那么父组件如果想接收子组件发送的这个数据,此处也要设置为 sendData;第二个 handler 是回调函数,意思是获取到数据执行什么操作,该函数会有一个回调参数,参数就是传递的数据:

EventBus.on('sendData', (params) => {console.log('mitt接收到的数据:', params);
})

OK,上面代码就可以获取组件通过 mitt 传递的数据了,但是有一点需要注意一下,上面这段代码直接写在 setup 里面就行,不需要通过任何操作触发,当收到 sendData 类型的数据就会直接走回调。

在这里插入图片描述

这是子组件给父组件通过 mitt 发送数据,我们只是举了一个例子来实现通过 mitt 通信,其实使用 mitt 按照这个步骤可以实现任何两个组件通信,比如父子组件通信,兄弟组件通信,祖孙组件通信,都可以。

其他注意事项

上面说的只是 mitt 最基本的功能哈,更多消息的功能参考我上面给出的网站。

比如说,我们再在子组件写一个按钮,也是给父组件发送数据,但是我们的类型不是 sendData 了,我们换成一个别的,比如 sendData2,我不细说了直接看代码:

编写 html 代码:

    <button @click="toFatherData2()">向父组件传递数据2</button>

编写 ts 代码:

// 按钮点击事件
let toFatherData2 = () => {EventBus.emit('sendData2', { name: '我是ed.同学', age: 24 })
}

然后我们也是在父组件在追加一个监听 sendData2 类型的 mitt 接受数据:

EventBus.on('sendData2', (params) => {console.log('mitt接收到的数据2:', params);
})

我们看一下效果:

在这里插入图片描述

点击第一个按钮,打印最开始的数据,点击第二个按钮,打印我们新写的,没有问题。

所以说哈,只要我们这个 type 调用的事件类型匹配起来,我们可以在一个组件里面写好多个,都不影响的。

发现没,我们父组件其实写了两个监听:

在这里插入图片描述

其实 mitt 有一个可以同时监听全部调用事件类型:

EventBus.on('*', (type, params) => {console.log('* mitt接收到的数据:', type, params);
})

其实和普通监听是一样的,只不过 调用事件类型的type 变成了 * 号,代表监听全部。同时,回调函数现在回调了两个参数 (type, params) ,其中 type 代表接受到数据的调用事件类型,第二个才是接受的参数,我们可以看一下效果:

在这里插入图片描述

都能打印出来,很好,奈斯,我们写的单独监听的和全部监听的都不会有影响。

好的,还有其他的方法其实,那些去看文档吧,一般也用不到。

好了, mitt 先说这些吧,什么全局挂载全局使用这些,就先不说了, 需要的时候在自行百度吧。

v-model

使用 v-model 可以实现数据双向绑定,除此之外呢,它也可以实现父子组件之间的数据同步。

v-model 实指利用 props[modelValue] 与自定义事件 [update:modelValue] 实现的。

一个案例说明白哈,其实很简单,vue2 里面也有类似的实现方式,vue3 只不过是把写法变了一下,看下面代码:

我先在父组件创建一个变量 pageNo

const pageNo = ref(1)

没问题哈,然后把这个变量双向绑定到子组件:

<sonModel v-model:pageNo="pageNo"  @getData="getDataFun" :num="num" msg="我是ed."></sonModel>

我使用 v-model 绑定到了子组件, 主要是 v-model:pageNo="pageNo" 这段代码,大体意思可以理解为我把父组件的 pageNo 传递到子组件 props 中的 pageNo 里面去。

那么子组件就可以接收父组件传进来的 pageNo 数据:

let props = defineProps(['num', 'msg', 'pageNo'])

然后我们可以看一下子组件 props 里面有没有这个 pageNo

在这里插入图片描述

诶,子组件接受到了,我们可以直接在页面渲染一下子。

<p class="ed-txt">父组件传递的pageNo:{{ pageNo }}</p>

我们看一下,可以正常使用:

在这里插入图片描述

然后我们修改一下父组件这个数据,使用 update:pageNo,子组件中不能直接处理父组件传进来的数据,我们这个其实是通过emit返回给父组件让他来处理:

<button @click="updataPageNoFun()">更新pageNo: {{ pageNo }}</button>

我们在子组件编写一个按钮,按钮有点击事件,点击事件,我们和 emit 一样,触发父组件的自定义事件:

首先,我们要想调用父组件的自定义事件,那么我们必须在 defineEmits 中先把类型添加进来吧?

let $emit = defineEmits(["getData", "update:pageNo"]);

我们添加了一个 update:pageNo 进来,这个是啥意思呢?可以简单理解,我是用update:前缀后,表示我们需要更新pageNo这个数据,因为是 v-model 绑定的数据,父组件直接获取要更新的值给我们更新了,不用在自己编写自定义事件了。

其实 v-model 的本质是属性绑定和事件绑定的结合那语法糖包一下。

然后我们完善按钮点击事件:

const updataPageNoFun = () => {$emit("update:pageNo", props.pageNo + 1);
}

我们看一下效果:

在这里插入图片描述
好的,完成了!就这么简单,当然你一个组件绑定多个 v-model 都是可以的,只需要传递的参数不一样就可以了。

useAttrs

vue3 当中,可以使用 useAttrs 来进行父组件向子组件传值。他可以获取组件的属性和方法,当然这包含了原生的DOM事件或者是自定义事件,这个函数类似于 vue2 里面的 $attrs 属性与$listeners 方法。

下面一个案例稍微说一下哈,还是之前的案例,父组件引入子组件,上面向子组件传递了好多数据,包括自定义方法:

<sonModel v-model:pageNo="pageNo"  @getData="getDataFun" :num="num" msg="我是ed."></sonModel>

然后在子组件呢,我们可以使用 useAttrs 来获取子组件上被添加的这些数据和方法,我们先编写一个按钮,点击按钮,打印通过 useAttr 拿到的数据:

<button @click="getDataByUseAttrs()">通过useAttrs获取数据</button>

接下来,我们要引入一下 useAttrs

import { useAttrs } from 'vue';

然后初始化一下:

const $attrs = useAttrs()

然后我们通过点击按钮,打印一下 $attrs 里面的数据:

const getDataByUseAttrs = () => {console.log($attrs)
}

我们看一下效果:

在这里插入图片描述

我去,什么也没有打印出来啊!

<sonModel v-model:pageNo="pageNo"  @getData="getDataFun" :num="num" msg="我是ed."></sonModel>

我们不是往子组件绑定了pageNonummsg 这些数据了吗?怎么都没有?

OK, 需要注意如果defineProps接受了某一个属性,useAttrs方法返回的对象身上就没有相应属性与属性值。 因为这些传进来的数据都被 defineProps 接收了,所以这里 $attrs 已经没有了。defineProps 的优先级高于 $attrs

那我们在子组件在传几个数据:

<sonModel ed="我是ed.同学" v-model:pageNo="pageNo"  @getData="getDataFun" :num="num" msg="我是ed."></sonModel>

然后我们在打印一下:

在这里插入图片描述

诶,现在就打印出来了。我们可以使用 console.log($attrs.ed) 直接打印出数据值。

同样,如果挂载了方法的话,也是可以获取到的:

<sonModel @change="sonChangeFun()" ed="我是ed.同学" v-model:pageNo="pageNo"  @getData="getDataFun" :num="num" msg="我是ed."></sonModel>

看一下结果:

在这里插入图片描述

ref 与 $parent

ref

提到 ref 可能会想到它可以获取元素的DOM或者获取子组件实例的VC。既然可以在父组件内部通过ref获取子组件实例VC,那么子组件内部的方法与响应式数据父组件可以使用的。

这个就比较简单了,一个案例结束。

我先把之前案例代码全删掉,从新写哈。

还是父组件调用子组件,然后呢,我在子组件创建几个变量,几个方法。

<script setup lang="ts">import { ref } from 'vue';const name = ref('我是ed.');
const age = ref(18);const changeName = () => {console.log("我是子组件的方法")
}</script>

很简单,我想让父组件能够直接访问子组件的数据和方法,光通过上面的代码不行!

如果让父组件获取子组件的数据或者方法需要通过 defineExpose 对外暴露,因为 vue3 中组件内部的数据对外【关闭的】,外部不能访问。

所以使用 defineExpose 暴露一下:

<script setup lang="ts">import { ref } from 'vue';const name = ref('我是ed.');
const age = ref(18);const changeName = () => {console.log("我是子组件的方法")
}defineExpose({ name, changeName })</script>

我就暴露了两个哈,age 没有暴露,然后我们在父组件写一个按钮,调用一下看能不能获取到 namechangeName 方法。

首先在父组件,我们先要获取到子组件:

<sonModel ref="sonFrom"></sonModel>
const sonFrom = ref()

然后在父组件写一个按钮,点击按钮的时候,我们打印一下子组件的 name 数据:

<button @click="conData()">打印子组件数据</button>

然后编写点击事件,打印一下子组件的 name

const conData = () => {console.log(sonFrom.value.name);
}

我们看一下效果:

在这里插入图片描述

获取成功 !

调用一下子组件的方法:

const conData = () => {console.log(sonFrom.value.name);sonFrom.value.changeName()
}

看一下结果:

在这里插入图片描述

方法也调用打印出来了。

age 没有在子组件用 defineExpose 抛出来,可以获取到吗?试一下哈:

const conData = () => {console.log(sonFrom.value.name);sonFrom.value.changeName()console.log(sonFrom.value.age);
}

看一下结果:

在这里插入图片描述

好了,关于 ref 就到这里了。

$parent

$parent 可以获取某一个组件的父组件实例VC,因此可以使用父组件内部的数据与方法。必须子组件内部拥有一个按钮点击时候获取父组件实例,当然父组件的数据与方法需要通过defineExpose方法对外暴露。

哎哟,他和 ref 差不多,我不想写了,到这里这篇博文已经写了一万三的字了,好累啊!

不解释了,直接贴代码了哈,和 ref 一样的。

父组件定义一个变量:

const msg = ref('hello world')defineExpose({ msg })

主要是子组件,写一个按钮,点击按钮的时候打印父组件的数据:

<button @click="getMsg($parent)">获取父组件的 msg 数据</button>

然后编写点击事件:

const getMsg = ($parent) => {console.log($parent.msg)
}

查看一下效果:

在这里插入图片描述

成功!好了,到这结束了这一小节,抓紧下一个。

provide 与 inject

vue3提供两个方法provideinject,可以实现隔辈组件传递参数。

这两个其实在 vue2 就是可以使用的,简单点一笔带过哈!

provide方法用于提供数据,此方法执需要传递两个参数,分别提供数据的key与提供数据value

比如父组件向下级组件传递数据:

需要先引入provide

import { provide, ref } from 'vue';

然后传递数据:

provide('play', "我喜欢打篮球")

完成!

然后是在下级组件接收上级组件传递的数据:

同样也是先引入 inject

import { inject, ref } from 'vue';

然后接收数据:

let play = inject("play")

我们看一下有没有:

在这里插入图片描述

哇。没问题,OK,结束了这小节,就这样用。

pinia

这个是集中式管理状态容器,类似于vuex。但是核心概念没有mutationmodules,使用方式参照官网,这里就不说了,之前博客提过这个小菠萝。

这是我之前写的博文,介绍小菠萝的: https://wjw1014.blog.csdn.net/article/details/126008933
这是小菠萝官网:https://pinia.vuejs.org/zh/

插槽

这玩意儿不想写了,尽管可以传值,但是和我想象的传值不是一个意思,有时间单独开一个插槽的博文吧。

好了今天先到这里吧!我要去玩元梦之星了。

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

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

相关文章

面试算法78:合并排序链表

题目 输入k个排序的链表&#xff0c;请将它们合并成一个排序的链表。 分析&#xff1a;利用最小堆选取值最小的节点 用k个指针分别指向这k个链表的头节点&#xff0c;每次从这k个节点中选取值最小的节点。然后将指向值最小的节点的指针向后移动一步&#xff0c;再比较k个指…

统信UOS及麒麟KYLINOS操作系统上设置GRUB密码

原文链接&#xff1a;给单用户模式上一层保险&#xff01;&#xff01;&#xff01; hello&#xff0c;大家好啊&#xff01;今天我要给大家介绍的是在统信UOS及麒麟KYLINOS操作系统上设置GRUB密码的方法。GRUB&#xff08;GRand Unified Bootloader&#xff09;是Linux系统中的…

利用F12和Fiddler抓包

网络基础 http 而http协议又分为下面的部分,点击具体条目后可以查看详细信息 http请求消息:请求行(请求方法),请求路径,请求头,请求体(载荷) http响应消息:响应行(响应状态码),响应头&#xff0c;响应体 请求行 即请求方法 get post put patch 响应行 即响应码,常见响应状态…

祖先是否安宁,直接关系到个人以及家运哦!

一直以来&#xff0c;中国古代流传下来的思想就认为&#xff0c;祖先安葬在好的风水福地&#xff0c;一定能给子孙后代带来吉祥如意。相反的&#xff0c;假如祖坟风水不好&#xff0c;则会影响到后人的运气&#xff0c;轻者诸事不顺、重者家庭破裂、噩运连连&#xff0c;所以&a…

【C++杂货铺】C++11新特性——lambda

文章目录 一、C98中的排序二、先来看看 lambda 表达式长什么样三、lambda表达式语法3.1 捕捉列表的使用细节 四、lambda 的底层原理五、结语 一、C98中的排序 在 C98 中&#xff0c;如果要对一个数据集合中的元素进行排序&#xff0c;可以使用 std::sort 方法&#xff0c;下面…

二叉树顺序结构与堆的概念及性质(c语言实现堆)

上次介绍了树&#xff0c;二叉树的基本概念结构及性质&#xff1a;二叉树数据结构&#xff1a;深入了解二叉树的概念、特性与结构 今天带来的是&#xff1a;二叉树顺序结构与堆的概念及性质&#xff0c;还会用c语言来实现堆 文章目录 1. 二叉树的顺序结构2.堆的概念和结构3.堆…

推荐几个开源HTTP服务接口快速生成工具

在现在流行微服务、前后端分离软件开发架构下&#xff0c;基于标准RESTful/JSON的HTTP接口已经成为主流。在实际业务中有很多需要快速开发调用数据服务接口的需求&#xff0c;但团队中缺乏专业的后端开发人员&#xff0c;比如&#xff1a; &#xff08;1&#xff09;数据库表已…

PHP开发日志 ━━ 基于PHP和JS的AES相互加密解密方法详解(CryptoJS) 适合CryptoJS4.0和PHP8.0

最近客户在做安全等保&#xff0c;需要后台登录密码采用加密方式&#xff0c;原来用个base64变形一下就算了&#xff0c;现在不行&#xff0c;一定要加密加key加盐~~ 前端使用Cypto-JS加密&#xff0c;传输给后端使用PHP解密&#xff0c;当然&#xff0c;前端虽然有key有盐&…

如何学习计算机编程?零基础入门,轻松成为编程达人!

在这个信息爆炸的时代&#xff0c;计算机编程已经成为一项炙手可热的技能。如果你也对编程充满兴趣&#xff0c;但又不知从何入手&#xff0c;那么本文将为你提供一条通往编程世界的捷径。掌握了这些技巧&#xff0c;相信你一定能够轻松成为编程达人&#xff01; 一、选择合适…

lag-llama源码解读(Lag-Llama: Towards Foundation Models for Time Series Forecasting)

Lag-Llama: Towards Foundation Models for Time Series Forecasting 文章内容&#xff1a; 时间序列预测任务&#xff0c;单变量预测单变量&#xff0c;基于Llama大模型&#xff0c;在zero-shot场景下模型表现优异。创新点&#xff0c;引入滞后特征作为协变量来进行预测。 获得…

爬虫工作量由小到大的思维转变---<第三十五章 Scrapy 的scrapyd+Gerapy 部署爬虫项目>

前言: 项目框架没有问题大家布好了的话,接着我们就开始部署scrapy项目(没搭好架子的话,看我上文爬虫工作量由小到大的思维转变---&#xff1c;第三十四章 Scrapy 的部署scrapydGerapy&#xff1e;-CSDN博客) 正文: 1.创建主机: 首先gerapy的架子,就相当于部署服务器上的;所以…

Ubuntu 18.04搭建RISCV和QEMU环境

前言 因为公司项目代码需要在RISCV环境下测试&#xff0c;因为没有硬件实体&#xff0c;所以在Ubuntu 18.04上搭建了riscv-gnu-toolchain QEMU模拟器环境。 安装riscv-gnu-toolchain riscv-gnu-toolchain可以从GitHub上下载源码编译&#xff0c;地址为&#xff1a;https://…

大华主动注册协议介绍

一、大华主动注册协议介绍 前面写了一篇文章&#xff0c;介绍一些设备通过大华主动注册协议接入到AS-V1000的文章&#xff0c;很多问我关于大华主动注册协议的相关知识。 由于大华主动注册协议是一种私有协议&#xff0c;通常不对外公开详细的协议规范和技术细节。因此…

C++ Primer Plus----第十二章--类和动态内存分布

本章内容包括&#xff1a;对类成员使用动态内存分配&#xff1b;隐式和显式复制构造函数&#xff1b;隐式和显式重载赋值运算符&#xff1b;在构造函数中使用new所必须完成的工作&#xff1b;使用静态类成员&#xff1b;将定位new运算符用于对象&#xff1b;使用指向对象的指针…

ssm基于web的志愿者管理系统的设计与实现+vue论文

摘 要 使用旧方法对志愿者管理系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在志愿者管理系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开发的志愿者…

main参数传递、反汇编、汇编混合编程

week03 一、main参数传递二、反汇编三、汇编混合编程 一、main参数传递 参考 http://www.cnblogs.com/rocedu/p/6766748.html#SECCLA 在Linux下完成“求命令行传入整数参数的和” 注意C中main: int main(int argc, char *argv[]), 字符串“12” 转为12&#xff0c;可以调用atoi…

两种汇编的实验

week04 一、汇编-1二、汇编-2 一、汇编-1 1 通过输入gcc -S -o main.s main.c -m32 将下面c程序”week0401学号.c“编译成汇编代码 int g(int x){ return x3; } int f(int x){ int i 学号后两位&#xff1b; return g(x)i; } int main(void){ return f(8)1; } 2. 删除汇编代码…

『番外篇六』SwiftUI 取得任意视图全局位置的三种方法

概览 在 SwiftUI 开发中,利用描述性代码我们可以很轻松的构建各种丰富多彩的视图。我们可以设置它们的大小、位置、颜色并应用不计其数的修改器。 但是,小伙伴们是否想过在 SwiftUI 中如何获取一个视图的全局位置坐标呢? 在本篇博文中,您将学到如下内容: 概览1. SwiftU…

守护 C 盘,Python 相关库设置

文章目录 前言Python 相关查看所有 Python 安装位置查看 Python 依赖位置查看 conda 配置查看 env 列表移除指定 env创建 env进入 env删除环境位置目录添加环境位置 (将位置置顶)查看 pip 缓存位置设置 pip 缓存位置 其他进入 Temp修改位置 Python技术资源分享1、Python所有方向…

(001)Unit 编译 UTF8JSON

文章目录 编译 Dll编译报错附录 编译 Dll 新建工程&#xff1a; 注意 UnityEngineDll 的选择&#xff01;2022 版本的太高了&#xff01;&#xff01;&#xff01; 下载包&#xff0c;导入unity : 3. 将 unf8json 的源码拷贝到新建的工程。 4. 编译发布版本&#xff1a; 编译…