Vue.js前端开发零基础教学(五)

目录

4.1 动态组件

4.1.1  定义动态组件

 4.1.2  利用KeepAlive组件实现组件缓存

4.1.3  组件缓存相关的生命周期函数

4.1.4  KeepAlive组件的常用属性 

 4.2 插槽

4.2.1  什么是插槽

​编辑 4.2.2  具名插槽

4.2.3  作用域插槽 

4.3 自定义指令 

4.3.1 什么是自定义指令

4.3.2  私有自定义指令的声明与使用

4.3.3 全局自定义指令的声明与使用 

4.3.4  为自定义指令绑定参数

​编辑 4.3.5  自定义指令的函数形式

4.4 引用静态资源


学习目标:

 掌握具名插槽的使用方法,能够通过name属性定义具名插槽

掌握私有自定义指令的使用方法,能够独立完成私有自定义指令的声明和使用

 掌握为自定义指令绑定参数的使用方法,能够通过等号(=)的方式,为当前   指令绑定参数

掌握自定义指令的函数形式,能够使用函数形式简化自定义指令的声明等等

4.1 动态组件

4.1.1  定义动态组件

利用动态组件可以动态切换页面中显示的组件。使用<component>标签可以定义动态组件,语法格式如下。

<component is="要渲染的组件"></component>

上述语法格式中,<component>标签必须配合is属性一起使用,is属性的属性值表示要渲染的组件,当该属性值发生变化时,页面中渲染的组件也会发生变化。

is属性的属性值可以是字符串或组件,当属性值为组件时,如果要实现组件的切换,需要调用shallowRef()函数定义响应式数据,将组件保存为响应式数据。shallowRef()函数只处理对象最外层属性的响应,它比ref()函数更适合于将组件保存为响应式数据。

代码如下:

创建Myleft.vue文件:

<template>Myleft组件<div>count的值:{{值}}<button @click="count+1">+1</button>
</div>
</template>
<script setup>import {onMounted,onUnmounted,onActivated,onDeactivated,ref} from 'vue'const count = ref(0);onMounted(()=>{console.log("Myleft组件被挂载成功")})onUnmounted(()=>{console.log("Myleft组件被销毁成功")})onActivated(()=>{console.log("MyRight组件被缓存了")})onDeactivated(()=>{console.log("MyRight组件被缓存了")})</script><style>
</style>

创建Myright.vue文件:

<template>Myright组件
</template><script>
</script><style>
</style>

创建DynamicComponet.vue文件:

<template><button @click="showComponent=Myleft">展示MyLeft组件</button><button @click="showComponent=Myright">展示MyRight组件</button><KeepAlive><div> <component :is="showComponent"></component></div></KeepAlive>
</template><script setup>import {shallowRef} from 'vue'import Myleft from'./Myleft.vue' import Myright from './Myright.vue'const showComponent = shallowRef(Myleft)
</script><style>
</style>

修改main.js文件:

import { createApp } from 'vue'
import App from './components/DynamicComponet.vue'
const app=createApp(App)
//import GlobalComponent from './components/GlobalComponent.vue'
// app.component("GlobalComponent", GlobalComponent)
app.mount('#app')

运行结果:

 4.1.2  利用KeepAlive组件实现组件缓存

概念:使用动态组件实现组件之间的按需切换时,隐藏的组件会被销毁,展示出来的组件会被重新创建。因此,当一个组件被销毁后又重新创建时,组件无法保持销毁前的状态。

如果在多个组件之间进行动态切换时想要保持这些组件的状态,以及避免重复渲染导致的性能问题,可以通过组件缓存来实现。

组件缓存可以使组件创建一次后,不会被销毁。在Vue中可以通过KeepAlive组件来实现组件缓存。 KeepAlive组件可通过<KeepAlive>标签来定义,定义时使用<KeepAlive>标签包裹需要被缓存的组件。运行结果:

 从单击“展示MyRight组件”按钮后的页面效果和控制台可以看出,控制台中没有输出“MyLeft组件被销毁了”的信息,说明此时MyLeft组件已经被缓存了。 再次单击“展示MyLeft组件”按钮,页面效果与步骤1中单击“+1”按钮后的页面效果相同,说明通过添加<KeepAlive>标签可以实现组件缓存。

4.1.3  组件缓存相关的生命周期函数

