概述
软件编程有一个重要的原则是 D.R.Y(Don't Repeat Yourself),讲的是尽量复用代码和逻辑,减少重复。组件扩展可以避免重复代码,更易于快速开发和维护。那么,扩展 Vue 组件的最佳方法是什么?
Vue 提供了不少 API 和模式来支持组件复用和扩展,你可以根据自己的目的和偏好来选择。
本文介绍几种比较常见的方法和模式,希望对你有所帮助。
扩展组件是否必要
要知道,所有的组件扩展方法都会增加复杂性和额外代码,有时候还会增加性能消耗。
因此,在决定扩展组件之前,最好先看看有没有其他更简单的设计模式能完成目标。
下面几种组件设计模式通常足够替代扩展组件了:
props 配合模板逻辑
slot 插槽
JavaScript 工具函数
props 配合模板逻辑
最简单的方法是通过props结合模板条件渲染,来实现组件的多功能。
比如通过 type 属性: MyVersatileComponent.vue
使用组件的时候传不同的type值就能实现不同的结果。
如果出现下面两种情况,就说明这种模式不适用了,或者用法不对:
组件组合模式把状态和逻辑分解成原子部分,从而让应用具备可扩展性。如果组件内存在大量条件判断,可读性和可维护性就会变差。
props 和模板逻辑的本意是让组件动态化,但是也存在运行时资源消耗。如果你利用这种机制在运行时解决代码组合问题,那是一种反模式。
slot(插槽)
另一种可避免组件扩展的方式是利用 slots(插槽),就是让父组件在子组件内设置自定义内容。
// *MyVersatileComponent.vue*
Common markup
// *ParentComponent.vue*
Inserting into the slot
渲染结果:
Common markup
Inserting into the slot
这种模式有一个潜在约束, slot 内的元素从属于父组件的上下文,在拆分逻辑和状态时可能不太自然。scoped slot会更灵活,后面会在无渲染组件一节里提到。
JavaScript 工具函数
如果只需要在各组件之间复用独立的函数,那么只需要抽取这些 JavaScript 模块就行了,根本不需要用到组件扩展模式。
JavaScript 的模块系统是一种非常灵活和健壮的代码共享方式,所以你应该尽可能地依靠它。 MyUtilityFunction.js
export default function () {
...
}
MyComponent.vue
import MyUtilityFunction from "./MyUtilityFunction";
export default {
methods: {
MyUtilityFunction
}
}
扩展组件的几种模式
如果你已经考虑过以上几种简单的模式,但这些模式还不够灵活,无法满足需求。那么就可以考虑扩展组件了。
扩展 Vue 组件最流行的方法有以下四种:
Composition 函数
mixin
高阶组件(HOC)
无渲染组件
每一种方法都有其优缺点,根据使用场景,或多或少都有适用的部分。
Composition API
组件之间共享状态和逻辑的最新方案是 Composition API。这是 Vue 3 推出的 API,也可以在 Vue 2 里当插件使用。
跟之前在组件定义配置对象里声明data,computed,methods等属性的方式不同,Composition API 通过一个 setup 函数声明和返回这些配置。
比如,用 Vue 2 配置属性的方式声明 Counter 组件是这样的: Counter.vue
Count is: {{ count }}, double is: {{ double }}
用 Composition API 重构这个组件,功能完全一样: Counter.vue
用 Composition API 声明组件的主要好处之一是,逻辑复用和抽取变得非常轻松。
进一步重构,把计数器的功能移到 JavaScript 模块 useCounter.js中: useCounter.js
import { reactive, computed } from "vue";
export default function {
const state = reactive({
count: 0,
double: computed(() => state.count * 2)
});
function increment() {
state.count++
}
return {
count,
double,
increment
}
}
现在,计数器功能可以通过setup函数无缝引入到任意 Vue 组件中: MyComponent.vue
Composition 函数让功能模块化、可重用,是扩展组件最直接和低成本的方式。
Composition API 的缺点
Composition API 的缺点其实不算什么——可能就是看起来有点啰嗦,并且新的用法对一些 Vue 开发者来说有点陌生。
关于 Composition API 优缺点的讨论,推荐阅读:When To Use The New Vue Composition API (And When Not To)
mixin
如果你还在用 Vue 2,或者只是喜欢用配置对象的方式定义组件功能,可以用 mixin 模式。mixin 把公共逻辑和状态抽取到单独的对象,跟使用 mixin 的组件内部定义对象合并。
我们继续用之前的Counter 组件例子,把公共逻辑和状态放到CounterMixin.js 模块中。 CounterMixin.js
export default {
data: () => ({
count: 0
}),
methods: {
increment() {
this.count++;
}
},
computed: {
double () {
return this.count * 2;
}
}
}
使用 mixin 也很简单,只要导入对应模块并在mixins数组里加上变量就行。组件初始化时会把 mixin 对象与组件内部定义对象合并。 MyComponent.vue
import CounterMixin from "./CounterMixin";
export default {
mixins: [CounterMixin],
methods: {
decrement() {
this.count--;
}
}
}
选项合并
如果组件内的选项跟 mixin 冲突怎么办?
比如,给组件定义一个自带的increment方法,哪个优先级更高呢? MyComponent.vue
import CounterMixin from "./CounterMixin";
export default {
mixins: [CounterMixin],
methods: {
// 自带的 `increment`` 方法会覆盖 mixin 的`increment` 吗?
increment() { ... }
}
}
这个时候就要说到 Vue 的合并策略了。Vue 有一系列的规则,决定了如何处理同名选项。
通常,组件自带的选项会覆盖来自 mixin 的选项。但也有例外,比如同类型的生命周期钩子,不是直接覆盖,而是都放进数组,按顺序执行。
你也可以通过 自定义合并策略 改变默认行为。
mixin 的缺点
作为扩展组件的一种模式,mixin 对于简单的场景还算好用,一旦规模扩大,问题就来了。不仅需要注意命名冲突问题(尤其是第三方 mixin),使用了多个 mixin 的组件,很难搞清楚某个功能到底来自于哪里,定位问题也比较困难。
高阶组件
高阶组件(HOC)是从 React 借用的概念,Vue 也能使用。
为了理解这个概念,我们先抛开组件,看看两个简单的 JavaScript 函数,increment和 double。
function increment(x) {
return x++;
}
function double(x) {
return x * 2;
}
假设我们想给这两个函数都加一个功能:在控制台输出结果。
为此,我们可以用高阶函数 模式,新建一个addLogging函数,接受函数作为参数,并返回一个带有新增功能的函数。
function addLogging(fn) {
return function(x) {
const result = fn(x);
console.log("The result is: ", result);
return result;
};
}
const incrementWithLogging = addLogging(increment);
const doubleWithLogging = addLogging(double);
组件如何利用这种模式呢?类似地,我们创建一个高阶组件来渲染Counter 组件,同时添加一个decrement方法作为实例属性。
实际代码比较复杂,这里只给出伪代码作为示意:
import Counter from "./Counter";
// 伪代码
const CounterWithDecrement => ({
render(createElement) {
const options = {
decrement() {
this.count--;
}
}
return createElement(Counter, options);
}
});
HOC 模式比 mixin 更简洁,扩展性更好,但是代价是增加了一个包裹组件,实现起来也需要技巧。
无渲染组件
如果需要在多个组件上使用相同的逻辑和状态,只是展示方式不同,那么就可以考虑无渲染组件 模式。
该模式需要用到两类组件:逻辑 组件用于声明逻辑和状态,展示 组件用于展示数据。
逻辑组件
还是回到Counter 的例子,假设我们需要在多个地方重用这个组件,但是展示方式不同。
创建一个CounterRenderless.js用于定义逻辑组件,包含逻辑和状态,但是不包含模板,而是通过 render函数声明 scoped slot。
scoped slot暴露三个属性给父组件使用:状态count,方法increment 和计算属性 double。 CounterRenderless.js
export default {
data: () => ({
count: 0
}),
methods: {
increment() {
this.count++;
}
},
computed: {
double () {
return this.count * 2;
}
},
render() {
return this.$scopedSlots.default({
count: this.count,
double: this.double,
increment: this.toggleState,
})
}
}
这里的scoped slot是这种模式里逻辑组件的关键所在。
展示组件
接下来是展示组件 ,作为无渲染组件的使用方,提供具体的展示方式。
所有的元素标签都包含在scoped slot里。可以看到,这些属性在使用上跟模板直接放在逻辑组件里没什么两样。 CounterWithButton.vue
Count is: {{ count }}
Double is: {{ double }}
Increment
无渲染组件模式非常灵活,也容易理解。但是,它没有前面那几种方法那么通用,可能只有一种应用场景,那就是用于开发组件库。
模板扩展
上面的 API 也好,设计模式也罢,都有一种局限性,就是无法扩展组件的模板。Vue 在逻辑和状态方面有办法重用,但是对于模板标签就无能为力了。
有一种比较 hack 的方式,就是利用 HTML 预处理器,比如 Pug,来处理模板扩展。
第一步是创建一个基础模板.pug 文件,包含公共的页面元素。还要包含一个block input,作为模板扩展的占位符。
BaseTemplate.pug
div.wrapper
h3 {{ myCommonProp }}
block input
为了能扩展这个模板,需要安装 Vue Loader 的 Pug 插件。然后就可以引入基础模板并利用block input语法替换占位部分了: MyComponent.vue
extends BaseTemplate.pug
block input
h4 {{ myLocalProp }}
一开始你可能会认为它跟 slot 的概念是一样的,但是有个区别,这里的基础模板不属于任何单独的组件。它在编译时跟当前组件合并,而不是像 slot 那样是在运行时替换。
以上就是详解Vue组件复用和扩展之道的详细内容,更多关于Vue组件复用和扩展的资料请关注脚本之家其它相关文章!
你可能感兴趣的:(详解Vue组件复用和扩展之道)
ASL CS5261:高性能Type-C转HDMI转换芯片
自动驾驶人工智能
CS5261是集睿致远ASL推出的一款高度集成的USBType-C转HDMI音视频转换芯片,专为4K@30Hz高清投屏设计,广泛应用于转接线、扩展坞、投影仪等设备。其核心功能包括支持USBType-C显示端口替代模式(DPAltMode),实现音视频信号与5V慢充功能同步传输,满足多场景需求。ASLCS5261关键特性高清输出与兼容性:支持HDMI2.0b标准,最大分辨率达4K@30Hz(3840
【安装Linux on Windows with WSL】包括 VS Code 和 Git
灯火穿透了
linux windows git vscode
1.安装WSL环境打开PowerShell(或Windows命令提示符)并输入:wsl--install如果下载速度太慢,请连接到手机热点重试。安装完成后重启计算机。2.安装Linux本体再次在PowerShell(或Windows命令提示符)输入:wsl--install此时会安装下载并安装UbuntuLinux发行版(可能需要重新启动)。打开开始菜单上的企鹅头像的WSL,能打开就直接跳转到5.
YashanDB分布式部署
数据库
本文内容来自YashanDB官网,原文内容请见https://doc.yashandb.com/yashandb/23.3/zh/%E5%AE%89%E8%A3%85%...本文以典型规格(3台服务器,1个MN组、2个CN、1个DN组,DN组和MN组均为1主2备)为例,介绍分布式部署形态的安装步骤。执行安装部署前,请以安装用户(yashan)登录192.168.1.2服务器,并进入/home/ya
《如何建立知识图谱?这些资源和工具助你一臂之力》
知识图谱:解锁高效学习与成长的密码[]()在信息爆炸的时代,我们每天都会接触到海量的知识。从书本、网络文章到各类课程,知识的获取变得前所未有的容易。但你是否有过这样的困扰:学了很多知识,却感觉它们杂乱无章,在需要的时候无法快速调用?这时候,构建个人知识图谱就显得尤为重要。它就像一个私人知识管家,帮你将零散的知识整理得井井有条,让知识真正为你所用,助力你在学习和成长的道路上一路开挂。接下来,就让我们
Linux 日志处理
1:find1.find基本语法find[path][expression][path]:指定从哪个目录开始搜索(默认为当前目录)。[expression]:定义搜索条件和操作。它可以包含测试条件(如文件名模式)、动作(如删除文件)以及操作符(如AND和OR)示例:查找当前目录及其子目录下的所有.txt文件:find.-name"*.txt"2.常见使用场景及示例(1)按名称查找文件查找特定名称或
不止排名,Google SEO 10 大核心心得分享
后端
原博客:https://bysocket.com/seo-tips-2025/在过去的一年中,我深入实践了GoogleSEO,积累了自己一些经验和看法。以下是我的实操心得,希望对大家有所帮助。1.SEO的本质:理解用户需求,提供有价值的内容SEO不仅仅是关键词堆砌或大量发布内容,而是要真正理解用户的搜索意图,提供他们需要的信息。就像写一本持续更新的畅销书,内容要有吸引力、易于获取,并值得推荐。2.
基于opencv消除图片马赛克
小苗爸爸
opencv 人工智能 计算机视觉
以下是一个基于Python的图片马赛克消除函数实现,结合了图像处理和深度学习方法。由于马赛克消除涉及复杂的图像重建任务,建议根据实际需求选择合适的方法:importcv2importnumpyasnpfromPILimportImagedefremove_mosaic(image_path,output_path,method='traditional',block_size=10,scale_f
java 批量查询es_java操作ES的简单查询和bool查询
weixin_39831567
java 批量查询es
导入包org.elasticsearch.clienttransport5.2.2org.apache.logging.log4jlog4j-api2.7org.apache.logging.log4jlog4j-core2.7junitjunitRELEASEViewCode2.Java操作基本操作通过client客户端对象获得客户端然后通过preparIndex等方法传入index,type,
【Elasticsearch】数据管理(Data Management)
risc123456
Elasticsearch elasticsearch
Elasticsearch的数据管理(DataManagement)是其核心功能之一,旨在帮助用户高效地存储、维护和查询不同类型的数据,同时优化性能和成本。以下是结合原文内容对Elasticsearch数据管理的详细阐述:1.数据类型Elasticsearch中的数据主要分为两类:(1)内容(Content)•定义:这是用户希望进行搜索的项目集合,例如产品目录、用户信息等。•特点:•数据可能会频繁
2025年计算机毕业设计springboot 校园二手物品交易平台的设计与实现
基林计算机毕设程序
课程设计 spring boot 后端
本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容选题背景随着环保意识的增强和校园经济的蓬勃发展,校园二手物品交易逐渐成为大学生群体中的重要经济活动。当前,国内外对于二手物品交易的研究主要集中在电商平台的发展、交易模式的创新以及市场潜力的挖掘等方面。然而,专门针对校园二手物品交易平台的研究相对较少,尤其是结合大学生实际需求和行为特点的
创建ASCII数字打印机(OpenCV C++)
河边一只猫
opencv c++ cv
学习OpenCV3(中文版)LearningOpenCV3ComputerVisioninC++withtheOpenCVLibrary第四章练习1建立一个500×500大小的单通道图像,每个像素值都为0。a.创建一个ASCII数字打印机,你可以在自己电脑上输入数字,并在一个20像素高、10像素宽的方块中显示数字。当你键入时,数字将从左到右显示,直到到达图像的末尾才停止。b.允许键入回车和退格。c
Elasticsearch 学习
Anthonywish
java 后端 elasticsearch springdata 全文检索
内容摘要安装Elasticsearch使用Rest的API操作索引使用Rest的API查询数据使用Rest的API聚合数据SpringDataElasticsearch使用1.Elasticsearch介绍和安装用户访问我们的首页,一般都会直接搜索来寻找自己想要购买的商品。而商品的数量非常多,而且分类繁杂。如果能正确的显示出用户想要的商品,并进行合理的过滤,尽快促成交易,是搜索系统要研究的核心。面
部署Django+nginx+uwsgi到ubuntu服务器
Mr番茄蛋
问题解决 python Linux
前提:Django程序可以正常运行,注意服务器python版本和本地版本可能不一致,有可能不能正常运行Django程序。安装过程更新ubuntu的python比如更新到3.6,先拉取新的仓库,再更新安装sudoadd-apt-repositoryppa:jonathonf/python-3.6sudoaptupdatesudoaptinstallpython3.6创建虚拟环境安装虚拟环境命令sud
摘录及思考《被讨厌的勇气》
智阅人生
生活 交友 学习
生活给我们各种束缚,表面看起来,这些束缚是时间的、金钱的、人际关系的,但实际上,这些束缚是心灵的。第一个束缚,来自过去。从精神分析创始人弗洛伊德开始,许多心理学家都相信人是过去、尤其是童年经历的产物,这些经历变成了潜意识,决定着我们的人生。阿德勒却告诉我们,重要的不是过去,而是你怎么看待过去,而我们对过去的看法,是可以改变的。比如,和异性谈话会脸红,这是一种典型的社交焦虑,但阿德勒告诉我们,探讨这
【Qt入门】详解QCloseEvent、QFocusEvent、QShowEvent 和 QHideEvent事件
人才程序员
QT高级教程 qt 数据库 c++ 开发语言 c语言 面向对象 ui
文章目录前言QCloseEvent、QFocusEvent、QShowEvent和QHideEvent事件QCloseEvent作用重载函数常用成员函数QFocusEvent作用重载函数常用成员函数QShowEvent作用重载函数常用成员函数QHideEvent作用重载函数常用成员函数示例代码说明总结前言在图形用户界面(GUI)编程中,事件处理是一个核心部分。Qt作为一个强大的跨平台C++应用程序
YashanDB初始数据库
数据库
本文内容来自YashanDB官网,原文内容请见https://doc.yashandb.com/yashandb/23.3/zh/%E5%AE%89%E8%A3%85%...YashanDB产品安装创建的初始数据库信息如下:监听端口:如未在安装过程中进行调整,则默认为1688。用户:安装过程创建了sales样例用户,密码为sales,用于YashanDB的学习和验证;除此之外系统中无任何普通用户。
设计模式:工厂方法模式(Factory Method)
java
1.什么是工厂方法模式?工厂方法模式是一种创建型设计模式,其核心思想是将对象的创建过程延迟到子类,让子类决定实例化哪个具体类。核心目标:解耦对象的创建逻辑与使用逻辑,提升代码的灵活性和扩展性。关键角色:抽象产品(Product):定义产品的接口。具体产品(ConcreteProduct):实现抽象产品的具体类。抽象工厂(Creator):声明工厂方法(createProduct()),返回抽象产品
从MIXED模式到主从一致性:深入解析Binlog格式的智能切换机制
引言:Binlog的核心价值与格式选择难题在MySQL的数据库生态中,Binlog(二进制日志)是数据复制、增量备份和灾难恢复的核心组件。其记录格式(STATEMENT、ROW、MIXED)直接决定了主从同步的行为逻辑。其中,MIXED模式的设计初衷是为了在“可读性”和“数据一致性”之间寻找平衡,但它的动态切换机制常常成为开发者困惑的源头。本文将通过实际场景分析,结合MySQL内核逻辑,揭示MIX
qt.network.ssl: QSslSocket: cannot call unresolved function 问题解决
清海风缘
Qt qt.network.ssl
转:Qt5.4.2实现一个简单的浏览器及相关问题的解决首先,介绍一下我使用的Qt版本:QtCreator3.4.1(opensource)BasedonQt5.4.2(MSVC2013,32bit)BuiltonMay28201519:07:19运行平台为Windows。至于linux平台,以后再说吧。主要使用的是Qt中的QtWebKit和QWebView。这里Qt5做了相应的调整,可视化的QWe
CES Asia 2025:聚焦前沿科技,探索未来无限可能
赛逸展张胜
科技
CESAsia2025第七届亚洲消费电子技术贸易展(赛逸展)正如火如荼地进行,展会聚焦前沿科技,四大展区从不同维度探索未来发展的无限可能,吸引了全球科技爱好者和行业人士的目光。智慧健康与未来生活展区,以人的生活与健康为核心,全方位展示科技带来的变革。在未来办公与教育板块,智能会议系统打破了地域限制,高清视频、实时翻译等功能让跨国协作变得轻松高效;虚拟办公空间通过虚拟现实技术,为远程办公人员打造了沉
【AI深度学习基础】Pandas完全指南入门篇:数据处理的瑞士军刀 (含完整代码)
arbboter
人工智能 人工智能 深度学习 pandas 数据处理 数据分析 数据清洗 数据分析效率提升
Pandas系列文章导航入门篇进阶篇终极篇一、引言在大数据与AI驱动的时代,数据预处理和分析是深度学习与机器学习的基石。Pandas作为Python生态中最强大的数据处理库,以其灵活的数据结构(如DataFrame和Series)和丰富的功能(数据清洗、转换、聚合等),成为数据科学家和工程师的核心工具。Pandas以Series(一维标签数组)和DataFrame(二维表格)为核心数据结构,提供高
什么是情绪分析?基本指南
沃丰科技
人工智能 科技 科技 语音识别 人工智能 自然语言处理
情感分析用于了解文本中的观点、情感和态度。情绪分析也称为情绪分类或观点挖掘,允许您通过提取特定单词或短语来确定内容是正面、消极还是中性。情绪分析的主要目的是分析公众对某些产品、事件、人或想法的看法。过去几年来,该领域取得了重大进展,这主要是由于用户生成的情绪分析数据空前增长。它现在有无数的应用,为大企业、政治、心理学和社会学提供见解。本基本指南旨在概述情绪分析:基本面、各种类型的情绪分类、工作原理
怎么做好备件管理?备件管理系统都包括哪些功能模块?
沃丰科技
低代码 人工智能 系统架构
数字化转型成为大趋势,在全球供应链面临挑战的背景下,备件仓储、备件管理的数字化升级对企业、对行业有着至关重要的意义。如何借助售后服务系统,加强整个备件管理链条清晰程度,沉淀管理数据,通过数据挖掘明确备件的损坏规律,对未来设备管理流程进行优化成为各大企业的关注点。进一步来说,备件是设备修理的主要物质基础,做好备件管理,及时供应备件,可以缩短修理时间、减少损失,供应质量优良的备件,可以保证修理质量和修
沃丰科技AI浅谈|语音交互的三驾马车:ASR、NLP、TTS
沃丰科技
人工智能 科技 自然语言处理
在日常生活中,AI机器人离我们很近。你是否接到过这样的电话:“您好,检测到您已经购买某产品一周的时间了,请问您的使用感受如何?”“请问您对产品满意吗?有什么建议给到这边吗?”全程对话亲切无障碍,您可能觉得这是一个大型企业对于用户的恳切关注。如果我告诉您,这都是由外呼机器人拨打并且能够自行记录下您的意见和建议,以供企业改进,您会惊讶吗?基于深度神经学算法和卷积神经网络算法的AI外呼机器人,它是融合自
海思视觉Hi3516CV610运行sample
pride.li
海思视觉 linux 视觉检测
使用前先提前,请使用nfs将开发板和ubuntu进行共享,共享目录为nfs编译samplecdHi3516CV610_SDK_V1.0.1.0/smp/a7_linux/source/mpp/sample/vencmakeallcp sample_vencnfsnfs:ubuntu和开发板共享的目录移植ko如果需要重新编译kocdHi3516CV610_SDK_V1.0.1.0/smp/a7_li
C语言的输入输出的方式 :scanf()&printf() 和 getchar()&putchar()和 gets()&puts() 基本用法
阿拉保
c语言 算法 开发语言
(一)scanf()&printf()C语言的输入输出通常使用scanf()、printf()函数scanf()函数用于从标准输入(键盘)读取并格式化,printf()函数发送格式化输出到标准输出(屏幕)。使用printf()函数打印时需要引用头文件,并加上#incldue的预处理命令例:#includeintmain(){intinput;//输入scanf("%d",&input);//输出p
JUC模块
C18298182575
java
JUC(JavaUtilConcurrent)是Java标准库中用于支持并发编程的模块,提供了丰富的工具类和框架,帮助开发者编写高效、线程安全的并发程序。JUC模块自Java5引入,是Java并发编程的核心部分。1.JUC的核心组件1.1原子类(AtomicClasses)作用:提供原子操作,避免使用锁的情况下实现线程安全。常见类:AtomicInteger:原子操作的整数。AtomicLong:
汽车扶手屏里的FPC应用有哪些?【新立电子】
珠海新立电子FPC
FPC柔性线路板 汽车扶手屏幕 车载系统
汽车扶手屏作为现代汽车内饰设计的一大亮点,通常被安装在座椅扶手位置,其设计初衷是为了方便乘客在乘车过程中进行各种操作和控制。屏幕不仅具备触控功能,还支持语音控制、手势识别等多种交互方式,使得乘客可以更加轻松、直观地操作车内的各种设备和功能。从功能上来看,汽车扶手屏的应用范围非常广泛。它可以作为多媒体娱乐系统的控制中心,可以在屏幕上选择并播放音乐、视频等多媒体内容。还可以作为导航系统的显示屏,提供清
【新立电子】FPC技术揭秘:智能AI眼镜如何实现毫秒级响应?
珠海新立电子FPC
人工智能 AI眼镜 fpc柔性线路板 新立电子
在科技飞速发展的今天,智能AI眼镜正逐渐成为智能穿戴领域的“新宠”。2025年,随着AI技术的不断突破和FPC技术的深度应用,智能AI眼镜有望实现毫秒级响应,开启一场全新的交互革命。FPC技术,是一种轻薄、可弯曲的电路板解决方案,能够完美适配智能眼镜的紧凑设计。FPC技术的核心优势在于其灵活性和高效性,能够将复杂的电子元件和传感器集成到极小的空间中,同时保持高性能。在智能AI眼镜中,FPC技术的应
【新立电子】FPC柔性线路板的应用领域
珠海新立电子FPC
科技 制造
FPC(FlexiblePrintedCircuit,柔性印刷电路板)因其独特的柔韧性、轻薄性、高密度布线能力和优良的电气性能,被广泛应用于多个领域。以下是FPC的主要应用范围:1、移动设备:智能手机:FPC板用于连接显示屏、触摸屏、摄像头模块、按键、电池、传感器等组件,实现内部紧凑、轻薄的布局。平板电脑、笔记本电脑、二合一设备:在折叠屏、铰链结构、触控笔接口、内部连接等方面使用FPC板,增强设备
java解析APK
3213213333332132
java apk linux 解析APK
解析apk有两种方法
1、结合安卓提供apktool工具,用java执行cmd解析命令获取apk信息
2、利用相关jar包里的集成方法解析apk
这里只给出第二种方法,因为第一种方法在linux服务器下会出现不在控制范围之内的结果。
public class ApkUtil
{
/**
* 日志对象
*/
private static Logger
nginx自定义ip访问N种方法
ronin47
nginx 禁止ip访问
因业务需要,禁止一部分内网访问接口, 由于前端架了F5,直接用deny或allow是不行的,这是因为直接获取的前端F5的地址。
所以开始思考有哪些主案可以实现这样的需求,目前可实施的是三种:
一:把ip段放在redis里,写一段lua
二:利用geo传递变量,写一段
mysql timestamp类型字段的CURRENT_TIMESTAMP与ON UPDATE CURRENT_TIMESTAMP属性
dcj3sjt126com
mysql
timestamp有两个属性,分别是CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP两种,使用情况分别如下:
1.
CURRENT_TIMESTAMP
当要向数据库执行insert操作时,如果有个timestamp字段属性设为
CURRENT_TIMESTAMP,则无论这
struts2+spring+hibernate分页显示
171815164
Hibernate
分页显示一直是web开发中一大烦琐的难题,传统的网页设计只在一个JSP或者ASP页面中书写所有关于数据库操作的代码,那样做分页可能简单一点,但当把网站分层开发后,分页就比较困难了,下面是我做Spring+Hibernate+Struts2项目时设计的分页代码,与大家分享交流。
1、DAO层接口的设计,在MemberDao接口中定义了如下两个方法:
public in
构建自己的Wrapper应用
g21121
rap
我们已经了解Wrapper的目录结构,下面可是正式利用Wrapper来包装我们自己的应用,这里假设Wrapper的安装目录为:/usr/local/wrapper。
首先,创建项目应用
&nb
[简单]工作记录_多线程相关
53873039oycg
多线程
最近遇到多线程的问题,原来使用异步请求多个接口(n*3次请求) 方案一 使用多线程一次返回数据,最开始是使用5个线程,一个线程顺序请求3个接口,超时终止返回 缺点 测试发现必须3个接
调试jdk中的源码,查看jdk局部变量
程序员是怎么炼成的
jdk 源码
转自:http://www.douban.com/note/211369821/
学习jdk源码时使用--
学习java最好的办法就是看jdk源代码,面对浩瀚的jdk(光源码就有40M多,比一个大型网站的源码都多)从何入手呢,要是能单步调试跟进到jdk源码里并且能查看其中的局部变量最好了。
可惜的是sun提供的jdk并不能查看运行中的局部变量
Oracle RAC Failover 详解
aijuans
oracle
Oracle RAC 同时具备HA(High Availiablity) 和LB(LoadBalance). 而其高可用性的基础就是Failover(故障转移). 它指集群中任何一个节点的故障都不会影响用户的使用,连接到故障节点的用户会被自动转移到健康节点,从用户感受而言, 是感觉不到这种切换。
Oracle 10g RAC 的Failover 可以分为3种:
1. Client-Si
form表单提交数据编码方式及tomcat的接受编码方式
antonyup_2006
JavaScript tomcat 浏览器 互联网 servlet
原帖地址:http://www.iteye.com/topic/266705
form有2中方法把数据提交给服务器,get和post,分别说下吧。
(一)get提交
1.首先说下客户端(浏览器)的form表单用get方法是如何将数据编码后提交给服务器端的吧。
对于get方法来说,都是把数据串联在请求的url后面作为参数,如:http://localhost:
JS初学者必知的基础
百合不是茶
js函数 js入门基础
JavaScript是网页的交互语言,实现网页的各种效果,
JavaScript 是世界上最流行的脚本语言。
JavaScript 是属于 web 的语言,它适用于 PC、笔记本电脑、平板电脑和移动电话。
JavaScript 被设计为向 HTML 页面增加交互性。
许多 HTML 开发者都不是程序员,但是 JavaScript 却拥有非常简单的语法。几乎每个人都有能力将小的
iBatis的分页分析与详解
bijian1013
java ibatis
分页是操作数据库型系统常遇到的问题。分页实现方法很多,但效率的差异就很大了。iBatis是通过什么方式来实现这个分页的了。查看它的实现部分,发现返回的PaginatedList实际上是个接口,实现这个接口的是PaginatedDataList类的对象,查看PaginatedDataList类发现,每次翻页的时候最
精通Oracle10编程SQL(15)使用对象类型
bijian1013
oracle 数据库 plsql
/*
*使用对象类型
*/
--建立和使用简单对象类型
--对象类型包括对象类型规范和对象类型体两部分。
--建立和使用不包含任何方法的对象类型
CREATE OR REPLACE TYPE person_typ1 as OBJECT(
name varchar2(10),gender varchar2(4),birthdate date
);
drop type p
【Linux命令二】文本处理命令awk
bit1129
linux命令
awk是Linux用来进行文本处理的命令,在日常工作中,广泛应用于日志分析。awk是一门解释型编程语言,包含变量,数组,循环控制结构,条件控制结构等。它的语法采用类C语言的语法。
awk命令用来做什么?
1.awk适用于具有一定结构的文本行,对其中的列进行提取信息
2.awk可以把当前正在处理的文本行提交给Linux的其它命令处理,然后把直接结构返回给awk
3.awk实际工
JAVA(ssh2框架)+Flex实现权限控制方案分析
白糖_
java
目前项目使用的是Struts2+Hibernate+Spring的架构模式,目前已经有一套针对SSH2的权限系统,运行良好。但是项目有了新需求:在目前系统的基础上使用Flex逐步取代JSP,在取代JSP过程中可能存在Flex与JSP并存的情况,所以权限系统需要进行修改。
【SSH2权限系统的实现机制】
权限控制分为页面和后台两块:不同类型用户的帐号分配的访问权限是不同的,用户使
angular.forEach
boyitech
AngularJS AngularJS API angular.forEach
angular.forEach 描述: 循环对obj对象的每个元素调用iterator, obj对象可以是一个Object或一个Array. Iterator函数调用方法: iterator(value, key, obj), 其中obj是被迭代对象,key是obj的property key或者是数组的index,value就是相应的值啦. (此函数不能够迭代继承的属性.)
java-谷歌面试题-给定一个排序数组,如何构造一个二叉排序树
bylijinnan
二叉排序树
import java.util.LinkedList;
public class CreateBSTfromSortedArray {
/**
* 题目:给定一个排序数组,如何构造一个二叉排序树
* 递归
*/
public static void main(String[] args) {
int[] data = { 1, 2, 3, 4,
action执行2次
Chen.H
JavaScript jsp XHTML css Webwork
xwork 写道 <action name="userTypeAction"
class="com.ekangcount.website.system.view.action.UserTypeAction">
<result name="ssss" type="dispatcher">
[时空与能量]逆转时空需要消耗大量能源
comsci
能源
无论如何,人类始终都想摆脱时间和空间的限制....但是受到质量与能量关系的限制,我们人类在目前和今后很长一段时间内,都无法获得大量廉价的能源来进行时空跨越.....
在进行时空穿梭的实验中,消耗超大规模的能源是必然
oracle的正则表达式(regular expression)详细介绍
daizj
oracle 正则表达式
正则表达式是很多编程语言中都有的。可惜oracle8i、oracle9i中一直迟迟不肯加入,好在oracle10g中终于增加了期盼已久的正则表达式功能。你可以在oracle10g中使用正则表达式肆意地匹配你想匹配的任何字符串了。
正则表达式中常用到的元数据(metacharacter)如下:
^ 匹配字符串的开头位置。
$ 匹配支付传的结尾位置。
*
报表工具与报表性能的关系
datamachine
报表工具 birt 报表性能 润乾报表
在选择报表工具时,性能一直是用户关心的指标,但是,报表工具的性能和整个报表系统的性能有多大关系呢?
要回答这个问题,首先要分析一下报表的处理过程包含哪些环节,哪些环节容易出现性能瓶颈,如何优化这些环节。
一、报表处理的一般过程分析
1、用户选择报表输入参数后,报表引擎会根据报表模板和输入参数来解析报表,并将数据计算和读取请求以SQL的方式发送给数据库。
2、
初一上学期难记忆单词背诵第一课
dcj3sjt126com
word english
what 什么
your 你
name 名字
my 我的
am 是
one 一
two 二
three 三
four 四
five 五
class 班级,课
six 六
seven 七
eight 八
nince 九
ten 十
zero 零
how 怎样
old 老的
eleven 十一
twelve 十二
thirteen
我学过和准备学的各种技术
dcj3sjt126com
技术
语言VB https://msdn.microsoft.com/zh-cn/library/2x7h1hfk.aspxJava http://docs.oracle.com/javase/8/C# https://msdn.microsoft.com/library/vstudioPHP http://php.net/manual/en/Html
struts2中token防止重复提交表单
蕃薯耀
重复提交表单 struts2中token
struts2中token防止重复提交表单
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
蕃薯耀 2015年7月12日 11:52:32 星期日
ht
线性查找二维数组
hao3100590
二维数组
1.算法描述
有序(行有序,列有序,且每行从左至右递增,列从上至下递增)二维数组查找,要求复杂度O(n)
2.使用到的相关知识:
结构体定义和使用,二维数组传递(http://blog.csdn.net/yzhhmhm/article/details/2045816)
3.使用数组名传递
这个的不便之处很明显,一旦确定就是不能设置列值
//使
spring security 3中推荐使用BCrypt算法加密密码
jackyrong
Spring Security
spring security 3中推荐使用BCrypt算法加密密码了,以前使用的是md5,
Md5PasswordEncoder 和 ShaPasswordEncoder,现在不推荐了,推荐用bcrpt
Bcrpt中的salt可以是随机的,比如:
int i = 0;
while (i < 10) {
String password = "1234
学习编程并不难,做到以下几点即可!
lampcy
java html 编程语言
不论你是想自己设计游戏,还是开发iPhone或安卓手机上的应用,还是仅仅为了娱乐,学习编程语言都是一条必经之路。编程语言种类繁多,用途各 异,然而一旦掌握其中之一,其他的也就迎刃而解。作为初学者,你可能要先从Java或HTML开始学,一旦掌握了一门编程语言,你就发挥无穷的想象,开发 各种神奇的软件啦。
1、确定目标
学习编程语言既充满乐趣,又充满挑战。有些花费多年时间学习一门编程语言的大学生到
架构师之mysql----------------用group+inner join,left join ,right join 查重复数据(替代in)
nannan408
right join
1.前言。
如题。
2.代码
(1)单表查重复数据,根据a分组
SELECT m.a,m.b, INNER JOIN (select a,b,COUNT(*) AS rank FROM test.`A` A GROUP BY a HAVING rank>1 )k ON m.a=k.a
(2)多表查询 ,
使用改为le
jQuery选择器小结 VS 节点查找(附css的一些东西)
Everyday都不同
jquery css name选择器 追加元素 查找节点
最近做前端页面,频繁用到一些jQuery的选择器,所以特意来总结一下:
测试页面:
<html>
<head>
<script src="jquery-1.7.2.min.js"></script>
<script>
/*$(function() {
$(documen
关于EXT
tntxia
ext
ExtJS是一个很不错的Ajax框架,可以用来开发带有华丽外观的富客户端应用,使得我们的b/s应用更加具有活力及生命力。ExtJS是一个用 javascript编写,与后台技术无关的前端ajax框架。因此,可以把ExtJS用在.Net、Java、Php等各种开发语言开发的应用中。
ExtJs最开始基于YUI技术,由开发人员Jack
一个MIT计算机博士对数学的思考
xjnine
Math
在过去的一年中,我一直在数学的海洋中游荡,research进展不多,对于数学世界的阅历算是有了一些长进。为什么要深入数学的世界?作为计算机的学生,我没有任何企图要成为一个数学家。我学习数学的目的,是要想爬上巨人的肩膀,希望站在更高的高度,能把我自己研究的东西看得更深广一些。说起来,我在刚来这个学校的时候,并没有预料到我将会有一个深入数学的旅程。我的导师最初希望我去做的题目,是对appe