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

Vue 入门到实战 八

8章 组合API与响应性

目录

8.1 响应性

8.1.1 什么是响应性

8.1.2 响应性原理

8.2 为什么使用组合API

8.3 setup组件选项

8.3.1 setup函数的参数

8.3.2 setup函数的返回值

8.3.3 使用ref创建响应式引用

8.3.4 setup内部调用生命周期钩子函数

8.4 提供/注入

8.4.1 provide方法

8.4.2 inject方法

8.5 模板引用

8.6 响应式计算与侦听

8.6.1 响应式计算

8.6.2 响应式侦听


8.1 响应性

8.1.1 什么是响应性

响应性是一种允许我们以声明式的方式去适应变化的一种编程范例。Vue.js如何追踪数据的变化呢?在生成Vue.js实例时,使用带有gettersetter的处理程序遍历传入的data,将其所有property转换为Proxy对象。Proxy代理对象,顾名思义,在访问对象前增加一个中间层,通过中间层做一个中转,通过操作代理对象,实现目标对象的修改。Proxy对象对于用户来说是不可见的,但在内部,它使Vue.js能够在property值被访问或修改的情况下进行依赖跟踪和变更通知。

8-1】property转换为Proxy对象。

<script>const data = {uname: 'chenheng',age: 90}const handler = {get(target, name, receiver) {alert('执行get方法')//Reflect.get 方法查找并返回 target 对象的 name 属性,如果没有该属性,则返回 undefinedreturn Reflect.get(...arguments)},set(target, name, value, receiver) {alert('执行set方法')//Reflect.set 方法设置 target 对象的 name 属性等于 value。return Reflect.set(...arguments)}}const proxy = new Proxy(data, handler)alert(proxy.uname)    //执行get方法proxy.uname = 'hhhhh' //执行set方法alert(proxy.uname)    //执行get方法
</script>

target

要包装的目标对象Proxy。它可以是任何类型的对象,包括本机数组,函数甚至其他代理

handler

一个对象,其属性是定义对代理p执行操作时的行为的函数

proxy监听数组

 proxy可以监听属性的新增删除操作

proxy监听深层次嵌套对象

8.1.2 响应性原理

reactive()方法和watchEffect()方法是Vue3中响应式的两个核心方法,reactive()方法负责将数据变成响应式代理对象,watchEffect()方法的作用是监听数据变化去更新视图或调用函数。

8-2】reactive()方法和watchEffect()方法的应用。

8.2 为什么使用组合API

通过创建Vue.js组件,可以将接口的可重复部分及其功能提取到可重用的代码段中,从而使应用程序可维护且灵活。然而,当应用程序非常复杂(成百上千组件)时,再使用组件的选项(datacomputedmethodswatch)组织逻辑,可能导致组件难以阅读和理解。如果能够将与同一个逻辑相关的代码配置在一起将有效解决逻辑复杂、可读性差等问题。这正是使用组合API的目的。

8.3 setup组件选项

Vue组件提供setup选项,供开发者使用组合APIsetup选项在创建组件前执行,一旦props被解析,便充当组合式API的入口点。由于在执行setup时尚未创建组件实例,因此在setup选项中没有this。这意味着,除了props之外,无法访问组件中声明的任何属性,包括本地状态、计算属性或方法。

setup选项是一个接受propscontext参数的函数。此外,从setup返回的所有内容都将暴露给组件的其余部分(计算属性、方法、生命周期钩子、模板等等)。

8.3.1 setup函数的参数

1setup函数中的第一个参数(props

setup函数中的props是响应式的,当传入新的属性时,它将被更新。

8-3】setup函数中,参数props是响应式的。

但是,因为props是响应式的,不能使用ES6解构,将会消除props的响应性。如果需要解构props,可以在setup函数中使用toRefs函数来完成此操作。

8-4】setup函数中,使用toRefs函数创建props属性的响应式引用。

toRef是把对象的某个属性改成响应式的数据,toRefs是把整个对象改成响应式数据

2setup函数中的第二个参数(context

context上下文是一个普通的JavaScript对象,它暴露组件的4个属性:attrsslotsemit以及expose

setup(props, context) {

    // Attribute (非响应式对象,等同于 $attrs)

    console.log(context.attrs)可以获取父组件的传递归来的参数hobby,但是一定需要注释props

    // 插槽 (非响应式对象,等同于 $slots)

    console.log(context.slots)

    // 触发事件 (方法,等同于 $emit)

 

 home.vue

<template><Demo @zemit="showemit"></Demo>
</template><script>
import Demo from "@/components/demo.vue";
export default {components: {Demo,},setup() {function showemit(val) {alert(`触发context.emit事件,收到参数是:${val}`);}return {showemit,};},
};
</script>

 demo.vue

<template><p>个人信息</p><p>姓名:{{ person.name }}</p><p>年龄:{{ person.age }}</p><button @click="zevent">zemit事件</button>
</template><script>
import { reactive } from "vue";
export default {name: "Home12",emits: ["zemit"],setup(props, context) {console.log("1", props);// console.log("context.attrs", context.attrs);console.log("context.attrs", context.emit);const person = reactive({name: "刘巍",age: 18,});function zevent() {context.emit("zemit", '南昌大学');}return {  person,zevent,};},
};
</script>

 

8.3.2 setup函数的返回值

1)对象

如果setup返回一个对象,则可以在组件的模板中访问该对象的属性。

8-5】在该实例中,setup函数返回一个对象。

<template><h1>一个人的信息</h1><h3>职业:{{ job.type }}</h3><h3>薪水:{{ job.salary }}</h3><h3>爱好:{{ hobby }}</h3><h3>测试数据的值:{{ job.a.b.c }}</h3><button @click="changeInfo">修改人的信息</button>
</template><script>
import {reactive} from 'vue'export default {name: 'App',setup() {//数据let job = reactive({type: 'SAP工程师',salary: '60k',a: {b: {c: 666}}})let hobby = reactive(['篮球', '说泡', '旅游'])//counts changeInfo = ()=>{...}function changeInfo() {job.type = "管理咨询顾问"job.salary = "100k"job.a.b.c = 999hobby[0] = '学习'}return {job,hobby,changeInfo}}
}
</script>

2)渲染函数

setup还可以返回一个渲染函数,该函数可以直接使用在同一作用域中声明的响应式状态。

8-6】实现8-5】的功能,要求setup返回渲染函数。

8.3.3 使用ref创建响应式引用

1.声明响应式状态

要为JavaScript对象创建响应式状态,可以使用reactive()方法。reactive()方法接收一个普通对象然后返回该对象的响应式代理。示例代码如下:

const book = Vue.reactive({ title: '好书' })

reactive()方法响应式转换是“深层的”即影响对象内部所有嵌套的属性。基于ESProxy实现,返回的代理对象不等于原始对象。建议使用代理对象,避免依赖原始对象。

2.使用ref创建独立的响应式值对象

ref接受一个参数值并返回一个响应式且可改变的ref对象。ref对象拥有一个指向内部值的单一属性.value。示例代码如下:

const readersNumber = Vue.ref(1000)

console.log(readersNumber.value) //1000

readersNumber.value++

console.log(readersNumber.value) // 1001

ref作为渲染上下文的属性返回(即在setup()返回的对象中)并在模板中使用时,它会自动开箱,无需在模板内额外书写.value

8.3.4 setup内部调用生命周期钩子函数

setup内部,可通过在生命周期钩子函数前面加上“on来访问组件的生命周期钩子函数。因为setup是围绕beforeCreatecreated生命周期钩子函数运行的,所以不需要显式地定义它们。换句话说,在这些钩子函数中编写的任何代码都应该直接在setup函数中编写。这些on函数接受一个回调函数,当钩子函数被组件调用时将会被执行。示例代码如下:

setup() {

 // mounted时执行

 onMounted(() => {

  console.log('Component is mounted!')

  })

}

8.4 提供/注入

通过4.3.4节可知,使用provideinject可实现组件链传值。也就是说,父组件可以作为其所有子组件的依赖项提供程序,而不管组件层次结构有多深,父组件有一个provide选项来提供数据,子组件有一个inject选项来使用这个数据。(跨组件的数据传递)

现在,在组合API中,也可以使用provide方法和inject方法实现传值,但两者都只能在当前活动实例的setup()期间调用。

8.4.1 provide方法

首先,从vue显式导入provide方法;然后,在setup()中使用provide方法定义每个property

provide方法有两个参数:

l  name:代表字符串类型的属性名称;

l  value:代表任意类型的属性值。

8.4.2 inject方法

首先,从vue显式导入inject方法;然后,在setup()中使用inject方法注入每个property值。

inject方法有两个参数:

l  name:被注入的属性名称(字符串类型);

l  defaultValue:默认值(可选)。

假设我们有一个祖先组件 app,一个中间组件 one,以及一个后代组件 two。我们希望从 app传递一个数据到 two

app.vue

<template><one></one>
</template><script setup>
// import HelloWorld from './components/HelloWorld.vue'
// import setup from './components/setup.vue'
// import setup1 from './components/setup1.vue'
import one from './components/one.vue'
import { provide } from 'vue';
const hcm = 'payroll';
provide('sap', hcm)
</script><style>
#app {font-family: Avenir, Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;margin-top: 60px;
}
</style>

 one.vue

<template><two/>
</template><script setup>
import two from '../components/two.vue';
</script>

two.vue

<template><div :class="theme">我是SAP {{ theme }} 顾问.</div>
</template><script setup>
import { inject } from 'vue';const theme = inject('sap', 'time'); // 'time' 是默认值,如果 provide 没有提供 'theme'
</script><style scoped>
.dark {background-color: black;color: white;
}.light {background-color: white;color: black;
}
</style>

8.5 模板引用

在使用组合API时,响应式引用和模板引用的概念是统一的。为了获得对模板内元素或组件实例的引用,可以声明一个ref并从setup()返回。

8-8】在模板中使用ref引用响应式对象。

8.6 响应式计算与侦听

8.6.1 响应式计算

使用响应式计算方法computed有两种方式:传入一个getter函数,返回一个默认不可手动修改的ref对象;传入一个拥有getset函数的对象,创建一个可手动修改的计算状态。

8-9】返回一个默认不可手动修改的ref对象。

<template><div>{{count}}</div>
</template><script>
import{ref,computed} from 'vue';export default {setup() {const count = ref(1)const account = computed(()=> count.value + 1)console.log(account.value)account.value++// 返回值会暴露给模板和其他的选项式 API 钩子return {count}}
}
</script>

8-10】返回一个可手动修改的ref对象。

<template><div>{{count}}</div>
</template><script>
import{ref,computed} from 'vue';export default {setup() {const count = ref(1)const account = computed({get:()=> count.value + 1,set:(val)=> {count.value = val - 1},} )account.value = 1console.log(count.value)return {count}}
}
</script>

8.6.2 响应式侦听

可使用响应性侦听watchEffect方法,对响应性进行侦听。该方法立即执行传入的一个函数,同时响应式追踪其依赖,并在其依赖变更时重新运行该函数。(监听所有属性)

8-11】响应性侦听watchEffect方法的使用。

监听属性变化

<template><div><input type="text" v-model="obj.name"> </div>
</template><script>
import{reactive,watchEffect} from 'vue';export default {setup() {let obj = reactive({name:'vivi'});watchEffect(()=>{console.log('name:',obj.name)})return {obj}}
}
</script>

停止监听

<template><div><input type="text" v-model="obj.name"> <button @click="stopWatchEffect">停止监听</button></div>
</template><script>
import{reactive,watchEffect} from 'vue';export default {setup() {let obj = reactive({name:'vivi'});const stop1 =  watchEffect(()=>{console.log('name',obj.name)})const stopWatchEffect = ()=>{console.log('停止监听')stop1(); // ...当该侦听器不再需要时}return {obj,stopWatchEffect,}}
}
</script>

副作用

使用 onInvalidate 清理计时器,每次 count 变化时,watchEffect 会重新执行,在此之前 onInvalidate 会先清理掉之前的计时器,避免重复创建计时器导致内存泄漏。

注意:如果在 watchEffect 没有直接使用 count.value ,那么它的变化就不会触发副作用函数重新执行,从而不会调用 onInvalidate 清理之前的计时器

<template><div><p>当前计数: {{ count }}</p><button @click="count++">增加计数</button></div>
</template>
<script>
import { ref, watchEffect } from 'vue';
export default {setup() {const count = ref(0);watchEffect((onInvalidate) => {// 在函数内直接读取 count.value,确保它被追踪,这一步很重要!!!console.log(`副作用函数执行,count 值为: ${count.value}`);const timer = setInterval(() => {console.log(`计时器中 count 的值: ${count.value}`);}, 1000);onInvalidate(() => {console.log('清除计时器 timer');clearInterval(timer);});});return {count,};},
};
</script>

相关文章:

Vue 入门到实战 八

第8章 组合API与响应性 目录 8.1 响应性 8.1.1 什么是响应性 8.1.2 响应性原理 8.2 为什么使用组合API 8.3 setup组件选项 8.3.1 setup函数的参数 8.3.2 setup函数的返回值 8.3.3 使用ref创建响应式引用 8.3.4 setup内部调用生命周期钩子函数 8.4 提供/注入 8.4.1 …...

【学习总结|DAY036】Vue工程化+ElementPlus

引言 在前端开发领域&#xff0c;Vue 作为一款流行的 JavaScript 框架&#xff0c;结合 ElementPlus 组件库&#xff0c;为开发者提供了强大的构建用户界面的能力。本文将结合学习内容&#xff0c;详细介绍 Vue 工程化开发流程以及 ElementPlus 的使用&#xff0c;助力开发者快…...

HTML之CSS三大选择器

HTML之CSS三大选择器 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><st…...

理解链接:加载二进制动态库

理解链接&#xff1a;加载二进制动态库 文章目录 理解链接&#xff1a;加载二进制动态库前情提要基本方式1 - 显式连接 dlopen基本方式 2 - 隐式链接 compile link ld衍生方式 3 - 弱链接 weak linking衍生方式 4 - dlmopen 加载到独立命名空间调试所有符号 补充知识1. 动态库…...

ASP.NET Core中Filter与Middleware的区别

中间件是ASP.NET Core这个基础提供的功能&#xff0c;而Filter是ASP.NET Core MVC中提供的功能。ASP.NET Core MVC是由MVC中间件提供的框架&#xff0c;而Filter属于MVC中间件提供的功能。 区别 中间件可以处理所有的请求&#xff0c;而Filter只能处理对控制器的请求&#x…...

《语义捕捉全解析:从“我爱自然语言处理”到嵌入向量的全过程》

首先讲在前面&#xff0c;介绍一些背景 RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09; 是一种结合了信息检索与语言生成模型的技术&#xff0c;通过从外部知识库中检索相关信息&#xff0c;并将其作为提示输入给大型语言模型&#xff…...

大规模多准则决策模型构建详细方案

第二阶段&#xff1a;大规模多准则决策模型构建详细方案 目标 基于消费者群体偏好和个体交互数据&#xff0c;构建动态、可扩展的多准则决策模型&#xff0c;实现实时个性化产品排序。 一、技术架构设计 1. 系统架构图 [用户交互层] → (React前端) ↓ [API服务层] → (…...

Rust 语言:变革关键任务软件的新力量

软件无处不在&#xff0c;从手表、烤箱、汽车&#xff0c;甚至可能是牙刷中都有它的身影。更重要的是&#xff0c;软件控制着关乎生死的系统&#xff0c;如飞机、医疗设备、电网系统和银行基础设施等。如果软件工程师稍有疏忽&#xff0c;软件缺陷和漏洞可能导致数十亿美元的损…...

Linux特权组全解析:识别GID带来的权限提升风险

组ID&#xff08;Group ID&#xff0c;简称 GID&#xff09;是Linux系统中用来标识不同用户组的唯一数字标识符。每个用户组都有一个对应的 GID&#xff0c;通过 GID&#xff0c;系统能够区分并管理不同的用户组。 在Linux系统中&#xff0c;系统用户和组的配置文件通常包括以…...

安卓/ios脚本开发按键精灵经验小分享

1. 程序的切换 我们经常碰到这样的需求&#xff1a;打开最近的应用列表&#xff0c;选取我们想要的程序。但是每个手机为了自己的风格&#xff0c;样式都有区别&#xff0c;甚至连列表的滑动方向都不一样&#xff0c;我们很难通过模拟操作来识别点击&#xff0c;那么我们做的只…...

机器学习在癌症分子亚型分类中的应用

学习笔记&#xff1a;机器学习在癌症分子亚型分类中的应用——Cancer Cell 研究解析 1. 文章基本信息 标题&#xff1a;Classification of non-TCGA cancer samples to TCGA molecular subtypes using machine learning发表期刊&#xff1a;Cancer Cell发表时间&#xff1a;20…...

DeepSeek本地部署保姆级教程

由于DeepSeek近期遭受攻击&#xff0c;又加上用户访问量较大&#xff0c;导致总是服务不可用&#xff0c;让人十分窝火。有没有好的解决办法呢&#xff1f;答案是自己在电脑端部署一套&#xff0c;这样就不用和别人抢着用了。另外本地部署的好处还有保护隐私与减少延迟。 如果…...

无惧户外复杂环境,安科瑞 AKH-0.66/K-HW 开口式互感器准确测流

​安科瑞 吕梦怡 18706162527 1.产品特点 AKH-0.66/K-HW 系列互感器具有防水功能&#xff0c;可在户外使用&#xff0c;切面端口采用橡胶垫环绕可有效阻止雨水进入。互感器采用注塑技术&#xff0c;将互感器线圈直接在模具中进行注塑&#xff0c;同时二次侧引线采用防水端子…...

玩转Docker | 使用Docker部署httpd服务

玩转Docker | 使用Docker部署httpd服务 前言一、准备工作环境确认检查操作系统准备网站目录和配置文件二、拉取httpd镜像三、运行httpd容器运行容器命令检查容器状态四、验证httpd服务浏览器访问测试错误排查五、容器管理与维护查看容器状态停止和启动容器更新网站内容和配置六…...

MacOS 安装NVM

MacOS 安装NVM 方法一&#xff1a;使用Homebrew安装nvm 打开终端&#xff08;Terminal&#xff09;&#xff0c;输入以下命令安装Homebrew&#xff1a; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"安装nvm…...

Qt 数据库SQLite 使用【01】基本功能

1.开发背景 Qt 开发过程中难免需要存储数据&#xff0c;可以选择保存到本地文件&#xff0c;但是查找比较麻烦&#xff0c;所以就有了数据库&#xff0c;主要是方便查找数据&#xff0c;增删改查等操作&#xff0c;而 SqLite 属于数据库中轻量级的存在&#xff0c;适合本地数据…...

http状态码:请说说 503 Service Unavailable(服务不可用)的原因以及排查问题的思路

503 Service Unavailable&#xff08;服务不可用&#xff09; 是一种HTTP状态码&#xff0c;表示服务器当前无法处理请求&#xff0c;通常是由于临时性原因导致服务中断。以下是它的常见原因和排查思路&#xff1a; 一、503错误的常见原因 1. 服务器过载 场景&#xff1a;服务…...

58页PPT学习华为面向业务价值的数据治理实践

目录 1. 正文解读... 1 2. 华为数据质量管控的质量度量框架是怎样的?... 2 3. 如何在企业中实施类似华为的数据质量管控...

电脑开机提示按f1原因分析及终极解决方法来了

经常有网友问到一个问题&#xff0c;我电脑开机后提示按f1怎么解决&#xff1f;不管理是台式电脑&#xff0c;还是笔记本&#xff0c;都有可能会遇到开机需要按F1&#xff0c;才能进入系统的问题&#xff0c;引起这个问题的原因比较多&#xff0c;今天小编在这里给大家列举了比…...

DeepSeek模型构建与训练

在完成数据预处理之后,下一步就是构建和训练深度学习模型。DeepSeek提供了简洁而强大的API,使得模型构建和训练变得非常直观。无论是简单的全连接网络,还是复杂的卷积神经网络(CNN)或循环神经网络(RNN),DeepSeek都能轻松应对。本文将带你一步步构建一个深度学习模型,并…...

ProxySQL实现mysql8主从同步读写分离

一、ProxySQL基本介绍 ProxySQL是 MySQL 的高性能、高可用性、协议感知代理。 简单介绍下ProxySQL及其功能和配置&#xff0c;主要包括&#xff1a; 最基本的读/写分离&#xff0c;且方式有多种&#xff1b;可定制基于用户、基于schema、基于语句的规则对SQL语句进行路由&…...

Day38-【13003】短文,树的基本概念,用广义表表示树

文章目录 第五章 树与二叉树第一节 树的基本概念用广义表&#xff0c;也就是集合表示发&#xff0c;来表示树 第五章 树与二叉树 第一节 树的基本概念 因为树是一种层次结构&#xff0c;所以它是一种非线性结构&#xff0c;在实际应用中具有广泛的用途。 日常生活中&#xff…...

LabVIEW与PLC交互

一、写法 写命令立即读出 写命令后立即读出&#xff0c;在同一时间不能有多个地方写入&#xff0c;因此需要在整个写入后读出过程加锁 项目中会存在多个循环并行执行该VI&#xff0c;轮询PLC指令 在锁内耗时&#xff0c;就是TCP读写的实际耗时为5-8ms&#xff0c;在主VI六个…...

MySQL第四次作业

新建数据库 新建表 student表 2.course表 3.sc表 修改Student 表中年龄(sage)字段属性&#xff0c;数据类型由int 改变为smallint alter table student modify sage smallint; 为Course表中Cno 课程号字段设置索引&#xff0c;并查看索引 create index index_cno on cou…...

栈和队列的实现(C语言)

1&#xff1a;栈 1&#xff1a;概念和结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只运行在固定的一段进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守先进后出的原则。 压栈&#xff1a;在栈里面插入…...

(四)QT——QMainWindow——界面菜单设计

目录 前言 QMainWindow 结构 菜单栏 工具栏 状态栏 停靠部件 核心部件 UI 文件创建窗口 总结 前言 QMainWindow 是 Qt 框架中的一个类&#xff0c;主要用于创建桌面应用程序的主窗口。它提供了一个标准的窗口布局&#xff0c;包含菜单、工具栏、状态栏和中心小部件等功…...

MySQL InnoDB引擎 脏读、不可重复读和幻读

在 MySQL 的 InnoDB 存储引擎中&#xff0c;脏读、不可重复读和幻读是并发事务操作时可能出现的数据不一致问题&#xff0c;不同的事务隔离级别对这些问题有不同的处理方式。 1、脏读&#xff08;Dirty Read&#xff09; 定义&#xff1a;一个尚未提交的数据变更的事务&#…...

初阶数据结构:树---堆

目录 一、树的概念 二、树的构成 &#xff08;一&#xff09;、树的基本组成成分 &#xff08;二&#xff09;、树的实现方法 三、树的特殊结构------二叉树 &#xff08;一&#xff09;、二叉树的概念 &#xff08;二&#xff09;、二叉树的性质 &#xff08;三&#…...

判断192.168.1.0/24网络中,当前在线的ip有哪些

需求&#xff1a;判断192.168.1.0/24网络中&#xff0c;当前在线的ip有哪些&#xff0c;并编写脚本打印出来。 [rootopenEuler ~]# cat 1.sh #!/bin/bash for ip in $(seq 1 254); do ping -c 1 -W 1 "192.168.1.$ip" > /dev/null 2>&1 if [ $? …...

初始JavaEE篇 —— Spring Web MVC入门(上)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 RequestMappingg 注解介绍 Postman的介绍与使用 PostMapping 与 GetMapping 注解 构造并接收请求 接收简单参数 接收对象…...

STM32的HAL库开发-通用定时器输入捕获实验

一、通用定时器输入捕获部分框图介绍 1、捕获/比较通道的输入部分(通道1) 首先设置 TIM_CCMR1的CC1S[1:0]位&#xff0c;设置成01&#xff0c;那么IC1来自于TI1&#xff0c;也就是说连接到TI1FP1上边。设置成10&#xff0c;那个IC1来自于TI2&#xff0c;连接到TI2FP1上。设置成…...

nodejs:express + js-mdict 网页查询英汉词典,能播放.spx 声音

向 DeepSeek R1 提问&#xff1a; 我想写一个Web 前端网页&#xff0c;后台用 nodejs js-mdict , 实现在线查询英语单词&#xff0c;并能播放.spx 声音文件 1. 项目结构 首先&#xff0c;创建一个项目目录&#xff0c;结构如下&#xff1a; mydict-app/ ├── public/ │ …...

【蓝桥杯嵌入式】5_PWM

全部代码网盘自取 链接&#xff1a;https://pan.baidu.com/s/1PX2NCQxnADxYBQx5CsOgPA?pwd3ii2 提取码&#xff1a;3ii2 1、PWM占空比可调 以往届的赛题举例 将PA6、PA7分别设置为TIM16_CH1和TIM17_CH1 打开TIM16和TIM17&#xff0c;并设置PWM输出模式及其频率 设置占空比初…...

ESM-IF1:从AF2的预测结构中学习逆折叠

作者研究了从蛋白质骨干原子坐标预测蛋白质序列的问题。迄今为止&#xff0c;机器学习解决此问题的方法一直受限于可用的实验测定蛋白质结构的数量。作者使用AlphaFold2为1200万个蛋白质序列预测的结构&#xff0c;从而将训练数据扩充了近三个数量级。相比现有方法&#xff0c;…...

kafka服务端之控制器

文章目录 概述控制器的选举与故障恢复控制器的选举故障恢复 优雅关闭分区leader的选举 概述 在Kafka集群中会有一个或多个broker&#xff0c;其中有一个broker会被选举为控制器&#xff08;Kafka Controler&#xff09;&#xff0c;它负责管理整个集群中所有分区和副本的状态。…...

Redis双写一致性(数据库与redis数据一致性)

一 什么是双写一致性&#xff1f; 当修改了数据库&#xff08;MySQL&#xff09;中的数据&#xff0c;也要同时更新缓存&#xff08;redis&#xff09;中的数据&#xff0c;缓存中的数据要和数据库中的数据保持一致 双写一致性&#xff0c;根据业务对时间上的要求&#xff0c;…...

feign Api接口中注解问题:not annotated with HTTP method type (ex. GET, POST)

Bug Description 在调用Feign api时&#xff0c;出现如下异常&#xff1a; java.lang.IllegalStateException: Method PayFeignSentinelApi#getPayByOrderNo(String) not annotated with HTTPReproduciton Steps 1.启动nacos-pay-provider服务&#xff0c;并启动nacos-pay-c…...

开源2+1链动模式AI智能名片S2B2C商城小程序:突破流量与创意困境的新路径

摘要&#xff1a;本文深入剖析当前互联网行业中流量集中于巨头以及创意边际效应递减的困境&#xff0c;并探讨开源21链动模式AI智能名片S2B2C商城小程序在应对这些困境时所展现的独特优势与应用策略。通过对行业现状的分析以及该小程序功能特点的研究&#xff0c;旨在为企业在艰…...

python编程-内置函数compile(),exec(),complex(),eval()详解

1. compile() 函数 ‌用途‌&#xff1a;将一个字符串源代码编译为字节码对象&#xff0c;这样可以直接被Python解释器执行&#xff0c;或者通过exec()或eval()函数来执行。 ‌参数‌&#xff1a; source&#xff1a;一个字符串或AST&#xff08;抽象语法树&#xff09;对象&am…...

websocket自动重连封装

websocket自动重连封装 前端代码封装 import { ref, onUnmounted } from vue;interface WebSocketOptions {url: string;protocols?: string | string[];reconnectTimeout?: number; }class WebSocketService {private ws: WebSocket | null null;private callbacks: { [k…...

解锁C/C++:链表数据结构的奇幻之旅

目录 一、引言二、链表基础概念2.1 链表是什么2.2 链表的类型三、C 语言实现链表3.1 定义链表节点3.2 创建链表3.3 链表操作3.3.1 遍历链表3.3.2 插入节点3.3.3 删除节点3.3.4 查找节点3.4 完整示例代码四、C++ 实现链表4.1 定义链表节点类4.2 创建链表4.3 链表操作4.3.1 遍历链…...

x64、aarch64、arm与RISC-V64:详解四种处理器架构

x64、aarch64、arm与RISC-V64:详解四种处理器架构 x64架构aarch64架构ARM架构RISC-V64架构总结与展望在计算机科学领域,处理器架构是构建计算机系统的基石,它决定了计算机如何执行指令、管理内存和处理数据。x64、aarch64、arm与RISC-V64是当前主流的四种处理器架构,它们在…...

nuxt3中报错: `setInterval` should not be used on the server.

那是因为在后端渲染没有浏览器的执行环境&#xff0c;一些浏览器环境提供的对象和方法都无法使用&#xff0c;代码判断下就行。 if (import.meta.client) {setInterval(() > {}, 1000) }Import meta Nuxt API...

python编程-集合内置函数和filter(),集合常见操作

在Python中&#xff0c;列表、集合、字典是三种常用的数据结构&#xff0c;它们各自拥有一些内置函数&#xff0c;用于执行各种操作。 一、列表的常用内置函数 #‌1、append(obj)‌: 在列表末尾添加新的对象。list_a [1, 2, 3] list_a.append(4) print(list_a) # 输出: [1,…...

三极管的截止、放大、饱和区

三极管的几个区&#xff0c;都有什么用&#xff1a; 截止区&#xff1a;晶体管不导通&#xff0c;用于开关电路的“关”状态。 放大区&#xff1a;晶体管用于信号放大&#xff0c;集电极电流与基极电流成正比。 饱和区&#xff1a;晶体管完全导通&#xff0c;用于开关电路的“…...

python爬虫--简单登录

1&#xff0c;使用flask框架搭建一个简易网站 后端代码app.py from flask import Flask, render_template, request, redirect, url_for, sessionapp Flask(__name__) app.secret_key 123456789 # 用于加密会话数据# 模拟用户数据库 users {user1: {password: password1}…...

苹果公司宣布正式开源 Xcode 引擎 Swift Build145

2025 年 2 月 1 日&#xff0c;苹果公司宣布正式开源 Xcode 引擎 Swift Build145。 Swift 是苹果公司于 2014 年推出的一种开源编程语言&#xff0c;用于开发 iOS、iPadOS、macOS、watchOS 和 tvOS 等平台的应用程序。 发展历程 诞生&#xff1a;2014 年&#xff0c;苹果在全球…...

齿轮减速机和平行轴减速机有何区别?

减速机是传动系统中重要的组成部分&#xff0c;常用的减速机有四大系列&#xff0c;分别是平行轴减速机、同轴减速机、直角减速机和齿轮减速机。那么大家知道齿轮减速机和平行轴减速机投什么区别吗&#xff1f; 齿轮减速机的轴不一定是平行的&#xff0c;还可能存在相交轴或交错…...

基于Hexo实现一个静态的博客网站

原文首发&#xff1a;https://blog.liuzijian.com/post/8iu7g5e3r6y.html 目录 引言1.初始化Hexo2.整合主题Fluid3.部署评论系统Waline4.采用Nginx部署 引言 Hexo是中国台湾开发者Charlie在2012年创建的一个开源项目&#xff0c;旨在提供一个简单、快速且易于扩展的静态博客生…...

MIT6.824 Lecture 1-Introduction

balance&#xff1a;性能和容错 Faulty tolerance&#xff1a; Availablity、Recoverability、NV storage&#xff08;非易失性存储&#xff0c;比较贵&#xff09;、Replication&#xff08;多个数据副本&#xff09; consistency&#xff1a; Put&#xff08;key&#xff0c;…...