概念:在Vue开发中,有时需要在组件被激活或者被缓存时执行某些操作。为此,Vue提供了组件缓存相关的生命周期函数,可以监听组件被激活和组件被缓存的事件。

当组件被激活时,会触发组件的onActivated()生命周期函数;当组件被缓存时,会触发组件的onDeactivated()生命周期函数。这两个生命周期函数的语法格式如下。

// onActivated()生命周期函数
onActivated(() => { })
// onDeactivated()生命周期函数
onDeactivated(() => { })

MyLeft.vue文件新增代码: 

<script setup>
import { ref, onMounted, onUnmounted, onActivated, onDeactivated } from 'vue'
onActivated(() => {console.log('MyLeft组件被激活了')
})
onDeactivated(() => {console.log('MyLeft组件被缓存了')
})
</script>

MyRight.vue文件新增代码:

<script setup>
import { onActivated, onDeactivated } from 'vue'
onActivated(() => {console.log('MyRight组件被激活了')
})
onDeactivated(() => {console.log('MyRight组件被缓存了')
})
</script>

运行结果:

单击“展示MyRight组件”按钮后的页面效果和控制台如下图所示。

 单击“展示MyLeft组件”按钮后的页面效果和控制台如下图所示。

4.1.4  KeepAlive组件的常用属性 

概念:在默认情况下,所有被<KeepAlive>标签包裹的组件都会被缓存。如果想要实现特定组件被缓存或者特定组件不被缓存的效果,可以通过KeepAlive组件的常用属性include、exclude属性来实现。

                                     KeepAlive组件的常用属性如下表所示。

在<KeepAlive>标签中使用include属性和exclude属性时,多个组件名之间使用英文逗号分隔,以include属性为例,语法格式如下。 

<KeepAlive include="组件名1, 组件名2">被缓存的组件
</KeepAlive>

 4.2 插槽

4.2.1  什么是插槽

概念:Vue为组件的封装者提供了插槽(slot),插槽是指开发者在封装组件时不确定的、希望由组件的使用者指定的部分。也就是说,插槽是组件封装期间为组件的使用者预留的占位符,允许组件的使用者在组件内展示特定的内容。通过插槽,可以使组件更灵活、更具有可复用性。

插槽需要定义后才能使用,下面对定义插槽和使用插槽分别进行讲解。

1. 定义插槽

在封装组件时,可以通过<slot>标签定义插槽,从而在组件中预留占位符。假设项目中有一个MyButton组件,在MyButton组件中定义插槽的示例代码如下。

<template><button><slot></slot></button>
</template>

在<slot>标签内可以添加一些内容作为插槽的默认内容。如果组件的使用者没有为插槽提供任何内容,则默认内容生效;如果组件的使用者为插槽提供了插槽内容,则该插槽内容会取代默认内容。 另外,如果一个组件没有预留任何插槽,则组件的使用者提供的任何插槽内容都会不起作用。

2. 使用插槽

概念:使用插槽即在父组件中使用子组件的插槽,在使用时需要将子组件写成双标签的形式,在双标签内提供插槽内容。例如,使用MyButton组件的插槽的示例代码如下。

因为插槽内容是在父组件模板中定义的,所以在插槽内容中可以访问到父组件的数据。插槽内容可以是任意合法的模板内容,不局限于文本。例如,可以使用多个元素或者组件作为插槽内容,示例代码如下。

<MyButton><span style="color: yellow;">按钮</span><MyLeft />
</MyButton>

创建src\components\SlotSubComponent.vue文件,用于展示子组件的相关内容。

<template><div>测试插槽的组件</div><slot></slot>
</template>

创建src\components\MySlot.vue文件,用于展示插槽的相关内容。

<template>父组件-----{{ message }}<hr><SlotSubComponent><p>{{ message }}</p></SlotSubComponent>
</template>
<script setup>
import SlotSubComponent from './SlotSubComponent.vue'
const message = '这是组件的使用者自定义的内容'
</script>

修改src\main.js文件,切换页面中显示的组件。

import App from './components/MySlot.vue'

运行结果:

 演示插槽的默认内容

 演示插槽的默认内容,实现当组件的使用者没有自定义内容时默认内容生效的效果。 注释MySlot组件中插槽内容。

<!-- <p>{{ message }}</p> -->

在SlotSubComponent组件中为<slot>标签提供默认内容。

<slot><p>这是默认内容</p>
</slot>

运行结果:

将MySlot组件中的插槽内容取消注释,保存上述代码后,页面效果如下图所示。

 4.2.2  具名插槽

概念:在Vue中当需要定义多个插槽时,可以通过具名插槽来区分不同的插槽。具名插槽是给每一个插槽定义一个名称,这样就可以在对应名称的插槽中提供对应的数据了

插槽通过<slot>标签来定义,<slot>标签有一个name属性,用于给各个插槽分配唯一的名称,以确定每一处要渲染的内容。添加name属性的<slot>标签可用来定义具名插槽。 定义具名插槽的语法格式如下。

<slot name="插槽名称"></slot>

在父组件中,如果要把内容填充到指定名称的插槽中,可以通过一个包含v-slot指令的<template>标签来实现,语法格式如下。

<组件名><template v-slot:插槽名称></template>
</组件名>

与v-on和v-bind类似,v-slot也有简写形式,即把v-slot:替换为#。例如,v-slot:title可以简写为#title。

演示具名插槽的使用

创建src\components\ArticleInfo.vue文件,用于展示文章内容模板。

<template><div class="article-container"><div class="header-box"><slot name="header"></slot></div><div class="content-box"><slot name="content"></slot></div><div class="footer-box"><slot name="footer"></slot></div></div>
</template>
<style>
.article-container > div { border: 1px solid black; }
</style>

创建src\components\MyArticle.vue文件,用于提供文章数据,在MyArticle组件中导入并使用ArticleInfo组件,并在<ArticleInfo>标签中为不同插槽添加不同的信息。

<template><ArticleInfo><template v-slot:header><p>这是文章的头部区域</p></template><template v-slot:content><p>这是文章的内容区域</p></template><template #footer><p>这是文章的尾部区域</p></template></ArticleInfo>
</template>
<script setup>import ArticleInfo from './ArticleInfo.vue' </script>

修改src\main.js文件,切换页面中显示的组件。

import App from './components/MyArticle.vue'

运行结果:

4.2.3  作用域插槽 

概念:一般情况下,在父组件中不能使用子组件中定义的数据。如果想要在父组件中使用子组件中定义的数据,则需要通过作用域插槽来实现。作用域插槽是带有数据的插槽,子组件提供一部分数据给插槽,父组件接收子组件的数据进行页面渲染。

作用域插槽的使用分为定义数据和接收数据两个部分。

1. 定义数据

在封装组件的过程中,可以为预留的插槽定义数据,供父组件接收并使用子组件中的数据。在作用域插槽中,可以将数据以类似传递props属性的形式添加到<slot>标签上。 例如,在封装MyHeader组件时,在插槽中定义数据供父组件使用,示例代码如下。

<slot message="Hello Vue.js"></slot>

2. 接收数据

使用默认插槽和具名插槽接收数据的方式不同,接下来分别进行讲解。

下面讲解默认插槽:

在Vue中,每个插槽都有name属性,表示插槽的名称。在定义插槽时虽然省略了<slot>标签的name属性,但是name属性默认为default,这样的插槽属于默认插槽。

在父组件中可以通过v-slot指令接收插槽中定义的数据,即接收作用域插槽对外提供的数据。通过v-slot指令接收到的数据可以在插槽内通过Mustache语法进行访问。 例如,在父组件中使用MyHeader组件中的插槽时,通过v-slot指令的值接收传递的数据的示例代码如下。

作用域插槽对外提供的数据对象可以使用解构赋值以简化数据的接收过程,示例代码如下。

 下面讲解具名插槽: 在Vue中,通过<slot>标签添加name属性来定义具名插槽,在具名插槽中也可以向父组件中传递数据。 例如,在封装MyHeader组件时,向具名插槽中传入数据的语法格式如下。

<slot name="header" message="hello"></slot>

具名插槽和作用域插槽可以作用在同一个<slot>标签上且并不冲突。<slot>标签的name属性不会作为数据传递给插槽,所以最终传递给组件的数据只有message属性。

在使用具名插槽时,插槽属性可以作为v-slot的值被访问到,基本语法格式为“v-slot:插槽名称="形参"”,简写形式为“#插槽名称="形参"”,使用简写形式使用插槽的示例代码如下。

<MyHeader><template #header="{ message }">{{ message }}</template>
</MyHeader>

如果在一个组件中同时定义了默认插槽和具名插槽,并且它们均需要为父组件提供数据,这时就需要为默认插槽使用显式的<template>标签来接收数据,示例代码如下。

