Vue.js组件开发全解析

Vue.js组件开发全解析

文章目录

  • Vue.js组件开发全解析
    • 一、Vue.js基础回顾
      • (一)Vue实例
      • (二)指令
      • (三)计算属性和方法
    • 二、组件基础
      • (一)组件的概念
      • (二)全局组件注册
      • (三)局部组件注册
    • 三、组件间通信
      • (一)父子组件通信
      • (二)非父子组件通信
    • 四、组件的生命周期
      • (一)生命周期钩子函数
      • (二)生命周期的应用场景
    • 五、组件的高级特性
      • (一)插槽(Slots)
      • (二)动态组件
      • (三)异步组件
      • (四)递归组件
    • 六、组件开发的最佳实践
      • (一)组件的设计原则
      • (二)组件的样式处理
      • (三)组件的测试
      • (四)组件库的搭建与维护
    • 七、总结

一、Vue.js基础回顾

在深入探讨Vue.js组件开发之前,我们先来回顾一下Vue.js的核心概念。Vue.js是一款流行的JavaScript前端框架,它采用了MVVM(Model - View - ViewModel)架构模式,通过数据驱动和组件化的方式,让开发者能够高效地构建用户界面。

(一)Vue实例

每个Vue应用都是通过创建一个新的Vue实例开始的。例如:

<!DOCTYPE html>
<html><head><meta charset="UTF - 8"><title>Vue基础示例</title><script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head><body><div id="app">{{ message }}</div><script>var app = new Vue({el: '#app',data: {message: 'Hello, Vue!'}});</script>
</body></html>

在这个例子中,el选项指定了Vue实例挂载的DOM元素,data选项定义了响应式数据。当message的值发生变化时,DOM中的插值{{ message }}也会自动更新。

(二)指令

Vue.js提供了一系列的指令,用于在DOM上添加特殊的行为。例如:

  • v - bind:用于绑定HTML属性。例如,<img v - bind:src="imageUrl">,当imageUrl数据变化时,src属性也会随之改变,也可以简写成<img :src="imageUrl">
  • v - if:根据表达式的真假来条件性地渲染元素。例如,<div v - if="isShow">这是一个条件显示的div</div>,当isShowtrue时,该div会被渲染到DOM中,否则不会。
  • v - for:基于一个数组来渲染一个列表。例如,<li v - for="(item, index) in items" :key="index">{{ item }}</li>items是一个数组,item是数组中的每个元素,index是元素的索引,key是为了高效更新虚拟DOM而提供的唯一标识。

(三)计算属性和方法

  1. 计算属性:计算属性是基于它们的响应式依赖进行缓存的。只有在相关响应式依赖发生改变时它们才会重新求值。例如:
<div id="app"><p>原始数据: {{ message }}</p><p>计算后的数据: {{ reversedMessage }}</p>
</div>
<script>var app = new Vue({el: '#app',data: {message: 'Hello'},computed: {reversedMessage: function () {return this.message.split('').reverse().join('');}}});
</script>

在这个例子中,reversedMessage是一个计算属性,它依赖于message数据。当message变化时,reversedMessage会自动重新计算。
2. 方法:方法是定义在methods选项中的函数,可以通过事件绑定来调用。例如:

<div id="app"><button @click="greet">点击问候</button>
</div>
<script>var app = new Vue({el: '#app',methods: {greet: function () {alert('Hello!');}}});
</script>

这里的@clickv - on:click的简写,绑定了greet方法,当按钮被点击时,会执行greet方法。

二、组件基础

(一)组件的概念

组件是Vue.js最强大的功能之一。组件可以看作是自定义的HTML元素,它将HTML、CSS和JavaScript封装在一起,形成一个可复用的代码块。每个组件都有自己的状态和行为,通过props来接收外部传递的数据,通过events来触发外部的响应。

(二)全局组件注册

在Vue.js中,可以通过Vue.component方法来注册全局组件。例如:

<!DOCTYPE html>
<html><head><meta charset="UTF - 8"><title>全局组件示例</title><script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head><body><div id="app"><my - component></my - component></div><script>// 注册全局组件Vue.component('my - component', {template: '<div>这是一个全局组件</div>'});var app = new Vue({el: '#app'});</script>
</body></html>

在这个例子中,我们通过Vue.component注册了一个名为my - component的全局组件,然后在#app这个Vue实例的模板中使用了它。

(三)局部组件注册

