From cb86cba389844cdae871b1bf393bfe1157c3792c Mon Sep 17 00:00:00 2001
From: ZF sun <34314687@qq.com>
Date: Mon, 26 Jan 2026 18:17:06 +0800
Subject: [PATCH] =?UTF-8?q?feat(components):=20=E6=96=B0=E5=A2=9E=E5=8F=AF?=
=?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E7=9A=84diy-tab=E7=BB=84=E4=BB=B6?=
=?UTF-8?q?=EF=BC=8C=E6=94=AF=E6=8C=81=E5=A4=9A=E7=A7=8D=E6=A0=B7=E5=BC=8F?=
=?UTF-8?q?=E5=92=8C=E5=B8=83=E5=B1=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
添加一个高度可配置的tab组件,支持顶部、底部、左侧、右侧四种布局方式
提供默认、下划线和卡片三种tab样式,支持自定义颜色、间距、指示器等样式
组件包含导航栏和内容区域,支持动态切换和动画效果
- 添加自定义样式配置功能,允许通过 customStyles 完全覆盖组件样式
- 重构代码结构,使用计算属性合并默认值和传入值
- 优化样式处理逻辑,增加 mixin 复用
- 完善注释和文档说明
- 改进响应式动画效果
- 新增 getTabTitle 方法,支持根据当前语言环境显示对应的标签标题。该方法处理对象形式的标题(按语言键值匹配)和字符串形式的标题(支持国际化键翻译),提升组件的多语言适配能力。
---
common/js/golbalConfig.js | 2 +-
common/js/lang.js | 30 +-
components-diy/diy-group.vue | 12 +
components-diy/diy-tab.vue | 803 +++++++++++++++++++++++++++++
components/hover-nav/hover-nav.vue | 2 +-
5 files changed, 837 insertions(+), 12 deletions(-)
create mode 100644 components-diy/diy-tab.vue
diff --git a/common/js/golbalConfig.js b/common/js/golbalConfig.js
index d412a07..c38a69f 100644
--- a/common/js/golbalConfig.js
+++ b/common/js/golbalConfig.js
@@ -7,7 +7,7 @@ export default {
computed: {
// 是否是英文环境
isEnEnv() {
- return uni.getStorageSync('lang') === 'en-us';
+ return this.$langConfig.getCurrentLocale() === 'en-us';
},
themeStyle() {
return this.$store.state.themeStyle;
diff --git a/common/js/lang.js b/common/js/lang.js
index c8ca741..e62032a 100644
--- a/common/js/lang.js
+++ b/common/js/lang.js
@@ -56,15 +56,24 @@ function loadLangPackSync(lang, path) {
export default {
langList: langConfig.langList,
+
+ /**
+ * 获得当前本地语言
+ * @returns
+ */
+ getCurrentLocale() {
+ return uni.getStorageSync('lang') || "zh-cn";
+ },
+
/**
* * 解析多语言
* @param {Object} field
*/
lang(field) {
- let _this = getCurrentPages()[getCurrentPages().length - 1];
- if (!_this) return;
+ let _page = getCurrentPages()[getCurrentPages().length - 1];
+ if (!_page) return;
- const locale = uni.getStorageSync('lang') || "zh-cn"; //设置语言
+ const locale = this.getCurrentLocale(); // 获得当前本地语言
let value = ''; // 存放解析后的语言值
let langPath = ''; // 存放当前页面语言包路径
@@ -74,7 +83,7 @@ export default {
var lang = loadLangPackSync(locale, 'common');
//当前页面语言包(同步加载)
- let route = _this.route;
+ let route = _page.route;
langPath = processRoutePath(route);
// 加载当前页面语言包
@@ -128,11 +137,11 @@ export default {
* @param {String} url 切换后跳转的页面url
*/
change(value, url = '/pages_tool/member/index') {
- let _this = getCurrentPages()[getCurrentPages().length - 1];
- if (!_this) return;
+ let _page = getCurrentPages()[getCurrentPages().length - 1];
+ if (!_page) return;
uni.setStorageSync("lang", value);
- const locale = uni.getStorageSync('lang') || "zh-cn"; //设置语言
+ const locale = this.getCurrentLocale();
// 清空已加载的语言包缓存
for (let key in loadedLangPacks) {
@@ -149,9 +158,10 @@ export default {
},
//刷新标题、tabbar
refresh() {
- let _this = getCurrentPages()[getCurrentPages().length - 1];
- if (!_this) return;
- const locale = uni.getStorageSync('lang') || "zh-cn"; //设置语言
+ let _page = getCurrentPages()[getCurrentPages().length - 1];
+ if (!_page) return;
+
+ const locale = this.getCurrentLocale();
this.title(this.lang("title"));
diff --git a/components-diy/diy-group.vue b/components-diy/diy-group.vue
index 6de5241..8149d33 100644
--- a/components-diy/diy-group.vue
+++ b/components-diy/diy-group.vue
@@ -251,6 +251,11 @@
+
+
+
+
+
@@ -267,6 +272,7 @@
import DiyMinx from './minx.js'
export default {
+ name: 'diy-group',
props: {
diyData: {
type: Object
@@ -346,6 +352,12 @@ export default {
}
});
} else data = this.setPagestyle;
+
+ console.log(`diy-group ['diyDataArray'] = `, {
+ data: data,
+ diyData: this.diyData,
+ diyGlobalData: this.diyGlobalData,
+ })
return data;
}
},
diff --git a/components-diy/diy-tab.vue b/components-diy/diy-tab.vue
new file mode 100644
index 0000000..1c85707
--- /dev/null
+++ b/components-diy/diy-tab.vue
@@ -0,0 +1,803 @@
+
+
+
+
+
+
+
+
+ {{
+ getTabTitle(tab.title) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/hover-nav/hover-nav.vue b/components/hover-nav/hover-nav.vue
index ab51db7..9548ad3 100644
--- a/components/hover-nav/hover-nav.vue
+++ b/components/hover-nav/hover-nav.vue
@@ -119,7 +119,7 @@ export default {
for (let i = 0; i < this.langList.length; i++) {
this.langIndexMap[i] = this.langList[i].value;
}
- const savedLang = uni.getStorageSync('lang');
+ const savedLang = this.$langConfig.getCurrentLocale();
if (savedLang) {
for (let i = 0; i < this.langList.length; i++) {
if (this.langList[i].value === savedLang) {