<MyHeader><template #default="{ message }">{{ message }}</template>
</MyHeader>

演示作用域插槽的使用

创建src\components\SubScopeSlot.vue文件,用于展示作用域插槽。

<template><slot message="Hello 默认插槽"></slot><hr><slot message="Hello Vue.js" name="header"></slot><hr><slot :user="user" name="content"></slot>
</template>
<script setup>
import { reactive } from 'vue'
const user = reactive({ name: 'xiaoyuan', age: '15' })	    
</script>

创建src\components\ScopeSlot.vue文件,用于为作用域插槽提供数据。

<template><SubScopeSlot><template v-slot:default="scope"><p>{{ scope }}</p></template><template v-slot:header="scope"><p>{{ scope }}</p><p>{{ scope.message }}</p></template><template #content="{ user }"><p>{{ user.name }}</p><p>{{ user.age }}</p></template></SubScopeSlot>
</template>
<script setup>import SubScopeSlot from './SubScopeSlot.vue'</script>

修改src\main.js文件,切换页面中显示的组件。

import App from './components/ScopeSlot.vue'

运行结果:

4.3 自定义指令 

4.3.1 什么是自定义指令

当内置指令不能满足开发需求时,可以通过自定义指令来拓展额外的功能。自定义指令的主要作用是方便开发者通过直接操作DOM元素来实现业务逻辑。

Vue中的自定义指令分为两类,分别是私有自定义指令和全局自定义指令 私有自定义指令是指在组件内部定义的指令。私有自定义指令可以在定义该指令的组件内部使用。例如,在组件A中自定义了指令,只能在组件A中使用,组件B、组件C中不能使用。 全局自定义指令是指在全局定义的指令。全局自定义指令可以在全局使用,例如,在src\main.js文件中定义了全局自定义指令,这个指令可以用于任何一个组件。

一个自定义指令由一个包含自定义指令生命周期函数的参数来定义。常用的自定义指令生命周期函数如下表所示。

常用的自定义指令生命周期函数的参数如下表所示。

binding中包含以下6个常用属性。

value:传递给指令的值。

arg:传递给指令的参数。

oldValue:之前的值,仅在beforeUpdate()函数和updated()函数中可用,无论值是否更改都可用。 modifiers:一个包含修饰符的对象 (如果有)。例如,在v-my-directive.foo.bar 中,修饰符对象是{ foo: true, bar: true }。

instance:使用该指令的组件实例。 dir:指令的定义对象。 

4.3.2  私有自定义指令的声明与使用

如果没有使用setup语法糖,可以在directives属性中声明私有自定义指令。例如,声明一个私有自定义指令color,示例代码如下。

export default {directives: {color: {}}
}

在上述代码中,color为自定义指令的名称,指令名称可以自定义。名称为color的指令指向一个配置对象,对象中可以包含自定义指令的生命周期函数,可通过这些函数来操作DOM元素。

在使用自定义指令时,需要以“v-”开头,示例代码如下。

<h1 v-color>标题</h1>

如果使用setup语法糖,任何以“v”开头的驼峰式命名的变量都可以被用作一个自定义指令,示例代码如下。

<template><span v-color></span>
</template>
<script setup>
const vColor = { }
</script>

驼峰式命名:驼峰式命名规则是一种在编程中广泛使用的命名约定。它有两种主要形式:

小驼峰式命名法:这种命名方式中,第一个单词的首字母小写,从第二个单词开始,每个单词的首字母都大写。例如,“firstName”和“lastName”。

大驼峰式命名法:在这种命名法中,每个单词的首字母都大写,而第一个单词的首字母小写。例如,“FirstName”、“LastName”和“CamelCase”。大驼峰式也被称为Pascal命名法,这种命名法常用于类名和常量名。

演示私有自定义指令的使用方法

创建src\components\DirectiveComponent.vue文件。

<template><p v-fontSize>DirectiveComponent组件</p>
</template>
<script setup>
const vFontSize = {}
</script>

修改src\main.js文件,切换页面中显示的组件。

import App from './components/DirectiveComponent.vue'

修改DirectiveComponent组件,添加mounted()函数,实现元素挂载完成后文本字号的改变。

const vFontSize = {mounted: el => {el.style.fontSize = '24px'}
}

 运行结果:

4.3.3 全局自定义指令的声明与使用 