除了全局注册,还可以在一个Vue实例内部进行局部组件注册。例如:

<!DOCTYPE html>
<html><head><meta charset="UTF - 8"><title>局部组件示例</title><script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head><body><div id="app"><local - component></local - component></div><script>var localComponent = {template: '<div>这是一个局部组件</div>'};var app = new Vue({el: '#app',components: {'local - component': localComponent}});</script>
</body></html>

这里我们在app这个Vue实例的components选项中注册了一个局部组件local - component,它只能在app实例的模板中使用。

三、组件间通信

在实际的应用开发中,组件之间往往需要进行数据传递和交互,这就涉及到组件间通信。

(一)父子组件通信

  1. 父传子(props):父组件通过props向子组件传递数据。例如:
<!DOCTYPE html>
<html><head><meta charset="UTF - 8"><title>父子组件通信 - 父传子</title><script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head><body><div id="app"><child - component :message="parentMessage"></child - component></div><script>Vue.component('child - component', {props: ['message'],template: '<div>{{ message }}</div>'});var app = new Vue({el: '#app',data: {parentMessage: '来自父组件的数据'}});</script>
</body></html>

在这个例子中,父组件通过v - bind指令(简写为:)将parentMessage数据传递给子组件的message prop,子组件通过props选项接收并在模板中使用。
2. **子传父( e m i t ) ∗ ∗ :子组件通过 ‘ emit)**:子组件通过` emit:子组件通过emit`方法触发一个自定义事件,将数据传递给父组件。例如:

<!DOCTYPE html>
<html><head><meta charset="UTF - 8"><title>父子组件通信 - 子传父</title><script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head><body><div id="app"><child - component @child - event="handleChildEvent"></child - component><p>从子组件接收的数据: {{ receivedData }}</p></div><script>Vue.component('child - component', {data: function () {return {childData: '来自子组件的数据'};},methods: {sendDataToParent: function () {this.$emit('child - event', this.childData);}},template: '<button @click="sendDataToParent">点击传递数据给父组件</button>'});var app = new Vue({el: '#app',data: {receivedData: ''},methods: {handleChildEvent: function (data) {this.receivedData = data;}}});</script>
</body></html>

子组件通过$emit('child - event', this.childData)触发child - event事件,并传递childData数据,父组件通过@child - event="handleChildEvent"监听该事件,并在handleChildEvent方法中接收数据。

(二)非父子组件通信

  1. 事件总线(Event Bus):适用于任意两个组件之间的通信。创建一个空的Vue实例作为事件总线,通过$on方法监听事件,通过$emit方法触发事件。例如:
<!DOCTYPE html>
<html><head><meta charset="UTF - 8"><title>非父子组件通信 - 事件总线</title><script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head><body><div id="app"><component - a></component - a><component - b></component - b></div><script>// 创建事件总线var eventBus = new Vue();Vue.component('component - a', {methods: {sendMessage: function () {eventBus.$emit('message - event', '来自组件A的消息');}},template: '<button @click="sendMessage">点击发送消息给组件B</button>'});Vue.component('component - b', {data: function () {return {receivedMessage: ''};},mounted: function () {eventBus.$on('message - event', function (message) {this.receivedMessage = message;}.bind(this));},template: '<div>接收的消息: {{ receivedMessage }}</div>'});var app = new Vue({el: '#app'});</script>
</body></html>

在这个例子中,component - a通过事件总线eventBus触发message - event事件并传递消息,component - bmounted钩子函数中通过事件总线监听该事件并接收消息。
2. Vuex(状态管理库):当应用规模较大时,使用Vuex进行状态管理更为合适。Vuex是一个专为Vue.js应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。例如:

// 安装Vuex
import Vue from 'vue';
import Vuex from 'vuex';Vue.use(Vuex);// 创建store实例
const store = new Vuex.Store({state: {sharedData: '初始共享数据'},mutations: {updateSharedData: (state, data) => {state.sharedData = data;}},actions: {updateData: ({ commit }, data) => {commit('updateSharedData', data);}}
});

在组件中使用Vuex:

<template><div><button @click="updateData('新的共享数据')">更新共享数据</button><p>共享数据: {{ $store.state.sharedData }}</p></div>
</template><script>
export default {methods: {updateData: function (data) {this.$store.dispatch('updateData', data);}}
};
</script>

这里通过this.$store.dispatch触发updateData action,进而通过commit调用updateSharedData mutation来更新sharedData状态。

