diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 00000000..258a58e9
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,13 @@
+[*]
+#缩进风格:空格
+indent_style = space
+#缩进大小2
+indent_size = 4
+#换行符lf
+end_of_line = lf
+#字符集utf-8
+charset = utf-8
+#是否删除行尾的空格
+trim_trailing_whitespace = true
+
+
diff --git a/common/demo.scss b/common/demo.scss
index 2058df20..9c91b536 100644
--- a/common/demo.scss
+++ b/common/demo.scss
@@ -1,3 +1,9 @@
+/* #ifndef APP-NVUE */
+view,
+text {
+ box-sizing: border-box;
+}
+/* #endif */
/* start--演示页面使用的统一样式--start */
.u-demo {
diff --git a/manifest.json b/manifest.json
index e370b68e..d790005e 100644
--- a/manifest.json
+++ b/manifest.json
@@ -2,7 +2,7 @@
"name" : "uView",
"appid" : "__UNI__60F4B81",
"description" : "多平台快速开发的UI框架",
- "versionName" : "1.3.8",
+ "versionName" : "1.4.0",
"versionCode" : "100",
"transformPx" : false,
"app-plus" : {
diff --git a/pages.json b/pages.json
index 9a005edb..b549d557 100644
--- a/pages.json
+++ b/pages.json
@@ -2,14 +2,14 @@
"easycom": {
"^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue"
},
- // "condition": { //模式配置,仅开发期间生效
- // "current": 0, //当前激活的模式(list 的索引项)
- // "list": [{
- // "name": "test", //模式名称
- // "path": "pages/componentsC/test/index", //启动页面,必选
- // "query": "id=1&name=2" //启动参数,在页面的onLoad函数里面得到
- // }]
- // },
+ "condition": { //模式配置,仅开发期间生效
+ "current": 0, //当前激活的模式(list 的索引项)
+ "list": [{
+ "name": "test", //模式名称
+ "path": "pages/componentsC/test/index", //启动页面,必选
+ "query": "id=1&name=2" //启动参数,在页面的onLoad函数里面得到
+ }]
+ },
"pages": [
// 演示-组件
{
@@ -656,6 +656,13 @@
"navigationBarTitleText": "line-线条"
}
},
+ // image-图片
+ {
+ "path": "image/index",
+ "style": {
+ "navigationBarTitleText": "image-图片"
+ }
+ },
// card-卡片
{
"path": "card/index",
diff --git a/pages/componentsA/field/index.vue b/pages/componentsA/field/index.vue
index 567d301e..33781e8b 100644
--- a/pages/componentsA/field/index.vue
+++ b/pages/componentsA/field/index.vue
@@ -3,27 +3,25 @@
演示效果
-
-
-
-
- 发送验证码
-
-
+
+
+
+ 发送验证码
+
diff --git a/pages/componentsA/icon/index.vue b/pages/componentsA/icon/index.vue
index d8df15a1..e3c2c4ca 100644
--- a/pages/componentsA/icon/index.vue
+++ b/pages/componentsA/icon/index.vue
@@ -628,7 +628,6 @@
flex: 0 0 33.33333333%;
justify-content: center;
overflow: hidden;
- padding: 0 6rpx;
}
.u-icon-name {
diff --git a/pages/componentsA/tag/index.vue b/pages/componentsA/tag/index.vue
index 276e501c..d23b90f5 100644
--- a/pages/componentsA/tag/index.vue
+++ b/pages/componentsA/tag/index.vue
@@ -4,14 +4,11 @@
演示效果
-
+
-
- 参数配置
-
+ 参数配置
模式选择
@@ -41,53 +38,54 @@
\ No newline at end of file
+.u-demo {
+}
+
diff --git a/pages/componentsA/test/index.vue b/pages/componentsA/test/index.vue
index 620766b2..07486790 100644
--- a/pages/componentsA/test/index.vue
+++ b/pages/componentsA/test/index.vue
@@ -1,236 +1,90 @@
-
-
-
-
-
-
-
- {{ tabs[index].name }}
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{item1.title}}
-
- {{item1.typename}}
- {{item1.time*1000 | date}}
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
-
-
diff --git a/pages/componentsB/image/index.vue b/pages/componentsB/image/index.vue
new file mode 100644
index 00000000..ccaecf69
--- /dev/null
+++ b/pages/componentsB/image/index.vue
@@ -0,0 +1,93 @@
+
+
+
+ 演示效果
+
+
+
+ 加载失败
+
+
+
+
+ 参数配置
+
+ 状态
+
+
+
+ 加载中状态
+
+
+
+ 加载失败状态
+
+
+
+ 形状
+
+
+
+
+
+
+
+
+
diff --git a/pages/componentsC/button/index.vue b/pages/componentsC/button/index.vue
index d0fd88cb..52c08015 100644
--- a/pages/componentsC/button/index.vue
+++ b/pages/componentsC/button/index.vue
@@ -3,7 +3,7 @@
演示效果
- 山川异域,风月同天
+ 山川异域,风月同天
diff --git a/pages/componentsC/cell/index.vue b/pages/componentsC/cell/index.vue
index 25ba55ad..3f6cf213 100644
--- a/pages/componentsC/cell/index.vue
+++ b/pages/componentsC/cell/index.vue
@@ -12,7 +12,7 @@
-
+
diff --git a/pages/componentsC/test/index.vue b/pages/componentsC/test/index.vue
index e69de29b..3889eb73 100644
--- a/pages/componentsC/test/index.vue
+++ b/pages/componentsC/test/index.vue
@@ -0,0 +1,41 @@
+
+
+
+
+ 出淤泥而不染,濯清涟而不妖
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/example/components.config.js b/pages/example/components.config.js
index 3085e36d..e05e1efd 100644
--- a/pages/example/components.config.js
+++ b/pages/example/components.config.js
@@ -8,6 +8,10 @@ export default [{
path: '/pages/componentsA/icon/index',
icon: 'icon',
title: 'Icon 图标',
+ },{
+ path: '/pages/componentsB/image/index',
+ icon: 'image',
+ title: 'Image 图片',
}, {
path: '/pages/componentsC/button/index',
icon: 'button',
diff --git a/uview-ui/components/u-button/u-button.vue b/uview-ui/components/u-button/u-button.vue
index 84ba9bbe..8d7d78fb 100644
--- a/uview-ui/components/u-button/u-button.vue
+++ b/uview-ui/components/u-button/u-button.vue
@@ -33,7 +33,6 @@
@tap.stop="click($event)"
:hover-class="getHoverClass"
:loading="loading"
- data-name="dataName"
>
diff --git a/uview-ui/components/u-cell-item/u-cell-item.vue b/uview-ui/components/u-cell-item/u-cell-item.vue
index 1ac0513e..e12dbcc1 100644
--- a/uview-ui/components/u-cell-item/u-cell-item.vue
+++ b/uview-ui/components/u-cell-item/u-cell-item.vue
@@ -2,14 +2,14 @@
-
+
@@ -49,12 +49,14 @@
* @tutorial https://www.uviewui.com/components/cell.html
* @property {String} title 左侧标题
* @property {String} icon 左侧图标名,只支持uView内置图标,见Icon 图标
+ * @property {Object} icon-style 左边图标的样式,对象形式
* @property {String} value 右侧内容
* @property {String} label 标题下方的描述信息
- * @property {Boolean} border-bottom 是否显示每个cell的下边框(默认true)
+ * @property {Boolean} border-bottom 是否显示cell的下边框(默认true)
+ * @property {Boolean} border-top 是否显示cell的上边框(默认false)
* @property {Boolean} center 是否使内容垂直居中(默认false)
* @property {String} hover-class 是否开启点击反馈,none为无效果(默认true)
- * @property {Boolean} border-gap border-bottom为true时,Cell列表中间的条目的下边框是否与左边有一个间隔(默认true)
+ * // @property {Boolean} border-gap border-bottom为true时,Cell列表中间的条目的下边框是否与左边有一个间隔(默认true)
* @property {Boolean} arrow 是否显示右侧箭头(默认true)
* @property {Boolean} required 箭头方向,可选值(默认right)
* @property {Boolean} arrow-direction 是否显示左边表示必填的星号(默认false)
@@ -89,16 +91,22 @@ export default {
type: [String, Number],
default: ''
},
- // 是否显示内边框
+ // 是否显示下边框
borderBottom: {
type: Boolean,
default: true
},
- // 多个cell中,中间的cell显示下划线时,下划线是否给一个到左边的距离
- borderGap: {
+ // 是否显示上边框
+ borderTop: {
type: Boolean,
- default: true
+ default: false
},
+ // 多个cell中,中间的cell显示下划线时,下划线是否给一个到左边的距离
+ // 1.4.0版本废除此参数,默认边框由border-top和border-bottom提供,此参数会造成干扰
+ // borderGap: {
+ // type: Boolean,
+ // default: true
+ // },
// 是否开启点击反馈,即点击时cell背景为灰色,none为无效果
hoverClass: {
type: String,
@@ -169,26 +177,20 @@ export default {
iconSize: {
type: [Number, String],
default: 34
- }
- },
- inject: {
- uCellGroup: {
- // 添加默认值,是为了能让u-cell-item组件无需u-cell-group组件嵌套亦可单独使用
+ },
+ // 左边图标的样式,对象形式
+ iconStyle: {
+ type: Object,
default() {
- return {
- index: 0
- }
+ return {}
}
- }
+ },
},
data() {
return {
- itemIndex: 0
+
};
},
- created() {
- this.itemIndex = this.uCellGroup.index++;
- },
computed: {
arrowStyle() {
let style = {};
@@ -260,10 +262,6 @@ export default {
position: relative;
}
-.u-border-gap:after {
- left: 32rpx !important;
-}
-
.u-cell__label {
margin-top: 6rpx;
font-size: 26rpx;
diff --git a/uview-ui/components/u-field/u-field.vue b/uview-ui/components/u-field/u-field.vue
index 6b386f6b..12e5e34b 100644
--- a/uview-ui/components/u-field/u-field.vue
+++ b/uview-ui/components/u-field/u-field.vue
@@ -1,12 +1,12 @@
-
+
-
+
{{ label }}
@@ -55,6 +55,7 @@
* @tutorial https://www.uviewui.com/components/field.html
* @property {String} type 输入框的类型(默认text)
* @property {String} icon label左边的图标,限uView的图标名称
+ * @property {Object} icon-style 左边图标的样式,对象形式
* @property {Boolean} right-icon 输入框右边的图标名称,限uView的图标名称(默认false)
* @property {Boolean} required 是否必填,左边您显示红色"*"号(默认false)
* @property {String} label 输入框左边的文字提示
@@ -65,6 +66,8 @@
* @property {Object} field-style 自定义输入框的样式,对象形式
* @property {Number | String} clear-size 清除图标的大小,单位rpx(默认30)
* @property {String} input-align 输入框内容对齐方式(默认left)
+ * @property {Boolean} border-bottom 是否显示field的下边框(默认true)
+ * @property {Boolean} border-top 是否显示field的上边框(默认false)
* @property {String} icon-color 左边通过icon配置的图标的颜色(默认#606266)
* @property {Boolean} auto-height 是否自动增高输入区域,type为textarea时有效(默认true)
* @property {String Boolean} error-message 显示的错误提示内容,如果为空字符串或者false,则不显示错误信息
@@ -162,20 +165,31 @@ export default {
clearSize: {
type: [Number, String],
default: 30
- }
+ },
+ // lable左边的图标样式,对象形式
+ iconStyle: {
+ type: Object,
+ default() {
+ return {}
+ }
+ },
+ // 是否显示上边框
+ borderTop: {
+ type: Boolean,
+ default: false
+ },
+ // 是否显示下边框
+ borderBottom: {
+ type: Boolean,
+ default: true
+ },
},
- inject: ['uCellGroup'],
data() {
return {
focused: false,
itemIndex: 0,
};
},
- created() {
- if(this.uCellGroup) {
- this.itemIndex = this.uCellGroup.index++;
- }
- },
computed: {
inputWrapStyle() {
let style = {};
@@ -336,19 +350,6 @@ export default {
align-items: center;
}
-.u-field-border:after {
- left: 32rpx!important;
- position: absolute;
- box-sizing: border-box;
- content: ' ';
- pointer-events: none;
- right: 0;
- top: 0;
- border-bottom: 1px solid $u-border-color;
- -webkit-transform: scaleY(0.5);
- transform: scaleY(0.5);
-}
-
.u-error-message {
color: $u-type-error;
font-size: 26rpx;
diff --git a/uview-ui/components/u-icon/u-icon.vue b/uview-ui/components/u-icon/u-icon.vue
index e68218fe..32d76d8c 100644
--- a/uview-ui/components/u-icon/u-icon.vue
+++ b/uview-ui/components/u-icon/u-icon.vue
@@ -23,6 +23,7 @@
* @property {String} label 图标右侧的label文字(默认28)
* @property {String} label-pos label文字相对于图标的位置,只能right或bottom(默认right)
* @property {String} label-color label字体颜色(默认#606266)
+ * @property {Object} custom-style icon的样式,对象形式
* @property {String | Number} margin-left label在右侧时与图标的距离,单位rpx(默认6)
* @property {String | Number} margin-top label在下方时与图标的距离,单位rpx(默认6)
* @property {String} label-pos label相对于图标的位置,只能right或bottom(默认right)
diff --git a/uview-ui/components/u-image/u-image.vue b/uview-ui/components/u-image/u-image.vue
new file mode 100644
index 00000000..3221eb8b
--- /dev/null
+++ b/uview-ui/components/u-image/u-image.vue
@@ -0,0 +1,202 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/uview-ui/components/u-input/u-input.vue b/uview-ui/components/u-input/u-input.vue
index 0dfddb9a..82ca6722 100644
--- a/uview-ui/components/u-input/u-input.vue
+++ b/uview-ui/components/u-input/u-input.vue
@@ -318,7 +318,7 @@ export default {
&__right-icon {
position: absolute;
- right: 20rpx;
+ right: 0;
top: 50%;
z-index: 3;
transform: translateY(-50%);
diff --git a/uview-ui/components/u-lazy-load/u-lazy-load.vue b/uview-ui/components/u-lazy-load/u-lazy-load.vue
index cc6592ad..bda51253 100644
--- a/uview-ui/components/u-lazy-load/u-lazy-load.vue
+++ b/uview-ui/components/u-lazy-load/u-lazy-load.vue
@@ -126,7 +126,7 @@
// 如果是不开启过渡效果,直接返回
if (!this.isEffect) return;
this.time = 0;
- // 原来opacity为1(不透明,是为了显示占位图),改成0(透明, 意味着该元素显示的是背景颜色,默认的白色),再改成1,是为了获得过渡效果
+ // 原来opacity为1(不透明,是为了显示占位图),改成0(透明,意味着该元素显示的是背景颜色,默认的白色),再改成1,是为了获得过渡效果
this.opacity = 0;
// 延时30ms,否则在浏览器H5,过渡效果无效
setTimeout(() => {
diff --git a/uview-ui/components/u-navbar/u-navbar.vue b/uview-ui/components/u-navbar/u-navbar.vue
index b7a4ef65..8c259ea4 100644
--- a/uview-ui/components/u-navbar/u-navbar.vue
+++ b/uview-ui/components/u-navbar/u-navbar.vue
@@ -210,7 +210,7 @@ export default {
// 如果自定义了点击返回按钮的函数,则执行,否则执行返回逻辑
if(typeof this.customBack === 'function') {
this.customBack();
- } {
+ } else {
uni.navigateBack();
}
}
diff --git a/uview-ui/components/u-tag/u-tag.vue b/uview-ui/components/u-tag/u-tag.vue
index cc1fc985..88d28b7f 100644
--- a/uview-ui/components/u-tag/u-tag.vue
+++ b/uview-ui/components/u-tag/u-tag.vue
@@ -181,31 +181,31 @@
.u-mode-light-primary {
background-color: $u-type-primary-light;
color: $u-type-primary;
- border: 1px solid rgb(215, 234, 254);
+ border: 1px solid $u-type-primary-disabled;
}
.u-mode-light-success {
background-color: $u-type-success-light;
color: $u-type-success;
- border: 1px solid #BEF5C8;
+ border: 1px solid $u-type-success-disabled;
}
.u-mode-light-error {
background-color: $u-type-error-light;
color: $u-type-error;
- border: 1px solid #fde2e2;
+ border: 1px solid $u-type-error-disabled;
}
.u-mode-light-warning {
background-color: $u-type-warning-light;
color: $u-type-warning;
- border: 1px solid #faecd8;
+ border: 1px solid $u-type-warning-disabled;
}
.u-mode-light-info {
background-color: $u-type-info-light;
color: $u-type-info;
- border: 1px solid #ebeef5;
+ border: 1px solid $u-type-info-disabled;
}
.u-mode-dark-primary {
diff --git a/uview-ui/components/u-toast/u-toast.vue b/uview-ui/components/u-toast/u-toast.vue
index ed73f44e..68c911b8 100644
--- a/uview-ui/components/u-toast/u-toast.vue
+++ b/uview-ui/components/u-toast/u-toast.vue
@@ -37,10 +37,11 @@
type: '', // 主题类型,primary,success,error,warning,black
duration: 2000, // 显示的时间,毫秒
isTab: false, // 是否跳转tab页面
- url: '', // toast消失后是否跳转页面,有则跳转
+ url: '', // toast消失后是否跳转页面,有则跳转,优先级高于back参数
icon: true, // 显示的图标
position: 'center', // toast出现的位置
callback: null, // 执行完后的回调函数
+ back: false, // 结束toast是否自动返回上一页
}
};
},
@@ -117,6 +118,11 @@
url: this.config.url
});
}
+ } else if(this.config.back) {
+ // 回退到上一页
+ this.$u.route({
+ type: 'back'
+ })
}
}
}
diff --git a/uview-ui/components/u-upload/u-upload.vue b/uview-ui/components/u-upload/u-upload.vue
index 344894e5..977eda3c 100644
--- a/uview-ui/components/u-upload/u-upload.vue
+++ b/uview-ui/components/u-upload/u-upload.vue
@@ -245,7 +245,14 @@ export default {
immediate: true,
handler(val) {
val.map(value => {
- this.lists.push({ url: value.url, error: false, progress: 100 });
+ // 首先检查内部是否已经添加过这张图片,因为外部绑定了一个对象给fileList的话(对象引用),进行修改外部fileList
+ // 时,会触发watch,导致重新把原来的图片再次添加到this.lists
+ // 数组的some方法意思是,只要数组元素有任意一个元素条件符合,就返回true,而另一个数组的every方法的意思是数组所有元素都符合条件才返回true
+ let tmp = this.lists.some(val => {
+ return val.url == value.url;
+ })
+ // 如果内部没有这个图片(tmp为false),则添加到内部
+ !tmp && this.lists.push({ url: value.url, error: false, progress: 100 });
});
}
}
diff --git a/uview-ui/iconfont.css b/uview-ui/iconfont.css
index baad9acc..1ebb6c81 100644
--- a/uview-ui/iconfont.css
+++ b/uview-ui/iconfont.css
@@ -8,8 +8,8 @@
}
/* #endif */
-/* 支付宝,百度,头条小程序目前读取大的本地字体文件,导致无法显示图标,故用在线加载的方式-2020-05-12 */
-/* #ifdef MP-ALIPAY || MP-BAIDU || MP-TOUTIAO || H5 */
+/* 支付宝,百度,头条,QQ小程序,以及H5在部分浏览器目前读取大的本地字体文件,导致无法显示图标,故用在线加载的方式-2020-06-24 */
+/* #ifdef MP-ALIPAY || MP-BAIDU || MP-TOUTIAO || H5 || MP-QQ */
@font-face {
font-family: "uicon-iconfont";
src: url('//at.alicdn.com/t/font_1529455_k9eg3z8m98');
diff --git a/uview-ui/index.js b/uview-ui/index.js
index 5a135765..c24a7db8 100644
--- a/uview-ui/index.js
+++ b/uview-ui/index.js
@@ -1,7 +1,7 @@
// 引入全局mixin
import mixin from './libs/mixin/mixin.js'
// 引入关于是否mixin集成小程序分享的配置
-import wxshare from './libs/mixin/mpShare.js'
+// import wxshare from './libs/mixin/mpShare.js'
// 全局挂载引入http相关请求拦截插件
import http from './libs/request'
@@ -45,6 +45,8 @@ import randomArray from './libs/function/randomArray.js'
import deepClone from './libs/function/deepClone.js'
// 对象深度拷贝
import deepMerge from './libs/function/deepMerge.js'
+// 添加单位
+import addUnit from './libs/function/addUnit.js'
// 规则检验
import test from './libs/function/test.js'
@@ -86,6 +88,7 @@ const $u = {
deepClone,
deepMerge,
getParent,
+ addUnit,
trim,
type: ['primary', 'success', 'error', 'warning', 'info'],
http,
diff --git a/uview-ui/libs/config/config.js b/uview-ui/libs/config/config.js
index 240af040..7dfb9dea 100644
--- a/uview-ui/libs/config/config.js
+++ b/uview-ui/libs/config/config.js
@@ -1,5 +1,5 @@
-// 此版本发布于2020-06-19
-let version = '1.3.61';
+// 此版本发布于2020-06-28
+let version = '1.4.0';
export default {
v: version,
diff --git a/uview-ui/libs/css/style.components.scss b/uview-ui/libs/css/style.components.scss
index 8e3c0546..5f3bf23d 100644
--- a/uview-ui/libs/css/style.components.scss
+++ b/uview-ui/libs/css/style.components.scss
@@ -6,9 +6,9 @@ image {
will-change: transform;
}
+// 在weex,也即nvue中,所有元素默认为border-box
view,
text {
box-sizing: border-box;
- flex-direction: row;
}
/* #endif */
\ No newline at end of file
diff --git a/uview-ui/libs/css/style.mp.scss b/uview-ui/libs/css/style.mp.scss
index e72844ea..54ad0048 100644
--- a/uview-ui/libs/css/style.mp.scss
+++ b/uview-ui/libs/css/style.mp.scss
@@ -10,7 +10,7 @@ u-td, u-th {
}
u-icon {
- display: flex;
+ display: inline-flex;
align-items: center;
}
diff --git a/uview-ui/libs/function/addUnit.js b/uview-ui/libs/function/addUnit.js
new file mode 100644
index 00000000..247fae22
--- /dev/null
+++ b/uview-ui/libs/function/addUnit.js
@@ -0,0 +1,8 @@
+import validation from './test.js';
+
+// 添加单位,如果有rpx,%,px等单位结尾或者值为auto,直接返回,否则加上rpx单位结尾
+export default function addUnit(value = 'auto', unit = 'rpx') {
+ value = String(value);
+ // 用uView内置验证规则中的number判断是否为数值
+ return validation.number(value) ? `${value}${unit}` : value;
+}
\ No newline at end of file
diff --git a/uview-ui/libs/function/getParent.js b/uview-ui/libs/function/getParent.js
index eb37bde4..e38f8403 100644
--- a/uview-ui/libs/function/getParent.js
+++ b/uview-ui/libs/function/getParent.js
@@ -6,14 +6,18 @@ export default function getParent(name, keys) {
while (parent) {
// 父组件
if (parent.$options.name !== name) {
+ // 如果组件的name不相等,继续上一级寻找
parent = parent.$parent;
} else {
- return keys.reduce((result, key) => {
- result[key] = parent[key];
- return result;
- }, {});
+ let data = {};
+ // 历遍传过来的对象参数
+ for(let i in keys) {
+ // 如果父组件有此值则用,无此值则用默认值
+ data[i] = parent[i] ? parent[i] : keys[i];
+ }
+ return data;
}
}
- return null;
+ return {};
}
\ No newline at end of file
diff --git a/uview-ui/package.json b/uview-ui/package.json
index d3849bd5..0b1e8283 100644
--- a/uview-ui/package.json
+++ b/uview-ui/package.json
@@ -1,6 +1,6 @@
{
"name": "uview-ui",
- "version": "1.3.8",
+ "version": "1.4.0",
"description": "uView UI,是uni-app生态优秀的UI框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水",
"main": "index.js",
"keywords": ["uview", "uView", "uni-app", "uni-app ui", "uniapp", "uviewui", "uview ui", "uviewUI", "uViewui", "uViewUI", "uView UI", "uni ui", "uni UI", "uniapp ui", "ui", "UI框架", "uniapp ui框架", "uniapp UI"],