全局自定义指令需要通过Vue应用实例的directive()方法进行声明,语法格式如下。

directive('自定义指令名称', 对象)

在上述语法格式中,directive()方法的第1个参数类型为字符串,表示全局自定义指令的名称;第2个参数类型为对象或者函数,可以是对象或者函数形式,用于接收指令的参数值。

下面演示全局自定义指令的使用方式。 修改src\main.js文件,声明全局自定义指令fontSize。

import { createApp } from 'vue'
import './style.css'
import App from './components/DirectiveComponent.vue'
const app = createApp(App)
app.directive('fontSize', {mounted: el => {el.style.fontSize = '24px'}
})
app.mount('#app')

4.3.4  为自定义指令绑定参数

在使用自定义指令时,开发人员可以通过自定义指令的参数改变元素的状态,传递的参数由自定义指令的生命周期函数的第2个参数接收。 在标签中使用自定义指令时,通过等号(=)的方式可以为当前指令绑定参数,示例代码如下。

<h1 v-color="color"></h1>

如果指令需要多个值,可以传递一个对象,示例代码如下。

<div v-demo="{ color: 'red', text: 'hello' }"></div>

演示自定义指令参数的使用方法

创建src\components\CustomDirective.vue文件。

<template><p v-fontSize="fontSize">DirectiveComponent组件</p><button @click=“fontSize = ‘24px’”>更改字号大小</button>
</template>
<script setup>
import { ref } from 'vue'
const fontSize = ref('12px')
const vFontSize = {mounted: (el, binding) => { el.style.fontSize = binding.value },
}
</script>

修改src\main.js文件,切换页面中显示的组件。

运行结果:

演示自定义指令参数的使用方法

在自定义指令fontSize中添加updated()函数,实现自定义指令绑定的参数改变时,页面进行同步更改。

const vFontSize = {// 原有代码……updated: (el, binding) => {el.style.fontSize = binding.value}
}

运行结果:

4.3.4  为自定义指令绑定参数

在使用自定义指令时,开发人员可以通过自定义指令的参数改变元素的状态,传递的参数由自定义指令的生命周期函数的第2个参数接收。
在标签中使用自定义指令时,通过等号(=)的方式可以为当前指令绑定参数,示例代码如下。
<h1 v-color="color"></h1>

如果指令需要多个值,可以传递一个对象,示例代码如下。

<div v-demo="{ color: 'red', text: 'hello' }"></div>

演示自定义指令参数的使用方法

创建src\components\CustomDirective.vue文件。

<template><p v-fontSize="fontSize">DirectiveComponent组件</p><button @click=“fontSize = ‘24px’”>更改字号大小</button>
</template>
<script setup>
import { ref } from 'vue'
const fontSize = ref('12px')
const vFontSize = {mounted: (el, binding) => { el.style.fontSize = binding.value },
}
</script>

修改src\main.js文件,切换页面中显示的组件。

import App from './components/CustomDirective.vue'

运行效果:

演示自定义指令参数的使用方法

在自定义指令fontSize中添加updated()函数,实现自定义指令绑定的参数改变时,页面进行同步更改。

const vFontSize = {// 原有代码……updated: (el, binding) => {el.style.fontSize = binding.value}
}

 运行结果:

单击“更改字号大小”按钮后的页面效果如下图所示。

 4.3.5  自定义指令的函数形式

对于自定义指令来说,通常仅需要在mounted()函数和updated()函数中操作DOM元素,除此之外,不需要其他的生命周期函数。

例如,4.3.4小节CustomDirective 组件中的mounted()函数和updated()函数中的代码完全相同。此时,可以将自定义指令简写为函数形式。 将私有自定义指令简写为函数形式的示例代码如下。

const vFontSize = (el, binding) => {el.style.fontSize = binding.value
}

将全局自定义指令简写成函数形式的示例代码如下。

app.directive('fontSize', (el, binding) => {el.style.fontSize = binding.value
})

4.4 引用静态资源

1. 引用public目录中的静态资源

public目录用于存放不可编译的静态资源文件,该目录下的文件会被复制到打包目录,该目录下的文件需要使用绝对路径访问。 例如,在组件中引用public目录中的demo.png文件,示例代码如下。

<img src="/demo.png" >

演示引用public目录中静态资源的方法

创建src\components\Image.vue文件。

<template><img src="/vite.svg" >
</template>