四、组件的生命周期

组件的生命周期是指组件从创建到销毁的整个过程,Vue.js提供了一系列的生命周期钩子函数,让我们可以在不同的阶段执行相应的代码。

(一)生命周期钩子函数

  1. 创建阶段
    • beforeCreate:在实例初始化之后,数据观测和事件配置之前被调用。此时,组件的datamethods等还未初始化,一般用于一些初始化操作,如加载外部配置文件等。
    • created:在实例创建完成后被立即调用。此时,组件的datamethods等已经初始化完成,可以进行一些数据请求等操作。例如:
export default {data: function () {return {userData: null};},created: function () {// 模拟数据请求setTimeout(() => {this.userData = { name: '张三', age: 20 };}, 1000);}
};
  1. 挂载阶段
    • beforeMount:在挂载开始之前被调用。此时,el选项已被解析,但模板还未被渲染到DOM中。
    • mounted:在实例被挂载到DOM后被调用。此时,可以访问DOM元素,进行一些DOM操作,如初始化第三方插件等。例如:
<template><div id="my - component"><p ref="myParagraph">这是一个段落</p></div>
</template><script>
export default {mounted: function () {console.log(this.$refs.myParagraph.textContent);}
};
</script>
  1. 更新阶段
    • beforeUpdate:在数据更新时调用,发生在虚拟DOM重新渲染和打补丁之前。可以在这个钩子函数中获取更新前的状态。
    • updated:在数据更新后,虚拟DOM重新渲染和打补丁完成之后被调用。注意,在这个钩子函数中避免修改数据,以免陷入死循环。
  2. 销毁阶段
    • beforeDestroy:在实例销毁之前调用。此时,实例仍然完全可用,可以进行一些清理工作,如解绑事件、取消定时器等。
    • destroyed:在实例销毁后调用。此时,所有的事件监听器被移除,子组件实例也被销毁。

(二)生命周期的应用场景

  1. 数据请求:通常在createdmounted钩子函数中进行数据请求。如果数据请求不依赖于DOM元素,可以在created中进行;如果依赖DOM元素,如需要根据DOM元素的位置来请求数据,则在mounted中进行。
  2. 资源清理:在beforeDestroy钩子函数中清理定时器、解绑事件等资源,避免内存泄漏。例如:
export default {data: function () {return {timer: null};},created: function () {this.timer = setInterval(() => {console.log('定时器在运行');}, 1000);},beforeDestroy: function () {clearInterval(this.timer);}
};

五、组件的高级特性

(一)插槽(Slots)

  1. 作用域插槽:子组件可以将数据传递给插槽,让父组件在使用插槽时能够访问这些数据。例如:
<template><div class="parent - component"><slot :user="user"><p>默认显示:{{ user.name }}</p></slot></div>
</template><script>
export default {data() {return {user: { name: '张三', age: 25 }};}
};
</script>

在父组件中使用:

<parent - component><template v - slot:default="slotProps"><p>自定义显示:{{ slotProps.user.age }}岁的{{ slotProps.user.name }}</p></template>
</parent - component>

在父组件的作用域插槽中,通过v - slot:default="slotProps"default表示默认插槽,slotProps是自定义的接收子组件传递数据的变量名),可以访问子组件传递过来的user数据,并按照父组件的需求进行展示。

(二)动态组件

动态组件允许在同一位置根据不同的条件渲染不同的组件。通过<component>元素结合is属性来实现。例如:

<template><div><button @click="changeComponent('componentA')">显示组件A</button><button @click="changeComponent('componentB')">显示组件B</button><component :is="currentComponent"></component></div>
</template><script>
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';export default {components: {ComponentA,ComponentB},data() {return {currentComponent: 'ComponentA'};},methods: {changeComponent(componentName) {this.currentComponent = componentName;}}
};
</script>

在上述代码中,通过点击不同的按钮,改变currentComponent的值,从而动态地在<component>标签位置渲染ComponentAComponentB组件。

(三)异步组件

当组件的体积较大时,为了提高页面的加载性能,可以将组件定义为异步组件。Vue.js会在需要渲染该组件时才去加载它。例如:

import Vue from 'vue';// 异步组件定义
const AsyncComponent = () => import('./AsyncComponent.vue');// 全局注册异步组件
Vue.component('AsyncComponent', AsyncComponent);

在模板中使用异步组件:

