认识Vue3
目录
1. Vue3的优势
2. Vue2 选项式 API vs Vue3 组合式API
使用create-vue搭建Vue3项目
1. 认识create-vue
2. 使用create-vue创建Vue3项目
熟悉Vue3项目目录和关键文件
组合式API - setup选项
1. setup选项的写法和执行时机
2. setup中写代码的特点
组合式API - reactive函数和ref函数
1. reactive
2. ref
3. reactive 对比 ref
组合式API - computed
组合式API - watch
1. 侦听单个数据
2. 侦听多个数据
3. immediate
4. deep
5. 精确侦听对象的某个属性
组合式API中的生命周期函数写法
1. 选项式对比组合式
2. 生命周期函数基本使用
组合式API - 父子通信
1. 父传子
2. 子传父
组合式API - 模版引用
1. 基本使用
2. defineExpose
组合式API - provide和inject
1. 作用和场景
2. 跨层传递普通数据
3. 跨层传递响应式数据
4. 跨层传递方法
Vue3.3 新特性-defineOptions
Vue3.3新特性-defineModel
1. Vue3的优势
2. Vue2 选项式 API vs Vue3 组合式API
选项式API就是在整个配置项中有着一个一个的选项,如下图:data是一个选项、methods是一个选项、computed是一个项目、watch是一个选项。
同功能的数据声明、方法、计算属性都是散落在各个位置的。
在VUE3 组合式API中,提供数据不用在data配置项中提供,而是可以调用方法的时候再提供,它将同功能的数据声明、方法的提供、计算属性全部放到了一起:
而且,因为所有的功能都集中管理,所以到另一个页面中,如果要复用的话,可以把同功能的一整块代码封装成一个函数,在函数中声明数据,在函数中声明方法、在函数中声明计算属性等等。
将来哪个页面要用,在页面中一调函数就可以将这段内容生成
使用create-vue搭建Vue3项目
1. 认识create-vue
create-vue是Vue官方新的脚手架工具,底层切换到了 vite (下一代前端工具链),为开发提供极速响应;vue-cli是创建Vue2项目的脚手架工具。
2. 使用create-vue创建Vue3项目
前置条件 - 已安装16.0或更高版本的Node.js
执行如下命令,这一指令将会安装并执行 create-vue
npm init vue@latest
熟悉Vue3项目目录和关键文件
vite.config.js
可以放一些和vite相关的配置内容
import { fileURLToPath, URL } from 'node:url'import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'// https://vitejs.dev/config/
export default defineConfig({plugins: [vue({script: {defineModel: true}}),],resolve: {alias: {'@': fileURLToPath(new URL('./src', import.meta.url))}}
})
vue3的main.js
//Vue3的main.js中,通过createApp函数去创建vue实例
//包括创建路由实例、仓库实例,都是用createRouter() createStore()函数
// 将创建实例进行了封装,保证每个实例的独立封闭性import { createApp } from 'vue'
import App from './App.vue'// mount 设置挂载点 #app (id为app的盒子)(往id为app的盒子上去挂载)
createApp(App).mount('#app')
组合式API - setup选项
1. setup选项的写法和执行时机
写法
<script>export default {//setup写成一个函数,将来里面就可以编写一些组合式API,在里面调各种函数setup(){},beforeCreate(){}}
</script>
执行时机
在beforeCreate生命周期钩子之前执行
2. setup中写代码的特点
在setup函数中写的数据和方法需要在末尾以对象的方式return,就可以在模版中使用
1. setup函数的执行时机,比beforeCreate生命周期函数还要早
2. 在setup函数中,获取不到this (this是undefined)
3. 在setup函数中提供的数据 和 函数,需要在 setup函数 最后 return,才能模板<template></template>中应用!!!!!!
<script>
export default {setup () {// 数据const message = 'hello Vue3'// 函数const logMessage = () => {console.log(message)}return {message,logMessage}},beforeCreate () {console.log('beforeCreate函数')}
}
</script><template><div>{{ message }}</div><button @click="logMessage">按钮</button>
</template>
问题:每次都要return,好麻烦?
可以通过 setup 语法糖简化代码
在script标签上添加 setup标记后,setup函数不用写了,而且也不需要再写导出语句,默认会添加导出语句
<script setup>
const message = 'this is a message'
const logMessage = () => {console.log(message)
}
</script><template><div>{{ message }}</div><button @click="logMessage">按钮</button>
</template>
组合式API - reactive函数和ref函数
1. reactive
作用:接受 一个对象类型的数据,并返回一个响应式的对象
核心步骤:
1.从vue包中导入reactive函数
2.在<script setup>中调用reactive函数,并传入对象类型的初始值,并使用变量来接收返回值
<script setup>
import { reactive } from 'vue'
const state = reactive({count: 100
})
const setCount = () => {state.count++
}
</script><template><button @click="setCount">{{state.count}}</button>
</template>
2. ref
接收简单类型或者对象类型的数据,并返回一个响应式的对象
本质:是在原有传入数据的基础上,外层包了一层对象,包成了复杂类型,底层包成复杂类型之后,再借助 reactive 实现的响应式
注意点:
1. 因为在原有数据的基础上包了一层对象,所以脚本中访问数据,需要通过 .value访问
2. 在template中,.value不需要加 (帮我们扒了一层)
3.推荐:以后声明数据,统一用 ref => 统一了编码规范
核心步骤:
1.从vue包中导入reactive函数
2.在<script setup>中调用ref函数,并传入初始值,并使用变量来接收ref函数返回的响应式的对象
<script setup>
import { ref } from 'vue'
const count = ref(0)
const setCount = () => {count.value++
}
</script><template><div><div>{{ count }}</div><button @click="setCount">+1</button></div>
</template>
3. reactive 对比 ref
-
都是用来生成响应式数据
-
不同点
-
reactive不能处理简单类型的数据
-
ref参数类型支持更好,但是必须通过.value访问
-
ref函数内部的实现依赖于reactive函数
-
-
在实际工作中的推荐
-
推荐使用ref函数,减少记忆负担,小兔鲜项目都使用ref
-
组合式API - computed
计算属性基本思想和Vue2保持一致,组合式API下的计算属性只是修改了写法
核心步骤:
1.从vue包中,导入computed函数
2.调用computed函数,里面传入一个箭头函数,在箭头函数中 返回基于响应式数据 计算出来的新值
-
const 计算属性 = computed(() => {return 计算返回的结果 })
案例:
<script setup>
// const 计算属性 = computed(() => {
// return 计算返回的结果
// })import { computed, ref } from 'vue'// 声明数据
const list = ref([1, 2, 3, 4, 5, 6, 7, 8])// 基于list派生一个计算属性,从list中过滤出 > 2
const computedList = computed(() => {return list.value.filter(item => item > 2)
})// 定义一个修改数组的方法
const addFn = () => {list.value.push(666)
}
</script><template><div><div>原始数据: {{ list }}</div><div>计算后的数据: {{ computedList }}</div><button @click="addFn" type="button">修改</button></div>
</template>
组合式API - watch
侦听一个或者多个数据的变化,当数据变化时执行回调函数。
俩个额外参数 immediate控制立刻执行,deep开启深度侦听。
1. 侦听单个数据
步骤:
1.从vue包中导入watch函数
2.调用watch函数,传入要侦听的响应式数据和回调函数
-
watch(ref对象, (newValue, oldValue) => { ... })
newValue是变化后的响应式数据
-
oldValue是变化前的响应式数据
案例:
<script setup>
import { ref, watch } from 'vue'
const count = ref(0)
const nickname = ref('张三')const changeCount = () => {count.value++
}
const changeNickname = () => {nickname.value = '李四'
}// 1. 监视单个数据的变化
// watch(ref对象, (newValue, oldValue) => { ... })
watch(count, (newValue, oldValue) => {console.log(newValue, oldValue)
})
</script><template><div>{{ count }}</div><button @click="changeCount">改数字</button><div>{{ nickname }}</div><button @click="changeNickname">改昵称</button>
</template>
2. 侦听多个数据
同时侦听多个响应式数据的变化,就是第一个参数改写成数组的写法,无论哪个数据变了,都会触发回调函数
语法:
watch([ref对象1, ref对象2], (newArr, oldArr) => { ... })
- newArr是变化后的多个响应式数据组成的数组
- oldArr是变化前的多个响应式数据组成的数组
<script setup>
import { ref, watch } from 'vue'
const count = ref(0)
const nickname = ref('张三')const changeCount = () => {count.value++
}
const changeNickname = () => {nickname.value = '李四'
}// 2. 监视多个数据的变化
// watch([ref对象1, ref对象2], (newArr, oldArr) => { ... })
watch([count, nickname], (newArr, oldArr) => {console.log(newArr, oldArr)
})
</script><template><div>{{ count }}</div><button @click="changeCount">改数字</button><div>{{ nickname }}</div><button @click="changeNickname">改昵称</button>
</template>
3. immediate
一进页面,在侦听器创建时立即触发回调函数,响应式数据变化之后继续执行回调
语法:在watch函数的第三个形参位置传一个对象进去,然后对象中添加immediate属性。
// 3. immediate 立刻执行
watch(count, (newValue, oldValue) => {console.log(newValue, oldValue)
}, {immediate: true
})
4. deep
deep进行深度监视, 默认 watch 进行的是 浅层监视
const ref1 = ref(简单类型) 可以直接监视
const ref2 = ref(复杂类型) 监视不到复杂类型内部数据的变化,监视复杂类型时,监视的是其地址值
<script setup>
import { ref, watch } from 'vue'const userInfo = ref({name: 'zs',age: 18
})
const setUserInfo = () => {// 修改了 userInfo.value 修改了对象的地址,才能监视到// userInfo.value = { name: 'ls', age: 50 }userInfo.value.age++
}// deep 深度监视
watch(userInfo, (newValue) => {console.log(newValue)
}, {deep: true
})
</script><template><div>{{ userInfo }}</div><button @click="setUserInfo">修改userInfo</button>
</template>
5. 精确侦听对象的某个属性
在不开启deep的前提下,侦听age的变化,只有age变化时才会执行回调函数
<script setup>
import { ref, watch } from 'vue'const userInfo = ref({name: 'zs',age: 18
})
const setUserInfo = () => {userInfo.value.age++
}// 5. 对于对象中的单个属性,进行监视
watch(() => userInfo.value.age, (newValue, oldValue) => {console.log(newValue, oldValue)
})
</script><template><div>{{ userInfo }}</div><button @click="setUserInfo">修改userInfo</button>
</template>
组合式API中的生命周期函数写法
1. 选项式对比组合式
2. 生命周期函数基本使用
从vue包中,导入生命周期函数
调用生命周期函数,传入回调函数
注意:生命周期函数可以调用多次,其会按照顺序依次执行
<script setup>
import { onMounted } from 'vue';// beforeCreate 和 created 函数中的相关代码一律放在 setup 中执行
const getList = () => {setTimeout(() => {console.log('发送请求,获取数据')}, 2000)
}
// 一进入页面,就直接调用getList函数发送请求
getList()// 如果有些代码需要在mounted生命周期函数中执行
onMounted(() => {console.log('mounted生命周期函数 - 逻辑1')
})// 写成函数的调用方式,可以调用多次,并不会冲突,而是按照顺序依次执行
onMounted(() => {console.log('mounted生命周期函数 - 逻辑2')
})</script><template><div></div>
</template>
组合式API - 父子通信
1. 父传子
基本思想
父组件中给子组件标签添加属性
子组件内部通过props选项接收数据
2. 子传父
基本思想
父组件中给子组件标签通过@绑定一个自定义事件
子组件内部通过 emit 方法触发自定义事件,传递数据
App.vue
<script setup>
//在vue3中,组件的局部注册,只要导入进来就可以使用
import SonCom from '@/components/son-com.vue';
import { ref } from 'vue'const money =ref(100)
const getMoney = () => {money.value += 10;
}const changeFn = (newMoney) => {money.value = newMoney;
}
</script><template>
<div><h3>父组件 - {{ money }}<button @click="getMoney">挣钱</button></h3><SonCom car="宝马车":money="money"@changeMoney="changeFn"></SonCom>
</div>
</template>
son.com.vue
<script setup>
// 注意:由于写了 setup,所以无法直接配置 props 选项
// 所以:此处需要借助于 “编译器宏” 函数提供props选项接收父组件传递的数据
const props = defineProps({car: String,money: Number
})const emit = defineEmits(['changeMoney'])
console.log(props.car)
console.log(props.money)const buy = () => {// 需要 emit函数 触发事件emit('changeMoney', 5)
}
</script><template><!-- 对于props传递过来的数据,模板中可以直接使用 --><div class="son">我是子组件 - {{ car }} - {{ money }}<button @click="buy">花钱</button></div>
</template><style scoped>
.son {border: 1px solid #000;padding: 30px;
}
</style>
组合式API - 模版引用
概念:通过 ref标识 获取真实的 dom对象或者组件实例对象
1. 基本使用
实现步骤:
调用ref函数创建一个值为null的ref对象
然后在标签上添加ref标识,绑定创建的ref对象到标签上
最后使用ref对象.value即可访问到绑定的元素(必须模板渲染完成后,才能拿到绑定的元素)
2. defineExpose
默认情况下在 <script setup>语法糖下组件内部的属性和方法是不开放给父组件访问的,可以通过defineExpose编译宏指定哪些属性和方法容许访问。比如:指定testMessage属性可以被访问到
vue.app
<script setup>
//在vue3中,组件的局部注册,只要导入进来就可以使用
import TestCom from '@/components/test-com.vue'
import { onMounted, ref } from 'vue'//---------------获取dom元素--------------
const inp = ref(null)onMounted(() => {console.log(inp.value)inp.value.focus()})const clickFn = () => {inp.value.focus()
}//----------------获取组件实例----------------------
const testRef = ref(null)const getCom = () => {console.log(testRef.value.count)testRef.value.sayHi()
}</script><template>
<div><input ref="inp" type="text"><button @click="clickFn">点击让输入框聚焦</button>
</div>
<TestCom ref="testRef"></TestCom>
<button @click="getCom">获取组件</button>
</template>
test-com.vue
<script setup>
const count = 999
const sayHi = () => {console.log('打招呼')
}defineExpose({count,sayHi
})
</script><template><div>我是用于测试的组件 - {{ count }}</div>
</template>
组合式API - provide和inject
1. 作用和场景
顶层组件向任意底层组件传递数据和方法,实现跨层级组件通信
2. 跨层传递普通数据
实现步骤
顶层组件通过
provide
函数提供数据
第一个形参是数据的key
第二个形参是真正要传递的数据
底层组件通过
inject
函数接收数据
通过数据的key来接收
3. 跨层传递响应式数据
在调用provide函数时,第二个参数设置为ref对象
4. 跨层传递方法
顶层组件可以向底层组件传递方法,底层组件调用方法修改顶层组件的数据
案例:
App.vue(顶层组件)
<script setup>
import CenterCom from '@/components/center-com.vue';
import { provide,ref } from 'vue';//1.跨层传递普通数据
provide('theme-color','pink')//2.跨层传递响应式数据
const count = ref(100)
provide('count',count)setTimeout(()=>{count.value = 500
},2000)//3.跨层传递函数,给子孙组件传递可以修改数据的函数
provide('changeCount',(newCount)=>{count.value = newCount
})
</script><template>
<div><h1>我是顶层组件</h1><CenterCom></CenterCom>
</div>
</template>
center-com.vue
<script setup>
import BottomCom from './bottom-com.vue'
</script><template>
<div><h2>我是中间组件</h2><BottomCom></BottomCom>
</div>
</template>
bottom-com.vue
<script setup>
import { inject } from 'vue'
const themeColor = inject('theme-color')
const count = inject('count')
const changeCount = inject('changeCount')
const clickFn = () => {changeCount(1000)
}
</script><template>
<div><h3>我是底层组件-{{ themeColor }} - {{ count }}</h3><button @click="clickFn">更新count</button>
</div>
</template>
Vue3.3 新特性-defineOptions
背景说明:
有 <script setup> 之前,如果要定义 props, emits 可以轻而易举地添加一个与 setup 平级的属性。
但是用了 <script setup> 后,就没法这么干了 setup 属性已经没有了,自然无法添加与其平级的属性。
为了解决这一问题,引入了 defineProps 与 defineEmits 这两个宏。但这只解决了 props 与 emits 这两个属性。
如果我们要定义组件的 name 或其他自定义的属性,还是得回到最原始的用法——再添加一个普通的 <script> 标签。
这样就会存在两个 <script> 标签。让人无法接受。
所以在 Vue 3.3 中新引入了 defineOptions 宏。顾名思义,主要是用来让用户可以定义 选项式API中 的选项。可以用 defineOptions 定义任意的选项, props, emits, expose, slots 除外(因为这些可以使用 defineXXX 来做到)
Vue3.3新特性-defineModel
在Vue3中,自定义组件上使用v-model, 相当于传递一个modelValue属性,同时触发 update:modelValue 事件
我们需要先定义 props,再定义 emits 。其中有许多重复的代码。如果需要修改此值,还需要手动调用 emit 函数。
于是乎 defineModel 诞生了。
生效需要配置 vite.config.js
import { fileURLToPath, URL } from 'node:url'import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'// https://vitejs.dev/config/
export default defineConfig({plugins: [vue({script: {defineModel: true}}),],resolve: {alias: {'@': fileURLToPath(new URL('./src', import.meta.url))}}
})
相关文章:
认识Vue3
目录 1. Vue3的优势 2. Vue2 选项式 API vs Vue3 组合式API 使用create-vue搭建Vue3项目 1. 认识create-vue 2. 使用create-vue创建Vue3项目 熟悉Vue3项目目录和关键文件 组合式API - setup选项 1. setup选项的写法和执行时机 2. setup中写代码的特点 组合式API - re…...
Node.js 中的 Event 模块详解
Node.js 中的 Event 模块是实现事件驱动编程的核心模块。它基于观察者模式,允许对象(称为“事件发射器”)发布事件,而其他对象(称为“事件监听器”)可以订阅并响应这些事件。这种模式非常适合处理异步操作和…...
【JavaEE进阶】MyBatis通过注解实现增删改查
目录 🍃前言 🍀打印日志 🌴传递参数 🎋增(Insert) 🚩返回主键 🎄删(Delete) 🌲改(Update) 🌳查(Select) 🚩起别名 🚩结果映射 🚩开启驼…...
【GESP C++三级考试考点详细解读】
GESP C三级考试考点解读及洛谷OJ练习题单 1. 数据编码(原码、反码、补码) 考点解读: 理解计算机中数值的二进制表示方式,包括原码(符号位绝对值)、反码(符号位不变,其余位取反&…...
算法——舞蹈链算法
一,基本概念 算法简介 舞蹈链算法(Dancing Links,简称 DLX)是一种高效解决精确覆盖问题的算法,实际上是一种数据结构,可以用来实现 X算法,以解决精确覆盖问题。由高德纳(Donald E.…...
Java状态机
目录 1. 概念 2. 定义状态机 3. 生成一个状态机 4. 使用 1. 概念 在Java的应用开发里面,应该会有不少的人接触到一个业务场景下,一个数据的状态会发生多种变化,最经典的例子例如订单,当然还有像用户的状态变化(冻结…...
3.1 Hugging Face Transformers快速入门:零基础到企业级开发的实战指南
Hugging Face Transformers快速入门:零基础到企业级开发的实战指南 一、Transformers库:NLP领域的"瑞士军刀" 1.1 核心能力全景 预训练模型库:支持150,000+模型(BERT、GPT、T5等)统一API设计:3行代码完成文本分类、生成、翻译等任务多模态支持:文本、图像、音…...
Java+SpringBoot+数据可视化的家庭记账小程序(程序+论文+安装+调试+售后等)
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统介绍 在当下这个科技日新月异、经济蓬勃向上的时代,中国经济正以令人瞩目的速度迅…...
Java-数据结构-(HashMap HashSet)
一、Tree和Hash的区别 在上一篇文章中,我们讲到了"TreeMap"和"TreeSet",但当我们刷题的时候却会发现,实际应用Map和Set时,却常常都只会用"HashMap"和"HashSet",这是为什么呢…...
【Prometheus】prometheus结合pushgateway实现脚本运行状态监控
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...
python爬虫系列课程3:解决爬虫过程中遇到的编码问题
python爬虫系列课程3:解决爬虫过程中遇到的乱码问题 在爬取某些网站时,以4399小游戏网站为例,正常编写爬虫代码并执行之后会出现乱码,代码如下: import requestsheaders = {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko…...
ocr智能票据识别系统|自动化票据识别集成方案
在企业日常运营中,对大量票据实现数字化管理是一项耗时且容易出错的任务。随着技术的进步,OCR(光学字符识别)智能票据识别系统的出现为企业提供了一个高效、准确的解决方案,不仅简化了财务流程,还大幅提升了…...
Go入门之map
map类型是引用类型,必须初始化才能使用,为key-value形式 var userinfo make(map[string]string)userinfo["username"] "zhangsan"var user map[string]string{"username": "张三","age": &qu…...
SpringBoot 中封装 Cors 自动配置
在现代 Web 开发中,跨域资源共享(CORS)是一个常见的问题。Spring Boot 提供了灵活的方式来处理 CORS 配置。本文将介绍如何通过自动配置的方式,在 Spring Boot 应用程序中全局配置 CORS。 背景 当浏览器从一个域名的网页去请求另…...
Github很慢/无法访问:简单两步搞定
第一步:获取github当前的DNS列表 第二步:把它们复制到自己本地的hosts文件中,保存 比大象装冰箱还少一步!( 下面具体说怎么操作 ~) 获取github当前的DNS列表 http://raw.hellogithub.com/hosts 把这个地址粘贴到浏…...
反射机制的简单示例
一个使用反射机制的简单示例,这个示例将展示如何使用反射来实现一个通用的数据导出功能。 首先,让我们创建必要的项目结构和文件: 首先修改 pom.xml 添加依赖: <?xml version"1.0" encoding"UTF-8"?&…...
DeepSeek在学术读写翻译中的独特优势
上下文理解能力 DeepSeek的核心优势之一在于其卓越的上下文理解能力。它能够根据前文内容准确理解和回应用户的提问或指令,确保对话的连贯性和相关性。这一能力在处理长篇对话和复杂文本时尤为重要,能够帮助用户更好地把握整体逻辑和细节。 2. 翻译专业…...
rust笔记4-属性derive
在 Rust 中,#[derive] 是一种属性(attribute),用于自动为类型实现某些 Trait。通过 #[derive],编译器可以自动生成这些 Trait 的默认实现,从而减少手动编写重复代码的工作量。 #[derive] 通常用于实现一些常见的 Trait,例如: Debug:为类型生成格式化输出的代码。Clon…...
前端(AJAX)学习笔记(CLASS 2):图书管理案例以及图片上传
* BootStrap弹框 功能:不离开当前页面,显示单独内容,供用户操作 步骤: 1、引入bootstrap.css和bootstrap.js 2、准备弹框标签,确认结构 3、通过自定义属性,控制弹框的显示和隐藏 其中的bootstrap.css…...
跟李沐学AI:InstructGPT论文精读(SFT、RLHF)
原论文:[2203.02155] Training language models to follow instructions with human feedback 原视频:InstructGPT 论文精读【论文精读48】_哔哩哔哩_bilibili 简介 1. RLHF 的基本概念 RLHF 是一种结合强化学习和人类反馈的训练方法,旨在…...
RedisTemplate存储含有特殊字符解决
ERROR信息: 案发时间: 2025-02-18 01:01 案发现场: UserServiceImpl.java 嫌疑人: stringRedisTemplate.opsForValue().set(SystemConstants.LOGIN_CODE_PREFIX phone, code, Duration.ofMinutes(3L)); // 3分钟过期作案动机: stringRedisTemplate继承了Redistemplate 使用的…...
燧光 XimmerseMR SDK接入Unity
官网SDK文档连接: RhinoX Unity XR SDK 一:下载SDK 下载链接:RhinoX Unity XR SDK 二:打开Unity项目,添加Package 1、先添加XR Core Utilties包和XR Interaction Toolkit包 2、导 2、再导入下载好的燧光SDK 三&…...
Mycat中间件
一、概述 Mycat是开源的,活跃的、基于java语言编写的MySQL数据库中间件。可以像使用MySQL一样使用mycat,对于开发人员来说根本感觉不到mycat的存在; 二、安装 Mycat是采用java语言开发的开源数据库中间件,支持windows和linux运行环…...
【HBase】HBaseJMX 接口监控信息实现钉钉告警
目录 一、JMX 简介 二、JMX监控信息钉钉告警实现 一、JMX 简介 官网:Apache HBase ™ Reference Guide JMX (Java管理扩展)提供了内置的工具,使您能够监视和管理Java VM。要启用远程系统的监视和管理,需要在启动Java…...
OpenLayers总结3
一、 静态测距 1.原理 静态测距主要是针对地图上已有的矢量要素(如线要素),利用 OpenLayers 提供的几何计算函数来获取其长度。在实际操作中,先加载包含几何要素的 GeoJSON 数据到矢量图层,当鼠标指针移动到要素上时…...
【OpenCV】在Liunx中配置OpenCV环境变量
将 /usr/local/include/opencv4 加入到环境变量中,可以帮助编译器找到 OpenCV 的头文件。这可以通过设置 CPLUS_INCLUDE_PATH 和 C_INCLUDE_PATH 环境变量来实现。以下是具体步骤: 方法一:临时设置环境变量 如果您希望临时设置这些环境变量…...
游戏引擎学习第109天
回顾目前进展 在这一期中,讨论了游戏开发中的一个重要问题——如何处理Z轴值的表示,尤其是在一个3D游戏中,如何更好地表示和存储这些值。上次的进展中,已经解决了透视投影的问题,意味着渲染部分的Z轴代码基本上已经完…...
npm、yarn、pnpm 的异同及为何推荐 pnpm
文章目录 一、引言二、npm 介绍(一)工作原理和特点(二)优势与不足 三、yarn 介绍(一)诞生背景和特性(二)与 npm 的主要区别 四、pnpm 介绍(一)核心优势和创新…...
基于遗传算法排课系统
一、遗传算法介绍: 遗传算法核心的任务是要通过编码体系,给出解决方案的染色体表现规则,首先需要随机初始化一定数量的种群(population),而种群则由一定数目的个体(individual)构成。每个个体实际上是染色体…...
Windows 图形显示驱动开发-GpuMmu 示例方案
本文介绍常见使用方案以及实现这些方案所需的操作顺序。 更新进程的页表条目 下面是更新页表条目以将属于进程 (P) 的分配映射到物理内存的操作序列。 假定页表分配已驻留在图形处理单元中GPU)内存段。 视频内存管理器在分页进程上下文中为进程 P 的根页表分配分配虚拟地址范…...
【Linux AnolisOS】关于Docker的一系列问题。尤其是拉取东西时的网络问题,镜像源问题。
AnolisOS 8中使用Docker部署(全)_anolis安装docker-CSDN博客 从在虚拟机安装龙蜥到安装docker上面这篇文章写的很清晰了,我重点讲述我解决文章里面问题一些的方法。 问题1: docker: Get https://registry-1.docker.io/v2/: net/h…...
策略+适配器模式详解
文章目录 1.策略模式1.目录结构2.Strategy.java 策略接口3.StrategyA.java 策略A4.StrategyB.java 策略B5.StrategyC.java 策略C6.Context.java 策略上下文7.Client.java 客户端8.小结 2.适配器模式1.目录结构2.CustomPaymentProcessor.java 自己的支付接口3.PayPalPaymentServ…...
Vue中事件名的命名规范
Vue中事件名的命名规范 起因: 本人之前不太写vue的项目,最近接触了vue的代码,在学习的过程中同时也会伴随着一点疑惑。比如一以下面的父子组件的事件传递为例: 父组件: 显然,父组件有个自定义事件refre…...
云计算架构学习之Ansible-playbook实战、Ansible-流程控制、Ansible-字典循环-roles角色
一、Ansible-playbook实战 1.Ansible-playbook安装软件 bash #编写yml [rootansible ansible]# cat wget.yml - hosts: backup tasks: - name: Install wget yum: name: wget state: present #检查playbook的语法 [rootansible ansible]…...
背包dp与数位dp
背包dp 介绍 动态规划实际上就是将复杂问题分解成若干个子问题,并通过子问题的解逐步发展成整体问题的解的算法思想。(我感觉这个解释就跟递归的思想一样) 背包问题分为01背包(物体只能使用一次),完全背包(物体可以使用无数次)&…...
【linux】更换ollama的deepseek模型默认安装路径
【linux】更换ollama的deepseek模型默认安装路径 文章目录 【linux】更换ollama的deepseek模型默认安装路径Ollama 默认安装路径及模型存储路径迁移ollama模型到新的路径1.创建新的模型存储目录2.停止ollama3.迁移现有模型4.修改 Ollama 服务配置5.重启ollama6.验证迁移是否成功…...
【紫光同创国产FPGA教程】——FPGA开发工具使用
本原创文章由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处(www.meyesemi.com) 一:实验简介 实验目的:了解PDS软件的使用,在线Debugger工具的使用请看第八章uart实…...
面试技术分享:MySQL死锁与事务等待超时的临时解决方案
📝 面试技术分享:MySQL死锁与事务等待超时的临时解决方案 1. 问题背景 某电商系统在促销高峰期出现库存更新失败,日志报错: Lock wait timeout exceeded; try restarting transaction (errno 1213)现象:多个事务因争…...
6.3 k8s的事件event和kube-scheduler中的事件广播器
什么是k8s的events k8s的events是向您展示集群内部发生的事情的对象 例如调度程序做出了哪些决定或者为什么某些 Pod 从节点中被逐出 哪些组件可以产生events 所有核心组件和扩展(操作符)都可以通过 API Server 创建事件k8s 多个组件均会产生 event …...
OAI 平台 4G(LTE)基站 、终端、核心网 端到端部署实践(一)
本系列文章,基于OAI LTE代码搭建端到端运行环境,包含 eNB,EPC,UE三个网元。本小节先介绍系统总体架构,硬件平台及驱动安装方法。 1. Overview 系统总体架构如下图所示。 2 Machine setup 2.1 Machine specs Distributor ID: Ubuntu Description: Ubuntu 18.04.5 LTS…...
t113修改串口
1 sys_config.fex [uart_para] uart_debug_port 0 uart_debug_tx port:PE02<6><1><default><default> uart_debug_rx port:PE03<6><1><default><default> 2 uboot修改启动参数 3 修改env.cfg启动地址和传输 #ear…...
「软件设计模式」桥接模式(Bridge Pattern)
深入解析桥接模式:解耦抽象与实现的艺术 一、模式思想:正交维度的优雅解耦 桥接模式(Bridge Pattern)通过分离抽象(Abstraction)与实现(Implementation),使二者可以独立…...
“地质环境体检”辅助智慧地质,服务工程建设、城市用地规划
随着社会经济的高速发展,各类工程建设也在加快筹建中。在工程项目的快速推进中,如何保障工作安全和工程建设的质量,是国家和社会普遍关注的一个问题。地质环境条件是影响工程建设、城市用地规划的重要因素,加强地质风险系统性研究…...
TMS320F28335二次bootloader在线IAP升级
F28335总共ABCDEFGH个区域,每个32K*16bits,即64K字节。 bootloader代码占用A区,地址0x338000~0x33FF7F,cmd文件中SECTIONS部分,需要添加Flash28_API相关信息,具体下载Flash28335_API_V210的demo࿰…...
java:用Guava的TypeToken优雅处理通配符类型(WildcardType): ? extends Number
在日常开发中我们经常会遇到泛型和通配符类型(WildcardType),比如当我们需要处理List<? extends Number>这样的类型时,如何优雅地创建这样的类型表示?本文将重点介绍如何通过Guava的TypeToken来实现通配符类型的…...
ROS-相机话题-获取图像-颜色目标识别与定位-目标跟随-人脸检测
文章目录 相机话题获取图像颜色目标识别与定位目标跟随人脸检测 相机话题 启动仿真 roslaunch wpr_simulation wpb_stage_robocup.launch rostopic hz /kinect2/qhd/image_color_rect/camera/image_raw:原始的、未经处理的图像数据。 /camera/image_rectÿ…...
Zabbix——Rocky9安装zabbix相关步骤记录
安装Zabbix 安装MariaDB 这里用MariaDB演示 https://mariadb.org/download/?trepo-config&dRedHatEnterpriseLinux9&v10.11&r_mneusoft 通过这个网址获得连接 选择对应的repo 根据系统版本和要安装的版本选择对应的repo 安装 新建一个repo文件,例…...
三轴云台之姿态测量篇
一、姿态测量的基本原理 三轴云台通过内置的传感器实时感知其姿态变化。这些传感器主要包括陀螺仪、加速度计和磁力计(在某些高级系统中)。 陀螺仪:用于检测云台的角速度变化,即绕三个轴的旋转速度。陀螺仪提供的数据是姿态测量的…...
Kotlin 2.1.0 入门教程(二十三)泛型、泛型约束、协变、逆变、不变
out(协变) out 关键字用于实现泛型的协变。协变意味着如果 B 是 A 的子类型,那么 Producer<B> 可以被视为 Producer<A> 的子类型。这里的 Producer 是一个使用泛型类型参数的类或接口,并且该泛型类型参数被标记为 ou…...
VSCode 中使用 Snippets 设置常用代码块
背景 在开发中,有很多代码片段是重复的,例如:vue文件中的模版,react 中的模版,打印的 log 等等,很多很多。对于这些重复性的工作,vscode 官方提供了解决方案-Snippets in Visual Studio Code&a…...