修改src\main.js文件,切换页面中显示的组件,示例代码如下。

import App from './components/Image.vue'

运行效果:

2. 引用src\assets目录中的静态资源 

src\assets目录用于存放可编译的静态资源文件,例如图片、样式文件等。该目录下的文件需要使用相对路径访问。

在引用src\assets目录中的图片时,首先将图片保存到本地,然后使用import语法将图片导入需要的组件,最后通过img元素的src属性添加图片的路径。

演示引用src\assets中静态资源的方法

创建src\components\Icon.vue文件。

<template><img :src="icon">
</template>
<script setup>
import icon from '../assets/vue.svg'
</script>

修改src\main.js文件,切换页面中显示的组件,示例代码如下。

import App from './components/Icon.vue'

运行效果:

今天就分享到此,感谢预览~ 

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

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

相关文章

使用美化方法设计嵌入的子窗体(三)

使用美化方法设计嵌入的子窗体 分析效果图的实现 效果图&#xff1a; 新建 Windows 窗体 新窗体命名&#xff1a;FrmAddProduct.cs修改窗体的 Text 属性&#xff1a;新增商品修改窗体的位置&#xff1a;StartPosition&#xff1a;CenterScreen窗体的无边框设计&#xff1a…

MySQL 8.0.19安装教程(windows 64位)

在c盘目录下的Program Files目录下创建MySQL目录&#xff0c;将下载好的mysql解压到里面 解压完是这个样子 配置初始化的my.ini文件的文件 [mysqld] # 设置3306端口 port3306 # 设置mysql的安装目录 basedirC:\Program Files\MySQL # 设置mysql数据库的数据的存放目录 datad…

Pytorch DistributedDataParallel(DDP)教程一:快速入门理论篇

Pytorch DistributedDataParallel&#xff08;DDP&#xff09;教程一&#xff1a;快速入门理论篇 目录 一、 写在前面二、什么是分布式并行训练1. 并行训练2. 数据并行 三、DDP的基本原理1. DDP的训练过程2. Ring-All-Reduce算法 四、如何搭建一个Pytorch DDP代码框架1. 与DDP有…

Shortened LLaMA:针对大语言模型的简单深度剪枝法

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 论文标题 & 发表会议&#xff1a;Shortened LLaMA: A Simple Depth Pruning for Large Language Models&#xff08;ICLR 2024 Workshop&#xff09; 论文地址&#xff1a;https://arxiv.org/abs/…

docker拉取镜像速度慢

解决办法是配置阿里云镜像加速 在docker desktop的docker engine里添加 "registry-mirrors": ["https://owzy8hoh.mirror.aliyuncs.com"] 修改以后重启docker 参考&#xff1a; 【docker】Windows10系统下安装并配置阿里云镜像加速_docker desktop 配置…

基于unity+c#的随机点名系统(简单UI界面+列表+数组)

目录 一、功能界面显示 二、UI 1、视频的使用 &#xff08;1&#xff09;渲染纹理 &#xff08;2&#xff09; 视频铺全屏 &#xff08;3&#xff09;视频的调用 2、 下拉文本框的使用&#xff08;旧版&#xff09; 3、输入文本框的使用&#xff08;旧版&#xff09; …

janus部署

配置和运行janus 1. 配置nginx 安装nginx&#xff0c;主要用来提供web访问。 生成证书 mkdir -p ~/cert cd ~/cert # CA私钥 openssl genrsa -out key.pem 2048 # 自签名证书 openssl req -new -x509 -key key.pem -out cert.pem -days 1095安装nginx #下载nginx 1.15.8版…

Unity AR开发环境搭建

在上一篇文章中&#xff0c;我定义了各种类型的扩展现实 (XR)。 在其中&#xff0c;我将增强现实 (AR) 定义为&#xff1a;增强现实 (AR) 将数字对象置于物理世界中。 通常&#xff0c;该设备将配备某种类型的相机&#xff08;例如智能手机&#xff09;&#xff0c;可以实时提供…

Spring Task 定时任务调度

一、概念 Spring Task 是 Spring 框架的一个组件&#xff0c;它为任务调度提供了支持&#xff0c;使得开发者能够创建后台任务或定期执行的任务。通过 Spring Task&#xff0c;您可以方便地在 Java 应用程序中实现定时任务&#xff0c;比如每天凌晨进行数据同步、每小时执行一…