<template><div><AsyncComponent /></div>
</template>

也可以在局部组件中使用:

<template><div><component :is="asyncComponent" /></div>
</template><script>
export default {data() {return {asyncComponent: () => import('./AsyncComponent.vue')};}
};
</script>

这样,在组件被渲染到页面之前,不会加载AsyncComponent.vue的代码,只有在真正需要时才会通过网络请求加载,减少了初始加载的代码量,提高了页面的加载速度。

(四)递归组件

递归组件是指组件在其自身模板中调用自身的组件。使用递归组件时需要注意设置终止条件,否则会导致无限循环。例如,实现一个树形结构的组件:

<template><div><ul><li v - for="(node, index) in treeData" :key="index">{{ node.label }}<tree - component v - if="node.children && node.children.length > 0" :treeData="node.children" /></li></ul></div>
</template><script>
export default {props: {treeData: {type: Array,default: () => []}}
};
</script>

在上述代码中,tree - component组件在自身模板中通过v - if条件判断,如果当前节点有子节点,就递归调用自身并传递子节点数据。假设treeData的结构如下:

[{label: '节点1',children: [{ label: '子节点1 - 1' },{ label: '子节点1 - 2', children: [{ label: '孙节点1 - 2 - 1' }] }]},{label: '节点2'}
]

这样就可以通过递归组件渲染出完整的树形结构。

六、组件开发的最佳实践

(一)组件的设计原则

  1. 单一职责原则:每个组件应该只负责一项单一的功能,这样可以提高组件的可维护性和可复用性。例如,一个按钮组件只负责按钮的样式和点击事件处理,而不应该包含与表单验证等无关的功能。
  2. 高内聚低耦合:组件内部的代码应该紧密相关,实现高内聚;组件之间的依赖关系应该尽量简单,保持低耦合。比如,一个数据展示组件不应该直接依赖于其他组件的内部状态,而是通过props和events进行数据传递和交互。
  3. 可复用性:设计组件时要考虑其在不同场景下的复用性,通过合理的props设计和功能抽象,使组件能够适应多种需求。例如,一个通用的表格组件,可以通过props传递不同的表头数据和行数据,以展示不同的数据列表。

(二)组件的样式处理

  1. Scoped CSS:Vue.js提供了scoped属性,让组件的样式只作用于当前组件。例如:
<template><div class="my - component"><p>这是组件内容</p></div>
</template><style scoped>
.my - component {background - color: lightblue;
}
</style>

这样,.my - component的样式只会应用于当前组件,不会影响到其他组件。
2. CSS Modules:也可以使用CSS Modules来管理组件样式。通过将CSS文件命名为*.module.css,在组件中引入:

<template><div :class="$style.myComponent"><p>这是组件内容</p></div>
</template><script>
import styles from './MyComponent.module.css';export default {computed: {$style() {return styles;}}
};
</script>

CSS Modules会自动生成唯一的类名,避免样式冲突。

(三)组件的测试

  1. 单元测试:使用测试框架如Jest和Vue Test Utils对组件进行单元测试。例如,测试一个简单的按钮组件:
import { mount } from '@vue/test - utils';
import Button from './Button.vue';describe('Button.vue', () => {it('should emit click event when clicked', () => {const wrapper = mount(Button);wrapper.trigger('click');expect(wrapper.emitted('click')).toBeTruthy();});
});

通过mount方法挂载组件,然后使用trigger方法模拟点击事件,最后通过expect断言组件是否触发了click事件。
2. 集成测试:测试组件之间的交互和集成。例如,测试父子组件之间的通信:

import { mount } from '@vue/test - utils';
import ParentComponent from './ParentComponent.vue';
import ChildComponent from './ChildComponent.vue';describe('Parent - Child Component Interaction', () => {it('should receive data from child component', () => {const wrapper = mount(ParentComponent);const childWrapper = wrapper.findComponent(ChildComponent);childWrapper.vm.$emit('child - event', 'test data');expect(wrapper.vm.receivedData).toBe('test data');});
});

在这个例子中,通过mount挂载父组件,然后找到子组件,模拟子组件触发事件,最后断言父组件是否正确接收到数据。

(四)组件库的搭建与维护

  1. 组件库搭建:可以使用工具如Vue CLI和Rollup来搭建组件库。首先,通过Vue CLI创建一个基础项目,然后将组件封装成独立的模块,最后使用Rollup进行打包和优化。例如,在package.json中配置脚本:
{"scripts": {"build:lib": "rollup - c"}
}

并编写rollup.config.js配置文件,对组件进行打包输出。
2. 组件库维护:定期更新组件库中的组件,修复漏洞,添加新功能。同时,要保持组件库的文档更新,方便开发者使用。可以使用工具如Vuepress来生成组件库的文档,详细说明每个组件的使用方法、props和events等。

七、总结

Vue.js的组件开发是构建大型应用的关键,通过合理地运用组件的各种特性,如组件通信、生命周期、插槽等,可以将复杂的用户界面拆分成一个个可复用、可维护的组件。在开发过程中,遵循组件设计原则,注意样式处理和测试,能够提高组件的质量和应用的稳定性。同时,对于组件库的搭建和维护,也有助于提高团队开发效率和代码的可复用性。随着Vue.js的不断发展,组件开发的技术和最佳实践也在不断演进,开发者需要持续学习和实践,以跟上技术的步伐,打造出更加优秀的前端应用。

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

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

相关文章

如何选择适合特定项目需求的人工智能学习框架?

人工智能学习框架&#xff08;AI Learning Framework&#xff09;是一种用于开发、训练和部署人工智能模型的软件平台&#xff0c;旨在简化AI模型的设计、训练和部署过程。这些框架通常提供一系列工具、库和预构建模块&#xff0c;使开发者能够快速实现机器学习任务&#xff0c…

架构设计:微服务还是集群更适合?

在现代软件开发中&#xff0c;微服务和集群是两种广泛应用的架构设计方案。随着系统需求的不断复杂化和规模的扩大&#xff0c;选择一种适合的架构对系统的性能、可维护性和扩展性至关重要。那么&#xff0c;在架构设计中&#xff0c;是选择微服务还是集群更适合&#xff1f;本…

Spring Bug解决

报错&#xff1a; Exception in thread "main" org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type com.itxl.spring6.iocxml.User available: expected single matching bean but found 2: user,user1 at org.sp…

算法(蓝桥杯)贪心算法5——删数问题的解题思路

问题描述 给定一个高精度的正整数 n&#xff08;n≤1000 位&#xff09;&#xff0c;需要删除其中任意 s 个数字&#xff0c;使得剩下的数字按原左右顺序组成一个新的正整数&#xff0c;并且这个新的正整数最小。例如&#xff0c;对于数字 153748&#xff0c;删除 2 个数字后&a…

元素隐式具有 “any“ 类型,因为类型为 “string“ 的表达式不能用于索引类型

元素隐式具有 “any” 类型&#xff0c;因为类型为 “string” 的表达式不能用于索引类型 “{ minLon: string; maxLon: string; minLat: string; maxLat: string; minTime: string; maxTime: string; keyword: string; subjct: string; ele: string; }”。 在类型 “{ minLon:…

《探秘鸿蒙NEXT中的人工智能核心架构》

在当今科技飞速发展的时代&#xff0c;华为HarmonyOS NEXT的发布无疑是操作系统领域的一颗重磅炸弹&#xff0c;其将人工智能与操作系统深度融合&#xff0c;开启了智能新时代。那么&#xff0c;鸿蒙NEXT中人工智能的核心架构究竟是怎样的呢&#xff1f;让我们一同探秘。 基础…

git克隆原项目到新目录,保留提交记录分支等,与原项目保持各自独立

1、克隆原仓库到本地 --mirror 会完整克隆所有git数据&#xff0c;包括所有分支、标签、提交记录 git clone --mirror http://gitlab.com.../old-project.git2、进入文件夹 cd old-project.git3、添加目录仓库为远程 xx-orgin表示给远程地址命名 git remote add xx-orgin htt…

U盘被格式化后的数据救赎与防范策略

一、U盘格式化后的数据困境 在日常的工作与生活中&#xff0c;U盘作为数据传输与存储的重要工具&#xff0c;扮演着不可或缺的角色。然而&#xff0c;当U盘不幸遭遇格式化操作后&#xff0c;存储在其中的宝贵数据瞬间化为乌有&#xff0c;给用户带来极大的困扰。格式化后的U盘…

PyBroker:利用 Python 和机器学习助力算法交易

PyBroker&#xff1a;利用 Python 和机器学习助力算法交易 你是否希望借助 Python 和机器学习的力量来优化你的交易策略&#xff1f;那么你需要了解一下 PyBroker&#xff01;这个 Python 框架专为开发算法交易策略而设计&#xff0c;尤其关注使用机器学习的策略。借助 PyBrok…