jeecg-boot安装

我看大家都挺关注&#xff0c;所以集中上传了下代码和相关工具&#xff0c;方便大家快速完成 链接&#xff1a;https://pan.baidu.com/s/1-Y9yHVZ-4DQFDjPBWUk4-A 提取码&#xff1a;op1r 1. 下载代码 下载地址 : JEECG官方网站 - 基于BPM的低代码开发平台(低代码平台_零代…

C# 窗体应用程序 Chart控件显示实时曲线

IDE: VS2019 项目模板&#xff1a;C# windows 窗体应用(.NET Framework) 【参考】 B站上教程C#Chart控件画折线图的使用&#xff0c;关于Chart控件的属性&#xff0c;介绍得非常详细。B站上教程C#上位机Chart控件实时曲线终极讲解&#xff0c;对鼠标滚轮事件等&#xff0c;多个…

冯诺依曼结构理解

冯诺依曼结构 存储器&#xff1a;内存 数据是要在计算机的体系结构中进行流动的&#xff0c;在流动过程中对数据加工处理 从一个设备到另一个设备&#xff0c;本质是一种拷贝 CPU的计算速度是很快的&#xff0c;所以数据设备间的拷贝效率&#xff0c;决定了计算机整体的基本效率…

常见Spring相关工具报错-源码分析

常见Spring相关工具报错-源码分析 1. Resouce Bundle 国际化 yml 配置不生效 1. Resouce Bundle 国际化 yml 配置不生效 1️⃣ 配置yml 2️⃣ 报错信息 2024-04-15 15:13:57.828 [http-nio-8090-exec-1] WARN o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - [doResolveHan…

Spring Boot | SpringBoot对 “SpringMVC“的 “整合支持“、SpringMVC“功能拓展实现“

目录: SpringMVC 的 “整合支持” ( 引入"Web依赖启动器"&#xff0c;几乎可以在无任何额外的配置的情况下进行"Web开发")1.SpringMVC "自动配置" 介绍 ( 引入Web依赖启动器"后&#xff0c;SpringBoot会自动进行一些“自动配置”&#xff0…

51单片机-LED模块

文章目录 1.点亮一个LED灯2.LED闪烁3.LED流水灯 1.点亮一个LED灯 #include <REGX52.H> void main() {P20xFE; //1111 1110while(1){} }2.LED闪烁 增加延时&#xff0c;控制LED的亮灭间隙 延时函数的添加依靠STC-ISP软件的延时函数功能代码自动生成&#xff0c;如图 #i…

童话里都是骗人的,靠可视化大屏升职加薪,除非老板脑子秀逗了。

可视化大屏有没有价值&#xff0c;肯定是有的&#xff0c;靠着可视化大屏升职加薪靠谱吗&#xff1f;不靠谱。 童话故事中的情节和元素往往是夸张和不现实的&#xff0c;不能完全应用于现实生活中。在现实世界中&#xff0c;升职加薪通常需要通过实际的工作表现、专业技能的提…

数据库练习(一)

完成以下SQL语句的编写&#xff1a; student表: score 表&#xff1a; 查询student表的所有记录 Select * from student; 查询student表的第2条到4条记录 select * from student LIMIT 1,3; 从student表查询所有学生的学号&#xff08;id&#xff09;、姓名&#xff08;n…

Java虚拟机——内存的分配详解

内存区域划分 对于大多数的程序员来说&#xff0c;Java 内存比较流行的说法便是堆和栈&#xff0c;这其实是非常粗略的一种划分&#xff0c;这种划分的“堆”对应内存模型的 Java 堆&#xff0c;“栈”是指虚拟机栈&#xff0c;然而 Java 内存模型远比这更复杂&#xff0c;想深…

【计算机毕业设计】游戏售卖网站——后附源码

&#x1f389;**欢迎来到琛哥的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 琛哥&#xff0c;一名来自世界500强的资深程序猿&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 琛哥在深度学习任务中展现出卓越的能力&a…

数据结构和算法(哈希表和图(A*算法精讲))

一 、哈希表 1.1 哈希表原理精讲 哈希表-散列表&#xff0c;它是基于快速存取的角度设计的&#xff0c;也是一种典型的“空间换时间”的做法 键(key)&#xff1a; 组员的编号如&#xff0c;1、5、19。。。 值(value)&#xff1a; 组员的其它信息&#xff08;包含性别、年龄和…