【AI论文】LlamaV-o1:重新思考大型语言模型(LLMs)中的逐步视觉推理方法

摘要&#xff1a;推理是解决复杂多步骤问题的基本能力&#xff0c;特别是在需要逐步顺序理解的视觉环境中尤为重要。现有的方法缺乏一个全面的视觉推理评估框架&#xff0c;并且不强调逐步解决问题。为此&#xff0c;我们通过三项关键贡献&#xff0c;提出了一个在大型语言模型…

【HTTP】详解

目录 HTTP 基本概念啥是HTTP&#xff0c;有什么用&#xff1f;一次HTTP请求的过程当你在浏览器中输入一个浏览器地址&#xff0c;它会发送什么 &#xff1f;---&#xff08;底层流程&#xff09;HTTP的协议头请求头&#xff08;对应客户端&#xff09;一些请求头请求方法 响应头…

EasyExcel - 行合并策略(二级列表)

&#x1f63c;前言&#xff1a;博主在工作中又遇到了新的excel导出挑战&#xff1a;需要导出多条文章及其下联合作者的信息&#xff0c;简单的来说是一个二级列表的数据结构。 &#x1f575;️‍♂️思路&#xff1a;excel导出实际上是一行一行的记录&#xff0c;再根据条件对其…

第9章:基于Vision Transformer(ViT)网络实现的迁移学习图像分类任务:早期秧苗图像识别

目录 1. ViT 模型 2. 早期秧苗分类 2.1 数据集 2.2 训练 2.3 训练结果 2.4 可视化网页推理 3. 下载 1. ViT 模型 视觉变换器&#xff08;ViT&#xff09;是一种神经网络架构&#xff0c;它将变换器架构的原理应用于视觉数据。最初&#xff0c;Transformers主要用于自然…

ros2-7.5 做一个自动巡检机器人

7.5.1 需求及设计 又到了小鱼老师带着做最佳实践项目了。需求&#xff1a;做一个在各个房间不断巡逻并记录图像的机器人。 到达目标点后首先通过语音播放到达目标点信息&#xff0c; 再通过摄像头拍摄一张图片保存到本地。 7.5.2 编写巡检控制节点 在chapt7_ws/src下新建功…

OpenHarmony API 设计规范

OpenHarmony API 设计规范 修订记录 版本作者时间更新内容v0.1&#xff0c;试运行版OpenHarmony API SIG2022年11月初版发布 目的 API是软件实现者提供给使用者在编程界面上的定义&#xff0c;API在很大程度上体现了软件实体的能力范围。 同时&#xff0c;API定义的好坏极…

【React】新建React项目

目录 create-react-app基础运用React核心依赖React 核心思想&#xff1a;数据驱动React 采用 MVC体系package.jsonindex.html好书推荐 官方提供了快速构建React 项目的脚手架&#xff1a; create-react-app &#xff0c;目前使用它安装默认是19版本&#xff0c;我们这里降为18…

Linux手写FrameBuffer任意引脚驱动spi屏幕

一、硬件设备 开发板&#xff1a;香橙派 5Plus&#xff0c;cpu&#xff1a;RK3588&#xff0c;带有 40pin 外接引脚。 屏幕&#xff1a;SPI 协议 0.96 寸 OLED。 二、需求 主要是想给板子增加一个可视化的监视器&#xff0c;并且主页面可调。 平时跑个模型或者服务&#xff0c;…

网络安全构成要素

一、防火墙 组织机构内部的网络与互联网相连时&#xff0c;为了避免域内受到非法访问的威胁&#xff0c;往往会设置防火墙。 使用NAT&#xff08;NAPT&#xff09;的情况下&#xff0c;由于限定了可以从外部访问的地址&#xff0c;因此也能起到防火墙的作用。 二、IDS入侵检…

React Native的现状与未来:从发展到展望

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

数据结构——链表(概念,类型,java实现、增删、优缺点)

我是一个计算机专业研0的学生卡蒙Camel&#x1f42b;&#x1f42b;&#x1f42b;&#xff08;刚保研&#xff09; 记录每天学习过程&#xff08;主要学习Java、python、人工智能&#xff09;&#xff0c;总结知识点&#xff08;内容来自&#xff1a;自我总结网上借鉴&#xff0…