Bläddra i källkod

升级uni-ui到最新版本1.4.23

RuoYi 3 år sedan
förälder
incheckning
55fb5c5f61
52 ändrade filer med 2937 tillägg och 2572 borttagningar
  1. 2 1
      config.js
  2. 2 0
      uni_modules/uni-badge/changelog.md
  3. 6 6
      uni_modules/uni-badge/components/uni-badge/uni-badge.vue
  4. 4 7
      uni_modules/uni-badge/package.json
  5. 4 0
      uni_modules/uni-calendar/changelog.md
  6. 5 5
      uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue
  7. 1 1
      uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue
  8. 4 7
      uni_modules/uni-calendar/package.json
  9. 2 0
      uni_modules/uni-data-checkbox/changelog.md
  10. 47 43
      uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue
  11. 4 7
      uni_modules/uni-data-checkbox/package.json
  12. 2 0
      uni_modules/uni-data-picker/changelog.md
  13. 541 548
      uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue
  14. 236 177
      uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js
  15. 265 277
      uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue
  16. 5 8
      uni_modules/uni-data-picker/package.json
  17. 6 0
      uni_modules/uni-data-select/changelog.md
  18. 27 13
      uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue
  19. 4 7
      uni_modules/uni-data-select/package.json
  20. 10 0
      uni_modules/uni-datetime-picker/changelog.md
  21. 6 4
      uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue
  22. 32 15
      uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue
  23. 24 5
      uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue
  24. 56 53
      uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue
  25. 4 7
      uni_modules/uni-datetime-picker/package.json
  26. 47 8
      uni_modules/uni-easyinput/changelog.md
  27. 631 545
      uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue
  28. 4 7
      uni_modules/uni-easyinput/package.json
  29. 4 0
      uni_modules/uni-fab/changelog.md
  30. 17 2
      uni_modules/uni-fab/components/uni-fab/uni-fab.vue
  31. 4 7
      uni_modules/uni-fab/package.json
  32. 4 0
      uni_modules/uni-forms/changelog.md
  33. 11 7
      uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue
  34. 4 7
      uni_modules/uni-forms/package.json
  35. 6 0
      uni_modules/uni-nav-bar/changelog.md
  36. 13 4
      uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue
  37. 4 7
      uni_modules/uni-nav-bar/package.json
  38. 2 0
      uni_modules/uni-notice-bar/changelog.md
  39. 50 19
      uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue
  40. 4 7
      uni_modules/uni-notice-bar/package.json
  41. 7 0
      uni_modules/uni-pagination/changelog.md
  42. 2 1
      uni_modules/uni-pagination/components/uni-pagination/i18n/en.json
  43. 2 1
      uni_modules/uni-pagination/components/uni-pagination/i18n/es.json
  44. 2 1
      uni_modules/uni-pagination/components/uni-pagination/i18n/fr.json
  45. 2 1
      uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hans.json
  46. 2 1
      uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hant.json
  47. 64 8
      uni_modules/uni-pagination/components/uni-pagination/uni-pagination.vue
  48. 4 7
      uni_modules/uni-pagination/package.json
  49. 0 2
      uni_modules/uni-pagination/readme.md
  50. 478 473
      uni_modules/uni-popup/components/uni-popup/uni-popup.vue
  51. 1 1
      uni_modules/uni-table/components/uni-table/uni-table.vue
  52. 269 265
      uni_modules/uni-transition/components/uni-transition/uni-transition.vue

+ 2 - 1
config.js

@@ -1,6 +1,7 @@
 // 应用全局配置
 module.exports = {
-  baseUrl: 'http://localhost:8080',
+  baseUrl: 'https://vue.ruoyi.vip/prod-api',
+  // baseUrl: 'http://localhost:8080',
   // 应用信息
   appInfo: {
     // 应用名称

+ 2 - 0
uni_modules/uni-badge/changelog.md

@@ -1,3 +1,5 @@
+## 1.2.1(2022-09-05)
+- 修复 当 text 超过 max-num 时,badge 的宽度计算是根据 text 的长度计算,更改为 css 计算实际展示宽度,详见:[https://ask.dcloud.net.cn/question/150473](https://ask.dcloud.net.cn/question/150473)
 ## 1.2.0(2021-11-19)
 - 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
 - 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-badge](https://uniapp.dcloud.io/component/uniui/uni-badge)

+ 6 - 6
uni_modules/uni-badge/components/uni-badge/uni-badge.vue

@@ -1,7 +1,7 @@
 <template>
 	<view class="uni-badge--x">
 		<slot />
-		<text v-if="text" :class="classNames" :style="[badgeWidth, positionStyle, customStyle, dotStyle]"
+		<text v-if="text" :class="classNames" :style="[positionStyle, customStyle, dotStyle]"
 			class="uni-badge" @click="onClick()">{{displayValue}}</text>
 	</view>
 </template>
@@ -130,16 +130,13 @@
 				const match = whiteList[this.absolute]
 				return match ? match : whiteList['rightTop']
 			},
-			badgeWidth() {
-				return {
-					width: `${this.width}px`
-				}
-			},
 			dotStyle() {
 				if (!this.isDot) return {}
 				return {
 					width: '10px',
+					minWidth: '0',
 					height: '10px',
+					padding: '0',
 					borderRadius: '10px'
 				}
 			},
@@ -199,6 +196,8 @@
 		justify-content: center;
 		flex-direction: row;
 		height: 20px;
+		min-width: 20px;
+		padding: 0 4px;
 		line-height: 18px;
 		color: #fff;
 		border-radius: 100px;
@@ -207,6 +206,7 @@
 		border: 1px solid #fff;
 		text-align: center;
 		font-family: 'Helvetica Neue', Helvetica, sans-serif;
+		font-feature-settings: "tnum";
 		font-size: $bage-size;
 		/* #ifdef H5 */
 		z-index: 999;

+ 4 - 7
uni_modules/uni-badge/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uni-badge",
   "displayName": "uni-badge 数字角标",
-  "version": "1.2.0",
+  "version": "1.2.1",
   "description": "数字角标(徽章)组件,在元素周围展示消息提醒,一般用于列表、九宫格、按钮等地方。",
   "keywords": [
     "",
@@ -18,11 +18,7 @@
   "directories": {
     "example": "../../temps/example_temps"
   },
-  "dcloudext": {
-    "category": [
-      "前端组件",
-      "通用组件"
-    ],
+"dcloudext": {
     "sale": {
       "regular": {
         "price": "0.00"
@@ -39,7 +35,8 @@
       "data": "无",
       "permissions": "无"
     },
-    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
   },
   "uni_modules": {
     "dependencies": ["uni-scss"],

+ 4 - 0
uni_modules/uni-calendar/changelog.md

@@ -1,3 +1,7 @@
+## 1.4.7(2022-09-16)
+- 可以使用 uni-scss 控制主题色
+## 1.4.6(2022-09-08)
+- fix: 表头年月切换,导致改变当前日期为选择月1号,且未触发change事件
 ## 1.4.5(2022-02-25)
 - 修复 条件编译 nvue 不支持的 css 样式
 ## 1.4.4(2022-02-25)

+ 5 - 5
uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue

@@ -102,7 +102,7 @@
 	$uni-color-error: #e43d33;
 	$uni-opacity-disabled: 0.3;
 	$uni-text-color-disable:#c0c0c0;
-	$uni-color-primary: #2979ff;
+	$uni-primary: #2979ff !default;
 	.uni-calendar-item__weeks-box {
 		flex: 1;
 		/* #ifndef APP-NVUE */
@@ -152,11 +152,11 @@
 	}
 
 	.uni-calendar-item--isDay-text {
-		color: $uni-color-primary;
+		color: $uni-primary;
 	}
 
 	.uni-calendar-item--isDay {
-		background-color: $uni-color-primary;
+		background-color: $uni-primary;
 		opacity: 0.8;
 		color: #fff;
 	}
@@ -167,13 +167,13 @@
 	}
 
 	.uni-calendar-item--checked {
-		background-color: $uni-color-primary;
+		background-color: $uni-primary;
 		color: #fff;
 		opacity: 0.8;
 	}
 
 	.uni-calendar-item--multiple {
-		background-color: $uni-color-primary;
+		background-color: $uni-primary;
 		color: #fff;
 		opacity: 0.8;
 	}

+ 1 - 1
uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue

@@ -218,7 +218,7 @@
 			bindDateChange(e) {
 				const value = e.detail.value + '-1'
 				console.log(this.cale.getDate(value));
-				this.init(value)
+				this.setDate(value)
 			},
 			/**
 			 * 初始化日期显示

+ 4 - 7
uni_modules/uni-calendar/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uni-calendar",
   "displayName": "uni-calendar 日历",
-  "version": "1.4.5",
+  "version": "1.4.7",
   "description": "日历组件",
   "keywords": [
     "uni-ui",
@@ -18,11 +18,7 @@
   "directories": {
     "example": "../../temps/example_temps"
   },
-  "dcloudext": {
-    "category": [
-      "前端组件",
-      "通用组件"
-    ],
+"dcloudext": {
     "sale": {
       "regular": {
         "price": "0.00"
@@ -39,7 +35,8 @@
       "data": "无",
       "permissions": "无"
     },
-    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
   },
   "uni_modules": {
     "dependencies": [],

+ 2 - 0
uni_modules/uni-data-checkbox/changelog.md

@@ -1,3 +1,5 @@
+## 1.0.3(2022-09-16)
+- 可以使用 uni-scss 控制主题色
 ## 1.0.2(2022-06-30)
 - 优化 在 uni-forms 中的依赖注入方式
 ## 1.0.1(2022-02-07)

+ 47 - 43
uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue

@@ -383,12 +383,14 @@
 			 */
 			setStyleBackgroud(item) {
 				let styles = {}
-				let selectedColor = this.selectedColor?this.selectedColor:'#2979ff'
-				if (this.mode !== 'list') {
-					styles['border-color'] = item.selected?selectedColor:'#DCDFE6'
-				}
-				if (this.mode === 'tag') {
-					styles['background-color'] = item.selected? selectedColor:'#f5f5f5'
+				let selectedColor = this.selectedColor?this.selectedColor:'#2979ff'
+				if (this.selectedColor) {
+					if (this.mode !== 'list') {
+						styles['border-color'] = item.selected?selectedColor:'#DCDFE6'
+					}
+					if (this.mode === 'tag') {
+						styles['background-color'] = item.selected? selectedColor:'#f5f5f5'
+					}
 				}
 				let classles = ''
 				for (let i in styles) {
@@ -398,16 +400,17 @@
 			},
 			setStyleIcon(item) {
 				let styles = {}
-				let classles = ''
-				let selectedColor = this.selectedColor?this.selectedColor:'#2979ff'
-				styles['background-color'] = item.selected?selectedColor:'#fff'
-				styles['border-color'] = item.selected?selectedColor:'#DCDFE6'
-
-				if(!item.selected && item.disabled){
-					styles['background-color'] = '#F2F6FC'
-					styles['border-color'] = item.selected?selectedColor:'#DCDFE6'
+				let classles = ''
+				if (this.selectedColor) {
+					let selectedColor = this.selectedColor?this.selectedColor:'#2979ff'
+					styles['background-color'] = item.selected?selectedColor:'#fff'
+					styles['border-color'] = item.selected?selectedColor:'#DCDFE6'
+					
+					if(!item.selected && item.disabled){
+						styles['background-color'] = '#F2F6FC'
+						styles['border-color'] = item.selected?selectedColor:'#DCDFE6'
+					}
 				}
-
 				for (let i in styles) {
 					classles += `${i}:${styles[i]};`
 				}
@@ -415,17 +418,18 @@
 			},
 			setStyleIconText(item) {
 				let styles = {}
-				let classles = ''
-				let selectedColor = this.selectedColor?this.selectedColor:'#2979ff'
-				if (this.mode === 'tag') {
-					styles.color = item.selected?(this.selectedTextColor?this.selectedTextColor:'#fff'):'#666'
-				} else {
-					styles.color = item.selected?(this.selectedTextColor?this.selectedTextColor:selectedColor):'#666'
-				}
-				if(!item.selected && item.disabled){
-					styles.color = '#999'
+				let classles = ''
+				if (this.selectedColor) {
+					let selectedColor = this.selectedColor?this.selectedColor:'#2979ff'
+					if (this.mode === 'tag') {
+						styles.color = item.selected?(this.selectedTextColor?this.selectedTextColor:'#fff'):'#666'
+					} else {
+						styles.color = item.selected?(this.selectedTextColor?this.selectedTextColor:selectedColor):'#666'
+					}
+					if(!item.selected && item.disabled){
+						styles.color = '#999'
+					}
 				}
-
 				for (let i in styles) {
 					classles += `${i}:${styles[i]};`
 				}
@@ -448,7 +452,7 @@
 </script>
 
 <style lang="scss">
-	$checked-color: #2979ff;
+	$uni-primary: #2979ff !default;
 	$border-color: #DCDFE6;
 	$disable:0.4;
 
@@ -614,8 +618,8 @@
 					// 选中
 					&.is-checked {
 						.checkbox__inner {
-							border-color: $checked-color;
-							background-color: $checked-color;
+							border-color: $uni-primary;
+							background-color: $uni-primary;
 
 							.checkbox__inner-icon {
 								opacity: 1;
@@ -623,14 +627,14 @@
 							}
 						}
 						.radio__inner {
-							border-color: $checked-color;
+							border-color: $uni-primary;
 							.radio__inner-icon {
 								opacity: 1;
-								background-color: $checked-color;
+								background-color: $uni-primary;
 							}
 						}
 						.checklist-text {
-							color: $checked-color;
+							color: $uni-primary;
 						}
 						// 选中禁用
 						&.is-disable {
@@ -683,10 +687,10 @@
 					}
 
 					&.is-checked {
-						border-color: $checked-color;
+						border-color: $uni-primary;
 						.checkbox__inner {
-							border-color: $checked-color;
-							background-color: $checked-color;
+							border-color: $uni-primary;
+							background-color: $uni-primary;
 							.checkbox__inner-icon {
 								opacity: 1;
 								transform: rotate(45deg);
@@ -694,16 +698,16 @@
 						}
 
 						.radio__inner {
-							border-color: $checked-color;
+							border-color: $uni-primary;
 
 							.radio__inner-icon {
 								opacity: 1;
-								background-color: $checked-color;
+								background-color: $uni-primary;
 							}
 						}
 
 						.checklist-text {
-							color: $checked-color;
+							color: $uni-primary;
 						}
 
 						// 选中禁用
@@ -735,8 +739,8 @@
 					}
 
 					&.is-checked {
-						background-color: $checked-color;
-						border-color: $checked-color;
+						background-color: $uni-primary;
+						border-color: $uni-primary;
 
 						.checklist-text {
 							color: #fff;
@@ -775,8 +779,8 @@
 
 					&.is-checked {
 						.checkbox__inner {
-							border-color: $checked-color;
-							background-color: $checked-color;
+							border-color: $uni-primary;
+							background-color: $uni-primary;
 
 							.checkbox__inner-icon {
 								opacity: 1;
@@ -789,13 +793,13 @@
 							}
 						}
 						.checklist-text {
-							color: $checked-color;
+							color: $uni-primary;
 						}
 
 						.checklist-content {
 							.checkobx__list {
 								opacity: 1;
-								border-color: $checked-color;
+								border-color: $uni-primary;
 							}
 						}
 

+ 4 - 7
uni_modules/uni-data-checkbox/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uni-data-checkbox",
   "displayName": "uni-data-checkbox 数据选择器",
-  "version": "1.0.2",
+  "version": "1.0.3",
   "description": "通过数据驱动的单选框和复选框",
   "keywords": [
     "uni-ui",
@@ -17,11 +17,7 @@
   "directories": {
     "example": "../../temps/example_temps"
   },
-  "dcloudext": {
-    "category": [
-      "前端组件",
-      "通用组件"
-    ],
+"dcloudext": {
     "sale": {
       "regular": {
         "price": "0.00"
@@ -38,7 +34,8 @@
       "data": "无",
       "permissions": "无"
     },
-    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
   },
   "uni_modules": {
     "dependencies": ["uni-load-more","uni-scss"],

+ 2 - 0
uni_modules/uni-data-picker/changelog.md

@@ -1,3 +1,5 @@
+## 1.0.8(2022-09-16)
+- 可以使用 uni-scss 控制主题色
 ## 1.0.7(2022-07-06)
 - 优化 pc端图标位置不正确的问题
 ## 1.0.6(2022-07-05)

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 541 - 548
uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue


+ 236 - 177
uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js

@@ -42,7 +42,7 @@ export default {
     },
     pageSize: {
       type: Number,
-      default: 20
+      default: 500
     },
     getcount: {
       type: [Boolean, String],
@@ -94,7 +94,7 @@ export default {
     },
     map: {
       type: Object,
-      default() {
+      default () {
         return {
           text: "text",
           value: "value"
@@ -122,19 +122,22 @@ export default {
     }
   },
   computed: {
-    isLocaldata() {
-      return !this.collection.length
+    isLocalData() {
+      return !this.collection.length;
     },
-    postField() {
-      let fields = [this.field];
-      if (this.parentField) {
-        fields.push(`${this.parentField} as parent_value`);
-      }
-      return fields.join(',');
+    isCloudData() {
+      return this.collection.length > 0;
+    },
+    isCloudDataList() {
+      return (this.isCloudData && (!this.parentField && !this.selfField));
+    },
+    isCloudDataTree() {
+      return (this.isCloudData && this.parentField && this.selfField);
     },
     dataValue() {
-      let isModelValue = Array.isArray(this.modelValue) ? (this.modelValue.length > 0) : (this.modelValue !== null || this.modelValue !== undefined)
-      return isModelValue ? this.modelValue : this.value
+      let isModelValue = Array.isArray(this.modelValue) ? (this.modelValue.length > 0) : (this.modelValue !== null ||
+        this.modelValue !== undefined);
+      return isModelValue ? this.modelValue : this.value;
     },
     hasValue() {
       if (typeof this.dataValue === 'number') {
@@ -183,8 +186,169 @@ export default {
   },
   methods: {
     onPropsChange() {
-      this._treeData = []
+      this._treeData = [];
+    },
+
+    // 填充 pickview 数据
+    async loadData() {
+      if (this.isLocalData) {
+        this.loadLocalData();
+      } else if (this.isCloudDataList) {
+        this.loadCloudDataList();
+      } else if (this.isCloudDataTree) {
+        this.loadCloudDataTree();
+      }
+    },
+
+    // 加载本地数据
+    async loadLocalData() {
+      this._treeData = [];
+      this._extractTree(this.localdata, this._treeData);
+
+      let inputValue = this.dataValue;
+      if (inputValue === undefined) {
+        return;
+      }
+
+      if (Array.isArray(inputValue)) {
+        inputValue = inputValue[inputValue.length - 1];
+        if (typeof inputValue === 'object' && inputValue[this.map.value]) {
+          inputValue = inputValue[this.map.value];
+        }
+      }
+
+      this.selected = this._findNodePath(inputValue, this.localdata);
+    },
+
+    // 加载 Cloud 数据 (单列)
+    async loadCloudDataList() {
+      if (this.loading) {
+        return;
+      }
+      this.loading = true;
+
+      try {
+        let response = await this.getCommand();
+        let responseData = response.result.data;
+
+        this._treeData = responseData;
+
+        this._updateBindData();
+        this._updateSelected();
+
+        this.onDataChange();
+      } catch (e) {
+        this.errorMessage = e;
+      } finally {
+        this.loading = false;
+      }
+    },
+
+    // 加载 Cloud 数据 (树形)
+    async loadCloudDataTree() {
+      if (this.loading) {
+        return;
+      }
+      this.loading = true;
+
+      try {
+        let commandOptions = {
+          field: this._cloudDataPostField(),
+          where: this._cloudDataTreeWhere()
+        };
+        if (this.gettree) {
+          commandOptions.startwith = `${this.selfField}=='${this.dataValue}'`;
+        }
+
+        let response = await this.getCommand(commandOptions);
+        let responseData = response.result.data;
+
+        this._treeData = responseData;
+        this._updateBindData();
+        this._updateSelected();
+
+        this.onDataChange();
+      } catch (e) {
+        this.errorMessage = e;
+      } finally {
+        this.loading = false;
+      }
+    },
+
+    // 加载 Cloud 数据 (节点)
+    async loadCloudDataNode(callback) {
+      if (this.loading) {
+        return;
+      }
+      this.loading = true;
+
+      try {
+        let commandOptions = {
+          field: this._cloudDataPostField(),
+          where: this._cloudDataNodeWhere()
+        };
+
+        let response = await this.getCommand(commandOptions);
+        let responseData = response.result.data;
+
+        callback(responseData);
+      } catch (e) {
+        this.errorMessage = e;
+      } finally {
+        this.loading = false;
+      }
     },
+
+    // 回显 Cloud 数据
+    getCloudDataValue() {
+      if (this.isCloudDataList) {
+        return this.getCloudDataListValue();
+      }
+
+      if (this.isCloudDataTree) {
+        return this.getCloudDataTreeValue();
+      }
+    },
+
+    // 回显 Cloud 数据 (单列)
+    getCloudDataListValue() {
+      // 根据 field's as value标识匹配 where 条件
+      let where = [];
+      let whereField = this._getForeignKeyByField();
+      if (whereField) {
+        where.push(`${whereField} == '${this.dataValue}'`)
+      }
+
+      where = where.join(' || ');
+
+      if (this.where) {
+        where = `(${this.where}) && (${where})`
+      }
+
+      return this.getCommand({
+        field: this._cloudDataPostField(),
+        where
+      }).then((res) => {
+        this.selected = res.result.data;
+        return res.result.data;
+      });
+    },
+
+    // 回显 Cloud 数据 (树形)
+    getCloudDataTreeValue() {
+      return this.getCommand({
+        field: this._cloudDataPostField(),
+        getTreePath: {
+          startWith: `${this.selfField}=='${this.dataValue}'`
+        }
+      }).then((res) => {
+        let treePath = [];
+        this._extractTreePath(res.result.data, treePath);
+        this.selected = treePath;
+        return treePath;
+      });
+    },
+
     getCommand(options = {}) {
       /* eslint-disable no-undef */
       let db = uniCloud.database(this.spaceInfo)
@@ -229,125 +393,16 @@ export default {
 
       return db
     },
-		getNodeData(callback) {
-		  if (this.loading) {
-		    return
-		  }
-		  this.loading = true
-		  this.getCommand({
-		    field: this.postField,
-				where: this._pathWhere()
-		  }).then((res) => {
-		    this.loading = false
-		    this.selected = res.result.data
-		    callback && callback()
-		  }).catch((err) => {
-		    this.loading = false
-		    this.errorMessage = err
-		  })
-		},
-    getTreePath(callback) {
-      if (this.loading) {
-        return
-      }
-      this.loading = true
 
-      this.getCommand({
-        field: this.postField,
-        getTreePath: {
-          startWith: `${this.selfField}=='${this.dataValue}'`
-        }
-      }).then((res) => {
-        this.loading = false
-        let treePath = []
-        this._extractTreePath(res.result.data, treePath)
-        this.selected = treePath
-        callback && callback()
-      }).catch((err) => {
-        this.loading = false
-        this.errorMessage = err
-      })
-    },
-    loadData() {
-      if (this.isLocaldata) {
-        this._processLocalData()
-        return
-      }
-
-      if (this.dataValue != null) {
-        this._loadNodeData((data) => {
-          this._treeData = data
-          this._updateBindData()
-          this._updateSelected()
-        })
-        return
-      }
-
-      if (this.stepSearh) {
-        this._loadNodeData((data) => {
-          this._treeData = data
-          this._updateBindData()
-        })
-      } else {
-        this._loadAllData((data) => {
-          this._treeData = []
-          this._extractTree(data, this._treeData, null)
-          this._updateBindData()
-        })
+    _cloudDataPostField() {
+      let fields = [this.field];
+      if (this.parentField) {
+        fields.push(`${this.parentField} as parent_value`);
       }
+      return fields.join(',');
     },
-    _loadAllData(callback) {
-      if (this.loading) {
-        return
-      }
-      this.loading = true
-
-      this.getCommand({
-        field: this.postField,
-        gettree: true,
-        startwith: `${this.selfField}=='${this.dataValue}'`
-      }).then((res) => {
-        this.loading = false
-        callback(res.result.data)
-        this.onDataChange()
-      }).catch((err) => {
-        this.loading = false
-        this.errorMessage = err
-      })
-    },
-    _loadNodeData(callback, pw) {
-      if (this.loading) {
-        return
-      }
-      this.loading = true
 
-      this.getCommand({
-        field: this.postField,
-        where: pw || this._postWhere(),
-        pageSize: 500
-      }).then((res) => {
-        this.loading = false
-        callback(res.result.data)
-        this.onDataChange()
-      }).catch((err) => {
-        this.loading = false
-        this.errorMessage = err
-      })
-    },
-    _pathWhere() {
-      let result = []
-      let where_field = this._getParentNameByField();
-      if (where_field) {
-        result.push(`${where_field} == '${this.dataValue}'`)
-      }
-
-      if (this.where) {
-        return `(${this.where}) && (${result.join(' || ')})`
-      }
-
-      return result.join(' || ')
-    },
-    _postWhere() {
+    _cloudDataTreeWhere() {
       let result = []
       let selected = this.selected
       let parentField = this.parentField
@@ -364,17 +419,35 @@ export default {
       if (this.where) {
         where.push(`(${this.where})`)
       }
+
       if (result.length) {
         where.push(`(${result.join(' || ')})`)
       }
 
       return where.join(' && ')
     },
-    _nodeWhere() {
-      let result = []
-      let selected = this.selected
+
+    _cloudDataNodeWhere() {
+      let where = []
+      let selected = this.selected;
       if (selected.length) {
-        result.push(`${this.parentField} == '${selected[selected.length - 1].value}'`)
+        where.push(`${this.parentField} == '${selected[selected.length - 1].value}'`);
+      }
+
+      where = where.join(' || ');
+
+      if (this.where) {
+        return `(${this.where}) && (${where})`
+      }
+
+      return where
+    },
+
+    _getWhereByForeignKey() {
+      let result = []
+      let whereField = this._getForeignKeyByField();
+      if (whereField) {
+        result.push(`${whereField} == '${this.dataValue}'`)
       }
 
       if (this.where) {
@@ -383,41 +456,23 @@ export default {
 
       return result.join(' || ')
     },
-    _getParentNameByField() {
-      const fields = this.field.split(',');
-      let where_field = null;
+
+    _getForeignKeyByField() {
+      let fields = this.field.split(',');
+      let whereField = null;
       for (let i = 0; i < fields.length; i++) {
         const items = fields[i].split('as');
         if (items.length < 2) {
           continue;
         }
         if (items[1].trim() === 'value') {
-          where_field = items[0].trim();
+          whereField = items[0].trim();
           break;
         }
       }
-      return where_field
-    },
-    _isTreeView() {
-      return (this.parentField && this.selfField)
-    },
-    _updateSelected() {
-      var dl = this.dataList
-      var sl = this.selected
-      let textField = this.map.text
-      let valueField = this.map.value
-      for (var i = 0; i < sl.length; i++) {
-        var value = sl[i].value
-        var dl2 = dl[i]
-        for (var j = 0; j < dl2.length; j++) {
-          var item2 = dl2[j]
-          if (item2[valueField] === value) {
-            sl[i].text = item2[textField]
-            break
-          }
-        }
-      }
+      return whereField;
     },
+
     _updateBindData(node) {
       const {
         dataList,
@@ -445,6 +500,25 @@ export default {
         hasNodes
       }
     },
+
+    _updateSelected() {
+      let dl = this.dataList
+      let sl = this.selected
+      let textField = this.map.text
+      let valueField = this.map.value
+      for (let i = 0; i < sl.length; i++) {
+        let value = sl[i].value
+        let dl2 = dl[i]
+        for (let j = 0; j < dl2.length; j++) {
+          let item2 = dl2[j]
+          if (item2[valueField] === value) {
+            sl[i].text = item2[textField]
+            break
+          }
+        }
+      }
+    },
+
     _filterData(data, paths) {
       let dataList = []
       let hasNodes = true
@@ -453,8 +527,8 @@ export default {
         return (item.parent_value === null || item.parent_value === undefined || item.parent_value === '')
       }))
       for (let i = 0; i < paths.length; i++) {
-        var value = paths[i].value
-        var nodes = data.filter((item) => {
+        let value = paths[i].value
+        let nodes = data.filter((item) => {
           return item.parent_value === value
         })
 
@@ -470,6 +544,7 @@ export default {
         hasNodes
       }
     },
+
     _extractTree(nodes, result, parent_value) {
       let list = result || []
       let valueField = this.map.value
@@ -493,6 +568,7 @@ export default {
         }
       }
     },
+
     _extractTreePath(nodes, result) {
       let list = result || []
       for (let i = 0; i < nodes.length; i++) {
@@ -512,6 +588,7 @@ export default {
         }
       }
     },
+
     _findNodePath(key, nodes, path = []) {
       let textField = this.map.text
       let valueField = this.map.value
@@ -540,24 +617,6 @@ export default {
         path.pop()
       }
       return []
-    },
-    _processLocalData() {
-      this._treeData = []
-      this._extractTree(this.localdata, this._treeData)
-
-      var inputValue = this.dataValue
-      if (inputValue === undefined) {
-        return
-      }
-
-      if (Array.isArray(inputValue)) {
-        inputValue = inputValue[inputValue.length - 1]
-        if (typeof inputValue === 'object' && inputValue[this.map.value]) {
-          inputValue = inputValue[this.map.value]
-        }
-      }
-
-      this.selected = this._findNodePath(inputValue, this.localdata)
     }
   }
 }

+ 265 - 277
uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue

@@ -1,183 +1,172 @@
 <template>
-	<view class="uni-data-pickerview">
-		<scroll-view class="selected-area" scroll-x="true" scroll-y="false" :show-scrollbar="false">
-			<view class="selected-list">
-				<template v-for="(item,index) in selected">
-					<view class="selected-item"
-						:class="{'selected-item-active':index==selectedIndex, 'selected-item-text-overflow': ellipsis}"
-						 v-if="item.text" @click="handleSelect(index)">
-						<text class="">{{item.text}}</text>
-					</view>
-				</template>
-			</view>
-		</scroll-view>
-		<view class="tab-c">
-			<template v-for="(child, i) in dataList" >
-				<scroll-view class="list" :key="i" v-if="i==selectedIndex" :scroll-y="true">
-					<view class="item" :class="{'is-disabled': !!item.disable}" v-for="(item, j) in child"
-						@click="handleNodeClick(item, i, j)">
-						<text class="item-text item-text-overflow">{{item[map.text]}}</text>
-						<view class="check" v-if="selected.length > i && item[map.value] == selected[i].value"></view>
-					</view>
-				</scroll-view>
-			</template>
+  <view class="uni-data-pickerview">
+    <scroll-view v-if="!isCloudDataList" class="selected-area" scroll-x="true">
+      <view class="selected-list">
+        <template v-for="(item,index) in selected">
+          <view class="selected-item"
+            :class="{'selected-item-active':index==selectedIndex}"
+            v-if="item.text" @click="handleSelect(index)">
+            <text>{{item.text}}</text>
+          </view>
+        </template>
+      </view>
+    </scroll-view>
+    <view class="tab-c">
+      <template v-for="(child, i) in dataList">
+        <scroll-view class="list" :key="i" v-if="i==selectedIndex" :scroll-y="true">
+          <view class="item" :class="{'is-disabled': !!item.disable}" v-for="(item, j) in child"
+            @click="handleNodeClick(item, i, j)">
+            <text class="item-text">{{item[map.text]}}</text>
+            <view class="check" v-if="selected.length > i && item[map.value] == selected[i].value"></view>
+          </view>
+        </scroll-view>
+      </template>
 
-			<view class="loading-cover" v-if="loading">
-				<uni-load-more class="load-more" :contentText="loadMore" status="loading"></uni-load-more>
-			</view>
-			<view class="error-message" v-if="errorMessage">
-				<text class="error-text">{{errorMessage}}</text>
-			</view>
-		</view>
-	</view>
+      <view class="loading-cover" v-if="loading">
+        <uni-load-more class="load-more" :contentText="loadMore" status="loading"></uni-load-more>
+      </view>
+      <view class="error-message" v-if="errorMessage">
+        <text class="error-text">{{errorMessage}}</text>
+      </view>
+    </view>
+  </view>
 </template>
 
 <script>
-	import dataPicker from "./uni-data-picker.js"
+  import dataPicker from "./uni-data-picker.js"
 
-	/**
-	 * DataPickerview
-	 * @description uni-data-pickerview
-	 * @tutorial https://ext.dcloud.net.cn/plugin?id=3796
-	 * @property {Array} localdata 本地数据,参考
-	 * @property {Boolean} step-searh = [true|false] 是否分布查询
-	 * @value true 启用分布查询,仅查询当前选中节点
-	 * @value false 关闭分布查询,一次查询出所有数据
-	 * @property {String|DBFieldString} self-field 分布查询当前字段名称
-	 * @property {String|DBFieldString} parent-field 分布查询父字段名称
-	 * @property {String|DBCollectionString} collection 表名
-	 * @property {String|DBFieldString} field 查询字段,多个字段用 `,` 分割
-	 * @property {String} orderby 排序字段及正序倒叙设置
-	 * @property {String|JQLString} where 查询条件
-	 */
-	export default {
-		name: 'UniDataPickerView',
-		emits: ['nodeclick', 'change', 'datachange', 'update:modelValue'],
-		mixins: [dataPicker],
-		props: {
-			managedMode: {
-				type: Boolean,
-				default: false
-			},
-			ellipsis: {
-				type: Boolean,
-				default: true
-			}
-		},
-		data() {
-			return {}
-		},
-		created() {
-			if (this.managedMode) {
-				return
-			}
+  /**
+   * DataPickerview
+   * @description uni-data-pickerview
+   * @tutorial https://ext.dcloud.net.cn/plugin?id=3796
+   * @property {Array} localdata 本地数据,参考
+   * @property {Boolean} step-searh = [true|false] 是否分布查询
+   * @value true 启用分布查询,仅查询当前选中节点
+   * @value false 关闭分布查询,一次查询出所有数据
+   * @property {String|DBFieldString} self-field 分布查询当前字段名称
+   * @property {String|DBFieldString} parent-field 分布查询父字段名称
+   * @property {String|DBCollectionString} collection 表名
+   * @property {String|DBFieldString} field 查询字段,多个字段用 `,` 分割
+   * @property {String} orderby 排序字段及正序倒叙设置
+   * @property {String|JQLString} where 查询条件
+   */
+  export default {
+    name: 'UniDataPickerView',
+    emits: ['nodeclick', 'change', 'datachange', 'update:modelValue'],
+    mixins: [dataPicker],
+    props: {
+      managedMode: {
+        type: Boolean,
+        default: false
+      },
+      ellipsis: {
+        type: Boolean,
+        default: true
+      }
+    },
+    created() {
+      if (!this.managedMode) {
+        this.$nextTick(() => {
+          this.loadData();
+        })
+      }
+    },
+    methods: {
+      onPropsChange() {
+        this._treeData = [];
+        this.selectedIndex = 0;
+        this.$nextTick(() => {
+          this.loadData();
+        })
+      },
+      handleSelect(index) {
+        this.selectedIndex = index;
+      },
+      handleNodeClick(item, i, j) {
+        if (item.disable) {
+          return;
+        }
 
-			this.$nextTick(() => {
-				this.load()
-			})
-		},
-		methods: {
-			onPropsChange() {
-				this._treeData = []
-				this.selectedIndex = 0
-				this.load()
-			},
-			load() {
-				if (this.isLocaldata) {
-					this.loadData()
-				} else if (this.dataValue.length) {
-					this.getTreePath((res) => {
-						this.loadData()
-					})
-				}
-			},
-			handleSelect(index) {
-				this.selectedIndex = index
-			},
-			handleNodeClick(item, i, j) {
-				if (item.disable) {
-					return
-				}
-				const node = this.dataList[i][j]
-				const text = node[this.map.text]
-				const value = node[this.map.value]
-				if (i < this.selected.length - 1) {
-					this.selected.splice(i, this.selected.length - i)
-					this.selected.push({
-						text,
-						value
-					})
-				} else if (i === this.selected.length - 1) {
-					this.selected.splice(i, 1, {
-						text,
-						value
-					})
-				}
+        const node = this.dataList[i][j];
+        const text = node[this.map.text];
+        const value = node[this.map.value];
 
-				if (node.isleaf) {
-					this.onSelectedChange(node, node.isleaf)
-					return
-				}
+        if (i < this.selected.length - 1) {
+          this.selected.splice(i, this.selected.length - i)
+          this.selected.push({
+            text,
+            value
+          })
+        } else if (i === this.selected.length - 1) {
+          this.selected.splice(i, 1, {
+            text,
+            value
+          })
+        }
 
-				const {
-					isleaf,
-					hasNodes
-				} = this._updateBindData()
+        if (node.isleaf) {
+          this.onSelectedChange(node, node.isleaf)
+          return
+        }
 
-				if (!this._isTreeView() && !hasNodes) {
-					this.onSelectedChange(node, true)
-					return
-				}
+        const {
+          isleaf,
+          hasNodes
+        } = this._updateBindData()
 
-				if (this.isLocaldata && (!hasNodes || isleaf)) {
-					this.onSelectedChange(node, true)
-					return
-				}
+        // 本地数据
+        if (this.isLocalData) {
+          this.onSelectedChange(node, (!hasNodes || isleaf))
+        } else if (this.isCloudDataList) { // Cloud 数据 (单列)
+          this.onSelectedChange(node, true)
+        } else if (this.isCloudDataTree) { // Cloud 数据 (树形)
+          if (isleaf) {
+            this.onSelectedChange(node, node.isleaf)
+          } else if (!hasNodes) { // 请求一次服务器以确定是否为叶子节点
+            this.loadCloudDataNode((data) => {
+              if (!data.length) {
+                node.isleaf = true
+              } else {
+                this._treeData.push(...data)
+                this._updateBindData(node)
+              }
+              this.onSelectedChange(node, node.isleaf)
+            })
+          }
+        }
+      },
+      updateData(data) {
+        this._treeData = data.treeData
+        this.selected = data.selected
+        if (!this._treeData.length) {
+          this.loadData()
+        } else {
+          //this.selected = data.selected
+          this._updateBindData()
+        }
+      },
+      onDataChange() {
+        this.$emit('datachange');
+      },
+      onSelectedChange(node, isleaf) {
+        if (isleaf) {
+          this._dispatchEvent()
+        }
 
-				if (!isleaf && !hasNodes) {
-					this._loadNodeData((data) => {
-						if (!data.length) {
-							node.isleaf = true
-						} else {
-							this._treeData.push(...data)
-							this._updateBindData(node)
-						}
-						this.onSelectedChange(node, node.isleaf)
-					}, this._nodeWhere())
-					return
-				}
+        if (node) {
+          this.$emit('nodeclick', node)
+        }
+      },
+      _dispatchEvent() {
+        this.$emit('change', this.selected.slice(0))
+      }
+    }
+  }
+</script>
 
-				this.onSelectedChange(node, false)
-			},
-			updateData(data) {
-				this._treeData = data.treeData
-				this.selected = data.selected
-				if (!this._treeData.length) {
-					this.loadData()
-				} else {
-					//this.selected = data.selected
-					this._updateBindData()
-				}
-			},
-			onDataChange() {
-				this.$emit('datachange')
-			},
-			onSelectedChange(node, isleaf) {
-				if (isleaf) {
-					this._dispatchEvent()
-				}
+<style lang="scss">
+	$uni-primary: #007aff !default;
 
-				if (node) {
-					this.$emit('nodeclick', node)
-				}
-			},
-			_dispatchEvent() {
-				this.$emit('change', this.selected.slice(0))
-			}
-		}
-	}
-</script>
-<style >
 	.uni-data-pickerview {
 		flex: 1;
 		/* #ifndef APP-NVUE */
@@ -188,138 +177,137 @@
 		height: 100%;
 	}
 
-	.error-text {
-		color: #DD524D;
-	}
+  .error-text {
+    color: #DD524D;
+  }
 
-	.loading-cover {
-		position: absolute;
-		left: 0;
-		top: 0;
-		right: 0;
-		bottom: 0;
-		background-color: rgba(255, 255, 255, .5);
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		flex-direction: column;
-		align-items: center;
-		z-index: 1001;
-	}
-
-	.load-more {
-		/* #ifndef APP-NVUE */
-		margin: auto;
-		/* #endif */
-	}
+  .loading-cover {
+    position: absolute;
+    left: 0;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    background-color: rgba(255, 255, 255, .5);
+    /* #ifndef APP-NVUE */
+    display: flex;
+    /* #endif */
+    flex-direction: column;
+    align-items: center;
+    z-index: 1001;
+  }
 
-	.error-message {
-		background-color: #fff;
-		position: absolute;
-		left: 0;
-		top: 0;
-		right: 0;
-		bottom: 0;
-		padding: 15px;
-		opacity: .9;
-		z-index: 102;
-	}
+  .load-more {
+    /* #ifndef APP-NVUE */
+    margin: auto;
+    /* #endif */
+  }
 
-	/* #ifdef APP-NVUE */
-	.selected-area {
-		width: 750rpx;
-	}
+  .error-message {
+    background-color: #fff;
+    position: absolute;
+    left: 0;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    padding: 15px;
+    opacity: .9;
+    z-index: 102;
+  }
 
-	/* #endif */
+  /* #ifdef APP-NVUE */
+  .selected-area {
+    width: 750rpx;
+  }
+  /* #endif */
 
-	.selected-list {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		flex-direction: row;
-		flex-wrap: nowrap;
-		padding: 0 5px;
-		border-bottom: 1px solid #f8f8f8;
-	}
+  .selected-list {
+    /* #ifndef APP-NVUE */
+    display: flex;
+    flex-wrap: nowrap;
+    /* #endif */
+    flex-direction: row;
+    padding: 0 5px;
+    border-bottom: 1px solid #f8f8f8;
+  }
 
-	.selected-item {
-		margin-left: 10px;
-		margin-right: 10px;
-		padding: 12px 0;
-		text-align: center;
-		/* #ifndef APP-NVUE */
-		white-space: nowrap;
-		/* #endif */
-	}
+  .selected-item {
+    margin-left: 10px;
+    margin-right: 10px;
+    padding: 12px 0;
+    text-align: center;
+    /* #ifndef APP-NVUE */
+    white-space: nowrap;
+    /* #endif */
+  }
 
-	.selected-item-text-overflow {
-		width: 168px;
-		/* fix nvue */
-		overflow: hidden;
-		/* #ifndef APP-NVUE */
-		width: 6em;
-		white-space: nowrap;
-		text-overflow: ellipsis;
-		-o-text-overflow: ellipsis;
-		/* #endif */
-	}
+  .selected-item-text-overflow {
+    width: 168px;
+    /* fix nvue */
+    overflow: hidden;
+    /* #ifndef APP-NVUE */
+    width: 6em;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    -o-text-overflow: ellipsis;
+    /* #endif */
+  }
 
 	.selected-item-active {
-		border-bottom: 2px solid #007aff;
+		border-bottom: 2px solid $uni-primary;
 	}
 
 	.selected-item-text {
-		color: #007aff;
+		color: $uni-primary;
 	}
 
-	.tab-c {
-		position: relative;
-		flex: 1;
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		flex-direction: row;
-		overflow: hidden;
-	}
+  .tab-c {
+    position: relative;
+    flex: 1;
+    /* #ifndef APP-NVUE */
+    display: flex;
+    /* #endif */
+    flex-direction: row;
+    overflow: hidden;
+  }
 
-	.list {
-		flex: 1;
-	}
+  .list {
+    flex: 1;
+  }
 
-	.item {
-		padding: 12px 15px;
-		/* border-bottom: 1px solid #f0f0f0; */
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		flex-direction: row;
-		justify-content: space-between;
-	}
+  .item {
+    padding: 12px 15px;
+    /* border-bottom: 1px solid #f0f0f0; */
+    /* #ifndef APP-NVUE */
+    display: flex;
+    /* #endif */
+    flex-direction: row;
+    justify-content: space-between;
+  }
 
-	.is-disabled {
-		opacity: .5;
-	}
+  .is-disabled {
+    opacity: .5;
+  }
 
-	.item-text {
-		/* flex: 1; */
-		color: #333333;
-	}
+  .item-text {
+    /* flex: 1; */
+    color: #333333;
+  }
 
-	.item-text-overflow {
-		width: 280px;
-		/* fix nvue */
-		overflow: hidden;
-		/* #ifndef APP-NVUE */
-		width: 20em;
-		white-space: nowrap;
-		text-overflow: ellipsis;
-		-o-text-overflow: ellipsis;
-		/* #endif */
-	}
+  .item-text-overflow {
+    width: 280px;
+    /* fix nvue */
+    overflow: hidden;
+    /* #ifndef APP-NVUE */
+    width: 20em;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    -o-text-overflow: ellipsis;
+    /* #endif */
+  }
 
 	.check {
 		margin-right: 5px;
-		border: 2px solid #007aff;
+		border: 2px solid $uni-primary;
 		border-left: 0;
 		border-top: 0;
 		height: 12px;
@@ -330,4 +318,4 @@
 		/* #endif */
 		transform: rotate(45deg);
 	}
-</style>
+</style>

+ 5 - 8
uni_modules/uni-data-picker/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uni-data-picker",
   "displayName": "uni-data-picker 数据驱动的picker选择器",
-  "version": "1.0.7",
+  "version": "1.0.8",
   "description": "单列、多列级联选择器,常用于省市区城市选择、公司部门选择、多级分类等场景",
   "keywords": [
     "uni-ui",
@@ -18,11 +18,7 @@
   "directories": {
     "example": "../../temps/example_temps"
   },
-  "dcloudext": {
-    "category": [
-      "前端组件",
-      "通用组件"
-    ],
+"dcloudext": {
     "sale": {
       "regular": {
         "price": "0.00"
@@ -39,7 +35,8 @@
       "data": "无",
       "permissions": "无"
     },
-    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
   },
   "uni_modules": {
     "dependencies": [
@@ -56,7 +53,7 @@
       "client": {
         "App": {
           "app-vue": "y",
-          "app-nvue": "y"
+          "app-nvue": "u"
         },
         "H5-mobile": {
           "Safari": "y",

+ 6 - 0
uni_modules/uni-data-select/changelog.md

@@ -1,3 +1,9 @@
+## 0.1.9(2022-09-05)
+- 修复 微信小程序下拉框出现后选择会点击到蒙板后面的输入框
+## 0.1.8(2022-08-29)
+- 修复 点击的位置不准确
+## 0.1.7(2022-08-12)
+- 新增 支持 disabled 属性
 ## 0.1.6(2022-07-06)
 - 修复 pc端宽度异常的bug
 ## 0.1.5

+ 27 - 13
uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue

@@ -2,7 +2,7 @@
 	<view class="uni-stat__select">
 		<span v-if="label" class="uni-label-text hide-on-phone">{{label + ':'}}</span>
 		<view class="uni-stat-box" :class="{'uni-stat__actived': current}">
-			<view class="uni-select">
+			<view class="uni-select"  :class="{'uni-select--disabled':disabled}">
 				<view class="uni-select__input-box" @click="toggleSelector">
 					<view v-if="current" class="uni-select__input-text">{{current}}</view>
 					<view v-else class="uni-select__input-text uni-select__input-placeholder">{{typePlaceholder}}</view>
@@ -39,6 +39,7 @@
 	 * @property {Boolean} emptyText 没有数据时显示的文字 ,本地数据无效
 	 * @property {String} label 左侧标题
 	 * @property {String} placeholder 输入框的提示文字
+	 * @property {Boolean} disabled 是否禁用
 	 * @event {Function} change  选中发生变化触发
 	 */
 
@@ -88,6 +89,10 @@
 			defItem: {
 				type: Number,
 				default: 0
+			},
+      disabled: {
+				type: Boolean,
+				default: false
 			}
 		},
 		created() {
@@ -204,6 +209,10 @@
 			},
 
 			toggleSelector() {
+        if(this.disabled){
+          return
+        }
+
 				this.showSelector = !this.showSelector
 			},
 			formatItemName(item) {
@@ -248,15 +257,15 @@
 		width: 100%;
 		flex: 1;
 		box-sizing: border-box;
-	}
-	
-	.uni-stat-box {
-		width: 100%;
-		flex: 1;
-	}
-	
-	.uni-stat__actived {
-		width: 100%;
+	}
+
+	.uni-stat-box {
+		width: 100%;
+		flex: 1;
+	}
+
+	.uni-stat__actived {
+		width: 100%;
 		flex: 1;
 		// outline: 1px solid #2979ff;
 	}
@@ -287,6 +296,11 @@
 		width: 100%;
 		flex: 1;
 		height: 35px;
+
+    &--disabled{
+      background-color: #f5f7fa;
+      cursor: not-allowed;
+    }
 	}
 
 	.uni-select__label {
@@ -298,7 +312,7 @@
 	}
 
 	.uni-select__input-box {
-		// height: 35px;
+		height: 35px;
 		position: relative;
 		/* #ifndef APP-NVUE */
 		display: flex;
@@ -332,7 +346,7 @@
 		border: 1px solid #EBEEF5;
 		border-radius: 6px;
 		box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
-		z-index: 2;
+		z-index: 3;
 		padding: 4px 0;
 	}
 
@@ -423,4 +437,4 @@
 		right: 0;
 		left: 0;
 	}
-</style>
+</style>

+ 4 - 7
uni_modules/uni-data-select/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uni-data-select",
   "displayName": "uni-data-select 下拉框选择器",
-  "version": "0.1.6",
+  "version": "0.1.9",
   "description": "通过数据驱动的下拉框选择器",
   "keywords": [
     "uni-ui",
@@ -17,11 +17,7 @@
   "directories": {
     "example": "../../temps/example_temps"
   },
-  "dcloudext": {
-    "category": [
-      "前端组件",
-      "通用组件"
-    ],
+"dcloudext": {
     "sale": {
       "regular": {
         "price": "0.00"
@@ -38,7 +34,8 @@
       "data": "无",
       "permissions": "无"
     },
-    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
   },
   "uni_modules": {
     "dependencies": ["uni-load-more"],

+ 10 - 0
uni_modules/uni-datetime-picker/changelog.md

@@ -1,3 +1,13 @@
+## 2.2.11(2022-09-19)
+- 修复,支付宝小程序样式错乱,[详情](https://github.com/dcloudio/uni-app/issues/3861)
+## 2.2.10(2022-09-19)
+- 修复,反向选择日期范围,日期显示异常,[详情](https://ask.dcloud.net.cn/question/153401?item_id=212892&rf=false)
+## 2.2.9(2022-09-16)
+- 可以使用 uni-scss 控制主题色
+## 2.2.8(2022-09-08)
+- 修复 close事件无效的 bug
+## 2.2.7(2022-09-05)
+- 修复 移动端 maskClick 无效的 bug,详见:[https://ask.dcloud.net.cn/question/140824?item_id=209458&rf=false](https://ask.dcloud.net.cn/question/140824?item_id=209458&rf=false)
 ## 2.2.6(2022-06-30)
 - 优化 组件样式,调整了组件图标大小、高度、颜色等,与uni-ui风格保持一致
 ## 2.2.5(2022-06-24)

+ 6 - 4
uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue

@@ -61,7 +61,9 @@
 	}
 </script>
 
-<style lang="scss" >
+<style lang="scss" >
+	$uni-primary: #007aff !default;
+
 	.uni-calendar-item__weeks-box {
 		flex: 1;
 		/* #ifndef APP-NVUE */
@@ -78,7 +80,7 @@
 		font-size: 14px;
 		// font-family: Lato-Bold, Lato;
 		font-weight: bold;
-		color: #455997;
+		color: darken($color: $uni-primary, $amount: 40%);
 	}
 
 	.uni-calendar-item__weeks-lunar-text {
@@ -138,7 +140,7 @@
 	}
 
 	.uni-calendar-item__weeks-box .uni-calendar-item--checked {
-		background-color: #007aff;
+		background-color: $uni-primary;
 		border-radius: 50%;
 		box-sizing: border-box;
 		border: 3px solid #fff;
@@ -159,7 +161,7 @@
 
 	.uni-calendar-item--multiple .uni-calendar-item--before-checked,
 	.uni-calendar-item--multiple .uni-calendar-item--after-checked {
-		background-color: #409eff;
+		background-color: $uni-primary;
 		border-radius: 50%;
 		box-sizing: border-box;
 		border: 3px solid #F6F7FC;

+ 32 - 15
uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue

@@ -1,7 +1,7 @@
 <template>
 	<view class="uni-calendar" @mouseleave="leaveCale">
 		<view v-if="!insert&&show" class="uni-calendar__mask" :class="{'uni-calendar--mask-show':aniMaskShow}"
-			@click="clean"></view>
+			@click="clean();maskClick()"></view>
 		<view v-if="insert || show" class="uni-calendar__content"
 			:class="{'uni-calendar--fixed':!insert,'uni-calendar--ani-show':aniMaskShow, 'uni-calendar__content-mobile': aniMaskShow}">
 			<view class="uni-calendar__header" :class="{'uni-calendar__header-mobile' :!insert}">
@@ -73,8 +73,10 @@
 					<time-picker type="time" :start="reactStartTime" v-model="timeRange.startTime" :border="false"
 						:hide-second="hideSecond" :disabled="!tempRange.before" class="time-picker-style">
 					</time-picker>
+				</view>
+				<view style="line-height: 50px;">
+					<uni-icons type="arrowthinright" color="#999"></uni-icons>
 				</view>
-				<uni-icons type="arrowthinright" color="#999" style="line-height: 50px;"></uni-icons>
 				<view class="uni-date-changed--time-end">
 					<view class="uni-date-changed--time-date">{{tempRange.after ? tempRange.after : endDateText}}</view>
 					<time-picker type="time" :end="reactEndTime" v-model="timeRange.endTime" :border="false"
@@ -331,12 +333,12 @@
 			},
 			okText() {
 				return t("uni-datetime-picker.ok")
-			},
-			yearText() {
-				return t("uni-datetime-picker.year")
-			},
-			monthText() {
-				return t("uni-datetime-picker.month")
+			},
+			yearText() {
+				return t("uni-datetime-picker.year")
+			},
+			monthText() {
+				return t("uni-datetime-picker.month")
 			},
 			MONText() {
 				return t("uni-calender.MON")
@@ -411,6 +413,11 @@
 				this.close()
 			},
 
+			// 蒙版点击事件
+			maskClick() {
+				this.$emit('maskClose')
+			},
+
 			clearCalender() {
 				if (this.range) {
 					this.timeRange.startTime = ''
@@ -538,16 +545,24 @@
 			 * 选择天触发
 			 * @param {Object} weeks
 			 */
-			choiceDate(weeks) {
+			choiceDate(weeks) {
 				if (weeks.disable) return
 				this.calendar = weeks
 				this.calendar.userChecked = true
 				// 设置多选
 				this.cale.setMultiple(this.calendar.fullDate, true)
 				this.weeks = this.cale.weeks
-				this.tempSingleDate = this.calendar.fullDate
-				this.tempRange.before = this.cale.multipleStatus.before
-				this.tempRange.after = this.cale.multipleStatus.after
+				this.tempSingleDate = this.calendar.fullDate
+				const beforeStatus = this.cale.multipleStatus.before
+				const beforeDate = new Date(this.cale.multipleStatus.before).getTime()
+				const afterDate = new Date(this.cale.multipleStatus.after).getTime()
+				if (beforeDate > afterDate && afterDate) {
+					this.tempRange.before = this.cale.multipleStatus.after
+					this.tempRange.after = this.cale.multipleStatus.before
+				} else {
+					this.tempRange.before = this.cale.multipleStatus.before
+					this.tempRange.after = this.cale.multipleStatus.after
+				}
 				this.change()
 			},
 			/**
@@ -603,7 +618,9 @@
 	}
 </script>
 
-<style lang="scss" >
+<style lang="scss" >
+	$uni-primary: #007aff !default;
+
 	.uni-calendar {
 		/* #ifndef APP-NVUE */
 		display: flex;
@@ -714,7 +731,7 @@
 		text-align: center;
 		width: 100px;
 		font-size: 14px;
-		color: #007aff;
+		color: $uni-primary;
 		/* #ifndef APP-NVUE */
 		letter-spacing: 3px;
 		/* #endif */
@@ -893,7 +910,7 @@
 		border-radius: 100px;
 		height: 40px;
 		line-height: 40px;
-		background-color: #007aff;
+		background-color: $uni-primary;
 		color: #fff;
 		font-size: 16px;
 		letter-spacing: 2px;

+ 24 - 5
uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue

@@ -185,18 +185,34 @@
 			}
 		},
 		watch: {
+			// #ifndef VUE3
 			value: {
 				handler(newVal, oldVal) {
 					if (newVal) {
 						this.parseValue(this.fixIosDateFormat(newVal)) //兼容 iOS、safari 日期格式
 						this.initTime(false)
-					} else {
+					} else {
 						this.time = ''
 						this.parseValue(Date.now())
 					}
 				},
 				immediate: true
 			},
+			// #endif
+			// #ifdef VUE3
+			modelValue: {
+				handler(newVal, oldVal) {
+					if (newVal) {
+						this.parseValue(this.fixIosDateFormat(newVal)) //兼容 iOS、safari 日期格式
+						this.initTime(false)
+					} else {
+						this.time = ''
+						this.parseValue(Date.now())
+					}
+				},
+				immediate: true
+			},
+			// #endif
 			type: {
 				handler(newValue) {
 					if (newValue === 'date') {
@@ -539,8 +555,8 @@
 			 * @param {Object} defaultTime
 			 */
 			parseValue(value) {
-				if (!value) {
-					return
+				if (!value) {
+					return
 				}
 				if (this.type === 'time' && typeof value === "string") {
 					this.parseTimeType(value)
@@ -770,7 +786,9 @@
 	}
 </script>
 
-<style>
+<style lang="scss">
+	$uni-primary: #007aff !default;
+
 	.uni-datetime-picker {
 		/* #ifndef APP-NVUE */
 		/* width: 100%; */
@@ -804,7 +822,7 @@
 
 	.uni-datetime-picker-btn-text {
 		font-size: 14px;
-		color: #007AFF;
+		color: $uni-primary;
 	}
 
 	.uni-datetime-picker-btn-group {
@@ -889,6 +907,7 @@
 
 	.uni-datetime-picker-text {
 		font-size: 14px;
+		line-height: 50px
 	}
 
 	.uni-datetime-picker-sign {

+ 56 - 53
uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue

@@ -91,7 +91,7 @@
 		<calendar v-show="isPhone" ref="mobile" :clearDate="false" :date="defSingleDate" :defTime="reactMobDefTime"
 			:start-date="caleRange.startDate" :end-date="caleRange.endDate" :selectableTimes="mobSelectableTime"
 			:pleStatus="endMultipleStatus" :showMonth="false" :range="isRange" :typeHasTime="hasTime" :insert="false"
-			:hideSecond="hideSecond" @confirm="mobileChange" />
+			:hideSecond="hideSecond" @confirm="mobileChange" @maskClose="close" />
 	</view>
 </template>
 <script>
@@ -126,23 +126,23 @@
 	} = initVueI18n(messages)
 
 	export default {
-		name: 'UniDatetimePicker',
-		options: {
-			virtualHost: true
+		name: 'UniDatetimePicker',
+		options: {
+			virtualHost: true
 		},
 		components: {
 			calendar,
 			timePicker
-		},
-		inject: {
-			form: {
-				from: 'uniForm',
-				default: null
-			},
-			formItem: {
-				from: 'uniFormItem',
-				default: null
-			},
+		},
+		inject: {
+			form: {
+				from: 'uniForm',
+				default: null
+			},
+			formItem: {
+				from: 'uniFormItem',
+				default: null
+			},
 		},
 		data() {
 			return {
@@ -399,10 +399,10 @@
 			}
 		},
 		created() {
-			// if (this.form && this.formItem) {
-			// 	this.$watch('formItem.errMsg', (newVal) => {
-			// 		this.localMsg = newVal
-			// 	})
+			// if (this.form && this.formItem) {
+			// 	this.$watch('formItem.errMsg', (newVal) => {
+			// 		this.localMsg = newVal
+			// 	})
 			// }
 		},
 		mounted() {
@@ -515,7 +515,8 @@
 			close() {
 				setTimeout(() => {
 					this.popup = false
-					this.$emit('maskClick', this.value)
+					this.$emit('maskClick', this.value)
+					this.$refs.mobile.close()
 				}, 20)
 			},
 			setEmit(value) {
@@ -541,7 +542,7 @@
 						}
 					}
 				}
-				
+				
 				
 				this.$emit('change', value)
 				this.$emit('input', value)
@@ -706,15 +707,15 @@
 					} else {
 						this.$refs.pcSingle && this.$refs.pcSingle.clearCalender()
 					}
-					if (needEmit) {
-						// 校验规则
-						// if(this.form  && this.formItem){
-						// 	const {
-						// 		validateTrigger
-						// 	} = this.form
-						// 	if (validateTrigger === 'blur') {
-						// 		this.formItem.onFieldChange()
-						// 	}
+					if (needEmit) {
+						// 校验规则
+						// if(this.form  && this.formItem){
+						// 	const {
+						// 		validateTrigger
+						// 	} = this.form
+						// 	if (validateTrigger === 'blur') {
+						// 		this.formItem.onFieldChange()
+						// 	}
 						// }
 						this.$emit('change', '')
 						this.$emit('input', '')
@@ -782,12 +783,14 @@
 	}
 </script>
 
-<style>
-	.uni-date {
-		/* #ifndef APP-NVUE */
-		width: 100%;
-		/* #endif */
-		flex: 1;
+<style lang="scss">
+	$uni-primary: #007aff !default;
+	
+	.uni-date {
+		/* #ifndef APP-NVUE */
+		width: 100%;
+		/* #endif */
+		flex: 1;
 	}
 	.uni-date-x {
 		display: flex;
@@ -798,8 +801,8 @@
 		border-radius: 4px;
 		background-color: #fff;
 		color: #666;
-		font-size: 14px;
-		flex: 1;
+		font-size: 14px;
+		flex: 1;
 	}
 
 	.uni-date-x--border {
@@ -808,15 +811,15 @@
 		border: 1px solid #e5e5e5;
 	}
 
-	.uni-date-editor--x {
-		display: flex;
+	.uni-date-editor--x {
+		display: flex;
 		align-items: center;
 		position: relative;
 	}
 
-	.uni-date-editor--x .uni-date__icon-clear {
-		padding: 0 5px;
-		display: flex;
+	.uni-date-editor--x .uni-date__icon-clear {
+		padding: 0 5px;
+		display: flex;
 		align-items: center;
 		/* #ifdef H5 */
 		cursor: pointer;
@@ -825,14 +828,14 @@
 
 	.uni-date__x-input {
 		padding: 0 8px;
-		/* #ifndef APP-NVUE */
-		width: auto;
-		/* #endif */
-		position: relative;
-		overflow: hidden;
-		flex: 1;
-		line-height: 1;
-		font-size: 14px;
+		/* #ifndef APP-NVUE */
+		width: auto;
+		/* #endif */
+		position: relative;
+		overflow: hidden;
+		flex: 1;
+		line-height: 1;
+		font-size: 14px;
 		height: 35px;
 	}
 
@@ -941,14 +944,14 @@
 	}
 
 	.popup-x-footer text:hover {
-		color: #007aff;
+		color: $uni-primary;
 		cursor: pointer;
 		opacity: 0.8;
 	}
 
 	.popup-x-footer .confirm {
 		margin-left: 20px;
-		color: #007aff;
+		color: $uni-primary;
 	}
 
 	.uni-date-changed {
@@ -1009,4 +1012,4 @@
 		border-top-width: 0;
 		border-bottom-color: #fff;
 	}
-</style>
+</style>

+ 4 - 7
uni_modules/uni-datetime-picker/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uni-datetime-picker",
   "displayName": "uni-datetime-picker 日期选择器",
-  "version": "2.2.6",
+  "version": "2.2.11",
   "description": "uni-datetime-picker 日期时间选择器,支持日历,支持范围选择",
   "keywords": [
     "uni-datetime-picker",
@@ -17,11 +17,7 @@
   "directories": {
     "example": "../../temps/example_temps"
   },
-  "dcloudext": {
-    "category": [
-      "前端组件",
-      "通用组件"
-    ],
+"dcloudext": {
     "sale": {
       "regular": {
         "price": "0.00"
@@ -38,7 +34,8 @@
       "data": "无",
       "permissions": "无"
     },
-    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
   },
   "uni_modules": {
     "dependencies": [

+ 47 - 8
uni_modules/uni-easyinput/changelog.md

@@ -1,47 +1,86 @@
 ## 1.1.0(2022-06-30)
+
 - 新增 在 uni-forms 1.4.0 中使用可以在 blur 时校验内容
 - 新增 clear 事件,点击右侧叉号图标触发
 - 新增 change 事件 ,仅在输入框失去焦点或用户按下回车时触发
 - 优化 组件样式,组件获取焦点时高亮显示,图标颜色调整等
 -
+
 ## 1.0.5(2022-06-07)
+
 - 优化 clearable 显示策略
+
 ## 1.0.4(2022-06-07)
+
 - 优化 clearable 显示策略
+
 ## 1.0.3(2022-05-20)
-- 修复 关闭图标某些情况下无法取消的bug
+
+- 修复 关闭图标某些情况下无法取消的 bug
+
 ## 1.0.2(2022-04-12)
-- 修复 默认值不生效的bug
+
+- 修复 默认值不生效的 bug
+
 ## 1.0.1(2022-04-02)
-- 修复 value不能为0的bug
+
+- 修复 value 不能为 0 的 bug
+
 ## 1.0.0(2021-11-19)
-- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+
+- 优化 组件 UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
 - 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-easyinput](https://uniapp.dcloud.io/component/uniui/uni-easyinput)
+
 ## 0.1.4(2021-08-20)
+
 - 修复 在 uni-forms 的动态表单中默认值校验不通过的 bug
+
 ## 0.1.3(2021-08-11)
+
 - 修复 在 uni-forms 中重置表单,错误信息无法清除的问题
+
 ## 0.1.2(2021-07-30)
-- 优化 vue3下事件警告的问题
+
+- 优化 vue3 下事件警告的问题
+
 ## 0.1.1
+
 - 优化 errorMessage 属性支持 Boolean 类型
+
 ## 0.1.0(2021-07-13)
-- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+
+- 组件兼容 vue3,如何创建 vue3 项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+
 ## 0.0.16(2021-06-29)
+
 - 修复 confirmType 属性(仅 type="text" 生效)导致多行文本框无法换行的 bug
+
 ## 0.0.15(2021-06-21)
+
 - 修复 passwordIcon 属性拼写错误的 bug
+
 ## 0.0.14(2021-06-18)
-- 新增 passwordIcon 属性,当type=password时是否显示小眼睛图标
+
+- 新增 passwordIcon 属性,当 type=password 时是否显示小眼睛图标
 - 修复 confirmType 属性不生效的问题
+
 ## 0.0.13(2021-06-04)
+
 - 修复 disabled 状态可清出内容的 bug
+
 ## 0.0.12(2021-05-12)
+
 - 新增 组件示例地址
+
 ## 0.0.11(2021-05-07)
+
 - 修复 input-border 属性不生效的问题
+
 ## 0.0.10(2021-04-30)
+
 - 修复 ios 遮挡文字、显示一半的问题
+
 ## 0.0.9(2021-02-05)
-- 调整为uni_modules目录规范
+
+- 调整为 uni_modules 目录规范
 - 优化 兼容 nvue 页面

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 631 - 545
uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue


+ 4 - 7
uni_modules/uni-easyinput/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uni-easyinput",
   "displayName": "uni-easyinput 增强输入框",
-  "version": "1.1.0",
+  "version": "1.1.3",
   "description": "Easyinput 组件是对原生input组件的增强",
   "keywords": [
     "uni-ui",
@@ -17,11 +17,7 @@
   "directories": {
     "example": "../../temps/example_temps"
   },
-  "dcloudext": {
-    "category": [
-      "前端组件",
-      "通用组件"
-    ],
+"dcloudext": {
     "sale": {
       "regular": {
         "price": "0.00"
@@ -38,7 +34,8 @@
       "data": "无",
       "permissions": "无"
     },
-    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
   },
   "uni_modules": {
     "dependencies": [

+ 4 - 0
uni_modules/uni-fab/changelog.md

@@ -1,3 +1,7 @@
+## 1.2.4(2022-09-07)
+小程序端由于 style 使用了对象导致报错,[详情](https://ask.dcloud.net.cn/question/152790?item_id=211778&rf=false)
+## 1.2.3(2022-09-05)
+- 修复 nvue 环境下,具有 tabBar 时,fab 组件下部位置无法正常获取 --window-bottom 的bug,详见:[https://ask.dcloud.net.cn/question/110638?notification_id=826310](https://ask.dcloud.net.cn/question/110638?notification_id=826310)
 ## 1.2.2(2021-12-29)
 - 更新 组件依赖
 ## 1.2.1(2021-11-19)

+ 17 - 2
uni_modules/uni-fab/components/uni-fab/uni-fab.vue

@@ -5,7 +5,9 @@
         'uni-fab--rightBottom': rightBottom,
         'uni-fab--leftTop': leftTop,
         'uni-fab--rightTop': rightTop
-      }" class="uni-fab">
+      }" class="uni-fab"
+				:style="nvueBottom"
+			>
 			<view :class="{
           'uni-fab__content--left': horizontal === 'left',
           'uni-fab__content--right': horizontal === 'right',
@@ -32,7 +34,7 @@
 		  'uni-fab__circle--leftTop': leftTop,
 		  'uni-fab__circle--rightTop': rightTop,
 		  'uni-fab__content--other-platform': !isAndroidNvue
-		}" class="uni-fab__circle uni-fab__plus" :style="{ 'background-color': styles.buttonColor }" @click="_onClick">
+		}" class="uni-fab__circle uni-fab__plus" :style="{ 'background-color': styles.buttonColor, 'bottom': nvueBottom }" @click="_onClick">
 			<uni-icons class="fab-circle-icon" type="plusempty" :color="styles.iconColor" size="32"
 				:class="{'uni-fab__plus--active': isShow && content.length > 0}"></uni-icons>
 			<!-- <view class="fab-circle-v"  :class="{'uni-fab__plus--active': isShow && content.length > 0}"></view>
@@ -158,6 +160,16 @@
 			},
 			horizontalRight() {
 				return this.getPosition(2, 'horizontal', 'right')
+			},
+			// 计算 nvue bottom
+			nvueBottom() {
+				const safeBottom = uni.getSystemInfoSync().windowBottom;
+				// #ifdef APP-NVUE
+				return 30 + safeBottom
+				// #endif
+				// #ifndef APP-NVUE
+				return 30
+				// #endif
 			}
 		},
 		watch: {
@@ -194,6 +206,9 @@
 			 * 按钮点击事件
 			 */
 			_onItemClick(index, item) {
+				if (!this.isShow) {
+					return
+				}
 				this.$emit('trigger', {
 					index,
 					item

+ 4 - 7
uni_modules/uni-fab/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uni-fab",
   "displayName": "uni-fab 悬浮按钮",
-  "version": "1.2.2",
+  "version": "1.2.4",
   "description": "悬浮按钮 fab button ,点击可展开一个图标按钮菜单。",
   "keywords": [
     "uni-ui",
@@ -17,11 +17,7 @@
   "directories": {
     "example": "../../temps/example_temps"
   },
-  "dcloudext": {
-    "category": [
-      "前端组件",
-      "通用组件"
-    ],
+"dcloudext": {
     "sale": {
       "regular": {
         "price": "0.00"
@@ -38,7 +34,8 @@
       "data": "无",
       "permissions": "无"
     },
-    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
   },
   "uni_modules": {
     "dependencies": ["uni-scss","uni-icons"],

+ 4 - 0
uni_modules/uni-forms/changelog.md

@@ -1,3 +1,7 @@
+## 1.4.8(2022-08-23)
+- 优化 根据 rules 自动添加 required 的问题
+## 1.4.7(2022-08-22)
+- 修复 item 未设置 require 属性,rules 设置 require 后,星号也显示的 bug,详见:[https://ask.dcloud.net.cn/question/151540](https://ask.dcloud.net.cn/question/151540)
 ## 1.4.6(2022-07-13)
 - 修复 model 需要校验的值没有声明对应字段时,导致第一次不触发校验的bug
 ## 1.4.5(2022-07-05)

+ 11 - 7
uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue

@@ -181,7 +181,7 @@
 					(value, oldVal) => {
 						const isEqual = this.form._isEqual(value, oldVal)
 						// 简单判断前后值的变化,只有发生变化才会发生校验
-						// TODO  如果 oldVal = undefined ,那么大概率是源数据里没有值导致 ,这个情况不哦校验 ,可能不严谨 ,需要在做观察
+						// TODO  如果 oldVal = undefined ,那么大概率是源数据里没有值导致 ,这个情况不哦校验 ,可能不严谨 ,需要在做观察
 						// fix by mehaotian 暂时取消 && oldVal !== undefined ,如果formData 中不存在,可能会不校验
 						if (!isEqual) {
 							const val = this.itemSetValue(value)
@@ -386,10 +386,14 @@
 			},
 
 			// 是否显示星号
-			_isRequired() {
-				if (this.form) {
-					return this.required || this.form._isRequiredField(this.itemRules.rules || [])
-				}
+			_isRequired() {
+				// TODO 不根据规则显示 星号,考虑后续兼容
+				// if (this.form) {
+				// 	if (this.form._isRequiredField(this.itemRules.rules || []) && this.required) {
+				// 		return true
+				// 	}
+				// 	return false
+				// }
 				return this.required
 			},
 
@@ -479,7 +483,7 @@
 			height: 36px;
 			padding: 0 12px 0 0;
 			/* #ifndef APP-NVUE */
-			vertical-align: middle;
+			vertical-align: middle;
 			flex-shrink: 0;
 			/* #endif */
 
@@ -624,4 +628,4 @@
 		border-width: 0;
 		/* #endif */
 	}
-</style>
+</style>

+ 4 - 7
uni_modules/uni-forms/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uni-forms",
   "displayName": "uni-forms 表单",
-  "version": "1.4.6",
+  "version": "1.4.8",
   "description": "由输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据",
   "keywords": [
     "uni-ui",
@@ -17,11 +17,7 @@
   "directories": {
     "example": "../../temps/example_temps"
   },
-  "dcloudext": {
-    "category": [
-      "前端组件",
-      "通用组件"
-    ],
+"dcloudext": {
     "sale": {
       "regular": {
         "price": "0.00"
@@ -38,7 +34,8 @@
       "data": "无",
       "permissions": "无"
     },
-    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
   },
   "uni_modules": {
     "dependencies": [

+ 6 - 0
uni_modules/uni-nav-bar/changelog.md

@@ -1,3 +1,9 @@
+## 1.3.9(2022-10-13)
+- 修复 条件编译错误的bug
+## 1.3.8(2022-10-12)
+- 修复 nvue 环境 fixed 为 true 的情况下,无法置顶的 bug
+## 1.3.7(2022-08-11)
+- 修复 nvue 环境下 fixed 为 true 的情况下,无法置顶的 bug
 ## 1.3.6(2022-06-30)
 - 修复 组件示例中插槽用法无法显示内容的bug
 ## 1.3.5(2022-05-24)

+ 13 - 4
uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue

@@ -1,7 +1,7 @@
 <template>
-	<view class="uni-navbar" :class="{'uni-dark':dark}">
-		<view :class="{ 'uni-navbar--fixed': fixed, 'uni-navbar--shadow': shadow, 'uni-navbar--border': border }"
-			:style="{ 'background-color': themeBgColor }" class="uni-navbar__content">
+	<view class="uni-navbar" :class="{'uni-dark':dark, 'uni-nvue-fixed': fixed}">
+		<view class="uni-navbar__content" :class="{ 'uni-navbar--fixed': fixed, 'uni-navbar--shadow': shadow, 'uni-navbar--border': border }"
+			:style="{ 'background-color': themeBgColor }" >
 			<status-bar v-if="statusBar" />
 			<view :style="{ color: themeColor,backgroundColor: themeBgColor ,height:navbarHeight}"
 				class="uni-navbar__header">
@@ -37,11 +37,13 @@
 					</slot>
 				</view>
 			</view>
-		</view>
+		</view>
+		<!-- #ifndef APP-NVUE -->
 		<view class="uni-navbar__placeholder" v-if="fixed">
 			<status-bar v-if="statusBar" />
 			<view class="uni-navbar__placeholder-view" :style="{ height:navbarHeight}" />
 		</view>
+		<!-- #endif -->
 	</view>
 </template>
 
@@ -50,6 +52,8 @@
 	const getVal = (val) => typeof val === 'number' ? val + 'px' : val;
 
 	/**
+	 * 
+	 * 
 	 * NavBar 自定义导航栏
 	 * @description 导航栏组件,主要用于头部导航
 	 * @tutorial https://ext.dcloud.net.cn/plugin?id=52
@@ -196,6 +200,11 @@
 <style lang="scss" scoped>
 	$nav-height: 44px;
 
+	.uni-nvue-fixed {
+		/* #ifdef APP-NVUE */
+		position: sticky;
+		/* #endif */
+	}
 	.uni-navbar {
 		// box-sizing: border-box;
 	}

+ 4 - 7
uni_modules/uni-nav-bar/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uni-nav-bar",
   "displayName": "uni-nav-bar 自定义导航栏",
-  "version": "1.3.6",
+  "version": "1.3.9",
   "description": "自定义导航栏组件,主要用于头部导航。",
   "keywords": [
     "uni-ui",
@@ -16,11 +16,7 @@
   "directories": {
     "example": "../../temps/example_temps"
   },
-  "dcloudext": {
-    "category": [
-      "前端组件",
-      "通用组件"
-    ],
+"dcloudext": {
     "sale": {
       "regular": {
         "price": "0.00"
@@ -37,7 +33,8 @@
       "data": "无",
       "permissions": "无"
     },
-    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
   },
   "uni_modules": {
     "dependencies": [

+ 2 - 0
uni_modules/uni-notice-bar/changelog.md

@@ -1,3 +1,5 @@
+## 1.2.1(2022-09-05)
+- 新增 属性 fontSize,可修改文字大小。
 ## 1.2.0(2021-11-19)
 - 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
 - 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-notice-bar](https://uniapp.dcloud.io/component/uniui/uni-notice-bar)

+ 50 - 19
uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue

@@ -1,24 +1,47 @@
 <template>
-	<view v-if="show" class="uni-noticebar" :style="{ backgroundColor: backgroundColor }" @click="onClick">
+	<view v-if="show" class="uni-noticebar" :style="{ backgroundColor }" @click="onClick">
 		<uni-icons v-if="showIcon === true || showIcon === 'true'" class="uni-noticebar-icon" type="sound"
-			:color="color" size="22" />
+			:color="color" :size="fontSize * 1.5" />
 		<view ref="textBox" class="uni-noticebar__content-wrapper"
-			:class="{'uni-noticebar__content-wrapper--scrollable':scrollable, 'uni-noticebar__content-wrapper--single':!scrollable && (single || moreText)}">
+			:class="{
+				'uni-noticebar__content-wrapper--scrollable': scrollable,
+				'uni-noticebar__content-wrapper--single': !scrollable && (single || moreText)
+			}"
+			:style="{ height: scrollable ? fontSize * 1.5 + 'px' : 'auto' }"
+		>
 			<view :id="elIdBox" class="uni-noticebar__content"
-				:class="{'uni-noticebar__content--scrollable':scrollable, 'uni-noticebar__content--single':!scrollable && (single || moreText)}">
-				<text :id="elId" ref="animationEle" class="uni-noticebar__content-text"
-					:class="{'uni-noticebar__content-text--scrollable':scrollable,'uni-noticebar__content-text--single':!scrollable && (single || showGetMore)}"
-					:style="{color:color, width:wrapWidth+'px', 'animationDuration': animationDuration, '-webkit-animationDuration': animationDuration ,animationPlayState: webviewHide?'paused':animationPlayState,'-webkit-animationPlayState':webviewHide?'paused':animationPlayState, animationDelay: animationDelay, '-webkit-animationDelay':animationDelay}">{{text}}</text>
+				:class="{
+					'uni-noticebar__content--scrollable': scrollable,
+					'uni-noticebar__content--single': !scrollable && (single || moreText)
+				}"
+			>
+				<text :id="elId" ref="animationEle" class="uni-noticebar__content-text" 
+					:class="{
+						'uni-noticebar__content-text--scrollable': scrollable,
+						'uni-noticebar__content-text--single': !scrollable && (single || showGetMore)
+					}" 
+					:style="{
+						color: color,
+						fontSize: fontSize + 'px',
+						lineHeight: fontSize * 1.5 + 'px',
+						width: wrapWidth + 'px',
+						'animationDuration': animationDuration,
+						'-webkit-animationDuration': animationDuration,
+						animationPlayState: webviewHide ? 'paused' : animationPlayState,
+						'-webkit-animationPlayState': webviewHide ? 'paused' : animationPlayState,
+						animationDelay: animationDelay,
+						'-webkit-animationDelay': animationDelay
+					}"
+				>{{text}}</text>
 			</view>
 		</view>
-		<view v-if="showGetMore === true || showGetMore === 'true'" class="uni-noticebar__more uni-cursor-point"
+		<view v-if="isShowGetMore" class="uni-noticebar__more uni-cursor-point"
 			@click="clickMore">
-			<text v-if="moreText.length > 0" :style="{ color: moreColor }" class="uni-noticebar__more-text">{{ moreText }}</text>
-			<uni-icons v-else type="right" :color="moreColor" size="16" />
+			<text v-if="moreText.length > 0" :style="{ color: moreColor, fontSize: fontSize + 'px' }">{{ moreText }}</text>
+			<uni-icons v-else type="right" :color="moreColor" :size="fontSize * 1.1" />
 		</view>
-		<view class="uni-noticebar-close uni-cursor-point" v-if="(showClose === true || showClose === 'true') && (showGetMore === false || showGetMore === 'false')">
-			<uni-icons
-				type="closeempty" :color="color" size="16" @click="close" />
+		<view class="uni-noticebar-close uni-cursor-point" v-if="isShowClose">
+			<uni-icons type="closeempty" :color="color" :size="fontSize * 1.1" @click="close" />
 		</view>
 	</view>
 </template>
@@ -74,6 +97,10 @@
 				type: String,
 				default: '#FF9A43'
 			},
+			fontSize: {
+				type: Number,
+				default: 14
+			},
 			moreColor: {
 				type: String,
 				default: '#FF9A43'
@@ -123,6 +150,15 @@
 				animationDelay: '0s'
 			}
 		},
+		computed: {
+			isShowGetMore() {
+				return this.showGetMore === true || this.showGetMore === 'true'
+			},
+			isShowClose() {
+				return (this.showClose === true || this.showClose === 'true') 
+					&& (this.showGetMore === false || this.showGetMore === 'false')
+			}
+		},
 		mounted() {
 			// #ifdef APP-PLUS
 			var pages = getCurrentPages();
@@ -262,7 +298,7 @@
 	}
 </script>
 
-<style lang="scss" >
+<style lang="scss" scoped>
 	.uni-noticebar {
 		/* #ifndef APP-NVUE */
 		display: flex;
@@ -310,7 +346,6 @@
 	/* #ifndef APP-NVUE */
 	.uni-noticebar__content-wrapper--scrollable {
 		position: relative;
-		height: 18px;
 	}
 
 	/* #endif */
@@ -383,10 +418,6 @@
 		padding-left: 5px;
 	}
 
-	.uni-noticebar__more-text {
-		font-size: 14px;
-	}
-
 	@keyframes notice {
 		100% {
 			transform: translate3d(-100%, 0, 0);

+ 4 - 7
uni_modules/uni-notice-bar/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uni-notice-bar",
   "displayName": "uni-notice-bar 通告栏",
-  "version": "1.2.0",
+  "version": "1.2.1",
   "description": "NoticeBar 通告栏组件,常用于展示公告信息,可设为滚动公告",
   "keywords": [
     "uni-ui",
@@ -17,11 +17,7 @@
   "directories": {
     "example": "../../temps/example_temps"
   },
-  "dcloudext": {
-    "category": [
-      "前端组件",
-      "通用组件"
-    ],
+"dcloudext": {
     "sale": {
       "regular": {
         "price": "0.00"
@@ -38,7 +34,8 @@
       "data": "无",
       "permissions": "无"
     },
-    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
   },
   "uni_modules": {
     "dependencies": [

+ 7 - 0
uni_modules/uni-pagination/changelog.md

@@ -1,3 +1,10 @@
+## 1.2.4(2022-09-19)
+- 修复,未对主题色设置默认色,导致未引入 uni-scss 变量文件报错。
+- 修复,未对移动端当前页文字做主题色适配。
+## 1.2.3(2022-09-15)
+- 修复未使用 uni-scss 主题色的 bug。
+## 1.2.2(2022-07-06)
+- 修复 es 语言 i18n 错误
 ## 1.2.1(2021-11-22)
 - 修复 vue3中某些scss变量无法找到的问题
 ## 1.2.0(2021-11-19)

+ 2 - 1
uni_modules/uni-pagination/components/uni-pagination/i18n/en.json

@@ -1,4 +1,5 @@
 {
 	"uni-pagination.prevText": "prev",
-	"uni-pagination.nextText": "next"
+	"uni-pagination.nextText": "next",
+	"uni-pagination.piecePerPage": "piece/page"
 }

+ 2 - 1
uni_modules/uni-pagination/components/uni-pagination/i18n/es.json

@@ -1,4 +1,5 @@
 {
 	"uni-pagination.prevText": "anterior",
-	"uni-pagination.nextText": "próxima"
+	"uni-pagination.nextText": "prxima",
+	"uni-pagination.piecePerPage": "Art¨ªculo/P¨¢gina"
 }

+ 2 - 1
uni_modules/uni-pagination/components/uni-pagination/i18n/fr.json

@@ -1,4 +1,5 @@
 {
 	"uni-pagination.prevText": "précédente",
-	"uni-pagination.nextText": "suivante"
+	"uni-pagination.nextText": "suivante",
+	"uni-pagination.piecePerPage": "Articles/Pages"
 }

+ 2 - 1
uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hans.json

@@ -1,4 +1,5 @@
 {
 	"uni-pagination.prevText": "上一页",
-	"uni-pagination.nextText": "下一页"
+	"uni-pagination.nextText": "下一页",
+	"uni-pagination.piecePerPage": "条/页"
 }

+ 2 - 1
uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hant.json

@@ -1,4 +1,5 @@
 {
 	"uni-pagination.prevText": "上一頁",
-	"uni-pagination.nextText": "下一頁"
+	"uni-pagination.nextText": "下一頁",
+	"uni-pagination.piecePerPage": "條/頁"
 }

+ 64 - 8
uni_modules/uni-pagination/components/uni-pagination/uni-pagination.vue

@@ -1,5 +1,15 @@
 <template>
 	<view class="uni-pagination">
+		<!-- #ifndef MP -->
+		<picker v-if="showPageSize === true || showPageSize === 'true'" class="select-picker" mode="selector"
+			:value="pageSizeIndex" :range="pageSizeRange" @change="pickerChange" @cancel="pickerClick"
+			@click.native="pickerClick">
+			<button type="default" size="mini" :plain="true">
+				<text>{{pageSizeRange[pageSizeIndex]}} {{piecePerPage}}</text>
+				<uni-icons class="select-picker-icon" type="arrowdown" size="12" color="#999"></uni-icons>
+			</button>
+		</picker>
+		<!-- #endif -->
 		<!-- #ifndef APP-NVUE -->
 		<view class="uni-pagination__total is-phone-hide">共 {{ total }} 条</view>
 		<!-- #endif -->
@@ -16,8 +26,7 @@
 		</view>
 		<view class="uni-pagination__num uni-pagination__num-flex-none">
 			<view class="uni-pagination__num-current">
-				<text class="uni-pagination__num-current-text is-pc-hide"
-					style="color:#409EFF">{{ currentIndex }}</text>
+				<text class="uni-pagination__num-current-text is-pc-hide current-index-text">{{ currentIndex }}</text>
 				<text class="uni-pagination__num-current-text is-pc-hide">/{{ maxPage || 0 }}</text>
 				<!-- #ifndef APP-NVUE -->
 				<view v-for="(item, index) in paper" :key="index" :class="{ 'page--active': item === currentIndex }"
@@ -49,11 +58,15 @@
 	 * @tutorial https://ext.dcloud.net.cn/plugin?id=32
 	 * @property {String} prevText 左侧按钮文字
 	 * @property {String} nextText 右侧按钮文字
+	 * @property {String} piecePerPageText 条/页文字
 	 * @property {Number} current 当前页
 	 * @property {Number} total 数据总量
 	 * @property {Number} pageSize 每页数据量
-	 * @property {Number} showIcon = [true|false] 是否以 icon 形式展示按钮
+	 * @property {Boolean} showIcon = [true|false] 是否以 icon 形式展示按钮
+	 * @property {Boolean} showPageSize = [true|false] 是否展示每页条数
+	 * @property {Array} pageSizeRange = [20, 50, 100, 500] 每页条数选框
 	 * @event {Function} change 点击页码按钮时触发 ,e={type,current} current为当前页,type值为:next/prev,表示点击的是上一页还是下一个
+	 * * @event {Function} pageSizeChange 当前每页条数改变时触发 ,e={pageSize} pageSize 为当前所选的每页条数
 	 */
 
 	import {
@@ -65,7 +78,7 @@
 	} = initVueI18n(messages)
 	export default {
 		name: 'UniPagination',
-		emits: ['update:modelValue', 'input', 'change'],
+		emits: ['update:modelValue', 'input', 'change', 'pageSizeChange'],
 		props: {
 			value: {
 				type: [Number, String],
@@ -81,6 +94,9 @@
 			nextText: {
 				type: String,
 			},
+			piecePerPageText: {
+				type: String
+			},
 			current: {
 				type: [Number, String],
 				default: 1
@@ -100,18 +116,32 @@
 				type: [Boolean, String],
 				default: false
 			},
+			showPageSize: {
+				// 是否以 icon 形式展示按钮
+				type: [Boolean, String],
+				default: false
+			},
 			pagerCount: {
 				type: Number,
 				default: 7
+			},
+			pageSizeRange: {
+				type: Array,
+				default: () => [20, 50, 100, 500]
 			}
 		},
 		data() {
 			return {
+				pageSizeIndex: 0,
 				currentIndex: 1,
-				paperData: []
+				paperData: [],
+				pickerShow: false
 			}
 		},
 		computed: {
+			piecePerPage() {
+				return this.piecePerPageText || t('uni-pagination.piecePerPage')
+			},
 			prevPageText() {
 				return this.prevText || t('uni-pagination.prevText')
 			},
@@ -199,9 +229,31 @@
 						this.currentIndex = val
 					}
 				}
+			},
+			pageSizeIndex(val) {
+				this.$emit('pageSizeChange', this.pageSizeRange[val])
 			}
 		},
 		methods: {
+			pickerChange(e) {
+				this.pageSizeIndex = e.detail.value
+				this.pickerClick()
+			},
+			pickerClick() {
+				// #ifdef H5
+				const body = document.querySelector('body')
+				if (!body) return
+
+				const className = 'uni-pagination-picker-show'
+				this.pickerShow = !this.pickerShow
+
+				if (this.pickerShow) {
+					body.classList.add(className)
+				} else {
+					setTimeout(() => body.classList.remove(className), 300)
+				}
+				// #endif
+			},
 			// 选择标签
 			selectPage(e, index) {
 				if (parseInt(e)) {
@@ -256,8 +308,8 @@
 	}
 </script>
 
-<style lang="scss" >
-	$uni-primary: #2979ff;
+<style lang="scss" scoped>
+	$uni-primary: #2979ff !default;
 	.uni-pagination {
 		/* #ifndef APP-NVUE */
 		display: flex;
@@ -350,6 +402,10 @@
 
 	.uni-pagination__num-current-text {
 		font-size: 15px;
+	}
+
+	.current-index-text{
+		color: $uni-primary;
 	}
 
 	.uni-pagination--enabled {
@@ -406,4 +462,4 @@
 	}
 
 	/* #endif */
-</style>
+</style>

+ 4 - 7
uni_modules/uni-pagination/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uni-pagination",
   "displayName": "uni-pagination 分页器",
-  "version": "1.2.1",
+  "version": "1.2.4",
   "description": "Pagination 分页器组件,用于展示页码、请求数据等。",
   "keywords": [
     "uni-ui",
@@ -16,11 +16,7 @@
   "directories": {
     "example": "../../temps/example_temps"
   },
-  "dcloudext": {
-    "category": [
-      "前端组件",
-      "通用组件"
-    ],
+"dcloudext": {
     "sale": {
       "regular": {
         "price": "0.00"
@@ -37,7 +33,8 @@
       "data": "无",
       "permissions": "无"
     },
-    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
   },
   "uni_modules": {
     "dependencies": ["uni-scss","uni-icons"],

+ 0 - 2
uni_modules/uni-pagination/readme.md

@@ -9,5 +9,3 @@
 
 ### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-pagination)
 #### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 
-
-

+ 478 - 473
uni_modules/uni-popup/components/uni-popup/uni-popup.vue

@@ -1,474 +1,479 @@
-<template>
-	<view v-if="showPopup" class="uni-popup" :class="[popupstyle, isDesktop ? 'fixforpc-z-index' : '']">
-		<view @touchstart="touchstart">
-			<uni-transition key="1" v-if="maskShow" name="mask" mode-class="fade" :styles="maskClass"
-				:duration="duration" :show="showTrans" @click="onTap" />
-			<uni-transition key="2" :mode-class="ani" name="content" :styles="transClass" :duration="duration"
-				:show="showTrans" @click="onTap">
-				<view class="uni-popup__wrapper" :style="{ backgroundColor: bg }" :class="[popupstyle]" @click="clear">
-					<slot />
-				</view>
-			</uni-transition>
-		</view>
-		<!-- #ifdef H5 -->
-		<keypress v-if="maskShow" @esc="onTap" />
-		<!-- #endif -->
-	</view>
-</template>
-
-<script>
-	// #ifdef H5
-	import keypress from './keypress.js'
-	// #endif
-
-	/**
-	 * PopUp 弹出层
-	 * @description 弹出层组件,为了解决遮罩弹层的问题
-	 * @tutorial https://ext.dcloud.net.cn/plugin?id=329
-	 * @property {String} type = [top|center|bottom|left|right|message|dialog|share] 弹出方式
-	 * 	@value top 顶部弹出
-	 * 	@value center 中间弹出
-	 * 	@value bottom 底部弹出
-	 * 	@value left		左侧弹出
-	 * 	@value right  右侧弹出
-	 * 	@value message 消息提示
-	 * 	@value dialog 对话框
-	 * 	@value share 底部分享示例
-	 * @property {Boolean} animation = [true|false] 是否开启动画
-	 * @property {Boolean} maskClick = [true|false] 蒙版点击是否关闭弹窗(废弃)
-	 * @property {Boolean} isMaskClick = [true|false] 蒙版点击是否关闭弹窗
-	 * @property {String}  backgroundColor 主窗口背景色
-	 * @property {String}  maskBackgroundColor 蒙版颜色
-	 * @property {Boolean} safeArea		   是否适配底部安全区
-	 * @event {Function} change 打开关闭弹窗触发,e={show: false}
-	 * @event {Function} maskClick 点击遮罩触发
-	 */
-
-	export default {
-		name: 'uniPopup',
-		components: {
-			// #ifdef H5
-			keypress
-			// #endif
-		},
-		emits: ['change', 'maskClick'],
-		props: {
-			// 开启动画
-			animation: {
-				type: Boolean,
-				default: true
-			},
-			// 弹出层类型,可选值,top: 顶部弹出层;bottom:底部弹出层;center:全屏弹出层
-			// message: 消息提示 ; dialog : 对话框
-			type: {
-				type: String,
-				default: 'center'
-			},
-			// maskClick
-			isMaskClick: {
-				type: Boolean,
-				default: null
-			},
-			// TODO 2 个版本后废弃属性 ,使用 isMaskClick
-			maskClick: {
-				type: Boolean,
-				default: null
-			},
-			backgroundColor: {
-				type: String,
-				default: 'none'
-			},
-			safeArea: {
-				type: Boolean,
-				default: true
-			},
-			maskBackgroundColor: {
-				type: String,
-				default: 'rgba(0, 0, 0, 0.4)'
-			},
-		},
-
-		watch: {
-			/**
-			 * 监听type类型
-			 */
-			type: {
-				handler: function(type) {
-					if (!this.config[type]) return
-					this[this.config[type]](true)
-				},
-				immediate: true
-			},
-			isDesktop: {
-				handler: function(newVal) {
-					if (!this.config[newVal]) return
-					this[this.config[this.type]](true)
-				},
-				immediate: true
-			},
-			/**
-			 * 监听遮罩是否可点击
-			 * @param {Object} val
-			 */
-			maskClick: {
-				handler: function(val) {
-					this.mkclick = val
-				},
-				immediate: true
-			},
-			isMaskClick: {
-				handler: function(val) {
-					this.mkclick = val
-				},
-				immediate: true
-			},
-			// H5 下禁止底部滚动
-			showPopup(show) {
-				// #ifdef H5
-				// fix by mehaotian 处理 h5 滚动穿透的问题
-				document.getElementsByTagName('body')[0].style.overflow = show ? 'hidden' : 'visible'
-				// #endif
-			}
-		},
-		data() {
-			return {
-				duration: 300,
-				ani: [],
-				showPopup: false,
-				showTrans: false,
-				popupWidth: 0,
-				popupHeight: 0,
-				config: {
-					top: 'top',
-					bottom: 'bottom',
-					center: 'center',
-					left: 'left',
-					right: 'right',
-					message: 'top',
-					dialog: 'center',
-					share: 'bottom'
-				},
-				maskClass: {
-					position: 'fixed',
-					bottom: 0,
-					top: 0,
-					left: 0,
-					right: 0,
-					backgroundColor: 'rgba(0, 0, 0, 0.4)'
-				},
-				transClass: {
-					position: 'fixed',
-					left: 0,
-					right: 0
-				},
-				maskShow: true,
-				mkclick: true,
-				popupstyle: this.isDesktop ? 'fixforpc-top' : 'top'
-			}
-		},
-		computed: {
-			isDesktop() {
-				return this.popupWidth >= 500 && this.popupHeight >= 500
-			},
-			bg() {
-				if (this.backgroundColor === '' || this.backgroundColor === 'none') {
-					return 'transparent'
-				}
-				return this.backgroundColor
-			}
-		},
-		mounted() {
-			const fixSize = () => {
-				const {
-					windowWidth,
-					windowHeight,
-					windowTop,
-					safeArea,
-					screenHeight,
-					safeAreaInsets
-				} = uni.getSystemInfoSync()
-				this.popupWidth = windowWidth
-				this.popupHeight = windowHeight + (windowTop || 0)
-				// TODO fix by mehaotian 是否适配底部安全区 ,目前微信ios 、和 app ios 计算有差异,需要框架修复
-				if (safeArea && this.safeArea) {
-					// #ifdef MP-WEIXIN
-					this.safeAreaInsets = screenHeight - safeArea.bottom
-					// #endif
-					// #ifndef MP-WEIXIN
-					this.safeAreaInsets = safeAreaInsets.bottom
-					// #endif
-				} else {
-					this.safeAreaInsets = 0
-				}
-			}
-			fixSize()
-			// #ifdef H5
-			// window.addEventListener('resize', fixSize)
-			// this.$once('hook:beforeDestroy', () => {
-			// 	window.removeEventListener('resize', fixSize)
-			// })
-			// #endif
-		},
-		// #ifndef VUE3
-		// TODO vue2
-		destroyed() {
-			this.setH5Visible()
-		},
-		// #endif
-		// #ifdef VUE3
-		// TODO vue3
-		unmounted() {
-			this.setH5Visible()
-		},
-		// #endif
-		created() {
-			// this.mkclick =  this.isMaskClick || this.maskClick
-			if (this.isMaskClick === null && this.maskClick === null) {
-				this.mkclick = true
-			} else {
-				this.mkclick = this.isMaskClick !== null ? this.isMaskClick : this.maskClick
-			}
-			if (this.animation) {
-				this.duration = 300
-			} else {
-				this.duration = 0
-			}
-			// TODO 处理 message 组件生命周期异常的问题
-			this.messageChild = null
-			// TODO 解决头条冒泡的问题
-			this.clearPropagation = false
-			this.maskClass.backgroundColor = this.maskBackgroundColor
-		},
-		methods: {
-			setH5Visible() {
-				// #ifdef H5
-				// fix by mehaotian 处理 h5 滚动穿透的问题
-				document.getElementsByTagName('body')[0].style.overflow = 'visible'
-				// #endif
-			},
-			/**
-			 * 公用方法,不显示遮罩层
-			 */
-			closeMask() {
-				this.maskShow = false
-			},
-			/**
-			 * 公用方法,遮罩层禁止点击
-			 */
-			disableMask() {
-				this.mkclick = false
-			},
-			// TODO nvue 取消冒泡
-			clear(e) {
-				// #ifndef APP-NVUE
-				e.stopPropagation()
-				// #endif
-				this.clearPropagation = true
-			},
-
-			open(direction) {
-				// fix by mehaotian 处理快速打开关闭的情况
-				if (this.showPopup) {
-					clearTimeout(this.timer)
-					this.showPopup = false
-				}
-				let innerType = ['top', 'center', 'bottom', 'left', 'right', 'message', 'dialog', 'share']
-				if (!(direction && innerType.indexOf(direction) !== -1)) {
-					direction = this.type
-				}
-				if (!this.config[direction]) {
-					console.error('缺少类型:', direction)
-					return
-				}
-				this[this.config[direction]]()
-				this.$emit('change', {
-					show: true,
-					type: direction
-				})
-			},
-			close(type) {
-				this.showTrans = false
-				this.$emit('change', {
-					show: false,
-					type: this.type
-				})
-				clearTimeout(this.timer)
-				// // 自定义关闭事件
-				// this.customOpen && this.customClose()
-				this.timer = setTimeout(() => {
-					this.showPopup = false
-				}, 300)
-			},
-			// TODO 处理冒泡事件,头条的冒泡事件有问题 ,先这样兼容
-			touchstart() {
-				this.clearPropagation = false
-			},
-
-			onTap() {
-				if (this.clearPropagation) {
-					// fix by mehaotian 兼容 nvue
-					this.clearPropagation = false
-					return
-				}
-				this.$emit('maskClick')
-				if (!this.mkclick) return
-				this.close()
-			},
-			/**
-			 * 顶部弹出样式处理
-			 */
-			top(type) {
-				this.popupstyle = this.isDesktop ? 'fixforpc-top' : 'top'
-				this.ani = ['slide-top']
-				this.transClass = {
-					position: 'fixed',
-					left: 0,
-					right: 0,
-					backgroundColor: this.bg
-				}
-				// TODO 兼容 type 属性 ,后续会废弃
-				if (type) return
-				this.showPopup = true
-				this.showTrans = true
-				this.$nextTick(() => {
-					if (this.messageChild && this.type === 'message') {
-						this.messageChild.timerClose()
-					}
-				})
-			},
-			/**
-			 * 底部弹出样式处理
-			 */
-			bottom(type) {
-				this.popupstyle = 'bottom'
-				this.ani = ['slide-bottom']
-				this.transClass = {
-					position: 'fixed',
-					left: 0,
-					right: 0,
-					bottom: 0,
-					paddingBottom: this.safeAreaInsets + 'px',
-					backgroundColor: this.bg
-				}
-				// TODO 兼容 type 属性 ,后续会废弃
-				if (type) return
-				this.showPopup = true
-				this.showTrans = true
-			},
-			/**
-			 * 中间弹出样式处理
-			 */
-			center(type) {
-				this.popupstyle = 'center'
-				this.ani = ['zoom-out', 'fade']
-				this.transClass = {
-					position: 'fixed',
-					/* #ifndef APP-NVUE */
-					display: 'flex',
-					flexDirection: 'column',
-					/* #endif */
-					bottom: 0,
-					left: 0,
-					right: 0,
-					top: 0,
-					justifyContent: 'center',
-					alignItems: 'center'
-				}
-				// TODO 兼容 type 属性 ,后续会废弃
-				if (type) return
-				this.showPopup = true
-				this.showTrans = true
-			},
-			left(type) {
-				this.popupstyle = 'left'
-				this.ani = ['slide-left']
-				this.transClass = {
-					position: 'fixed',
-					left: 0,
-					bottom: 0,
-					top: 0,
-					backgroundColor: this.bg,
-					/* #ifndef APP-NVUE */
-					display: 'flex',
-					flexDirection: 'column'
-					/* #endif */
-				}
-				// TODO 兼容 type 属性 ,后续会废弃
-				if (type) return
-				this.showPopup = true
-				this.showTrans = true
-			},
-			right(type) {
-				this.popupstyle = 'right'
-				this.ani = ['slide-right']
-				this.transClass = {
-					position: 'fixed',
-					bottom: 0,
-					right: 0,
-					top: 0,
-					backgroundColor: this.bg,
-					/* #ifndef APP-NVUE */
-					display: 'flex',
-					flexDirection: 'column'
-					/* #endif */
-				}
-				// TODO 兼容 type 属性 ,后续会废弃
-				if (type) return
-				this.showPopup = true
-				this.showTrans = true
-			}
-		}
-	}
-</script>
-<style lang="scss">
-	.uni-popup {
-		position: fixed;
-		/* #ifndef APP-NVUE */
-		z-index: 99;
-
-		/* #endif */
-		&.top,
-		&.left,
-		&.right {
-			/* #ifdef H5 */
-			top: var(--window-top);
-			/* #endif */
-			/* #ifndef H5 */
-			top: 0;
-			/* #endif */
-		}
-
-		.uni-popup__wrapper {
-			/* #ifndef APP-NVUE */
-			display: block;
-			/* #endif */
-			position: relative;
-
-			/* iphonex 等安全区设置,底部安全区适配 */
-			/* #ifndef APP-NVUE */
-			// padding-bottom: constant(safe-area-inset-bottom);
-			// padding-bottom: env(safe-area-inset-bottom);
-			/* #endif */
-			&.left,
-			&.right {
-				/* #ifdef H5 */
-				padding-top: var(--window-top);
-				/* #endif */
-				/* #ifndef H5 */
-				padding-top: 0;
-				/* #endif */
-				flex: 1;
-			}
-		}
-	}
-
-	.fixforpc-z-index {
-		/* #ifndef APP-NVUE */
-		z-index: 999;
-		/* #endif */
-	}
-
-	.fixforpc-top {
-		top: 0;
-	}
+<template>
+	<view v-if="showPopup||onceRender" v-show="showPopup"  class="uni-popup" :class="[popupstyle, isDesktop ? 'fixforpc-z-index' : '']">
+		<view @touchstart="touchstart">
+			<uni-transition key="1" v-if="maskShow" name="mask" mode-class="fade" :styles="maskClass"
+				:duration="duration" :show="showTrans" @click="onTap" />
+			<uni-transition key="2" :mode-class="ani" name="content" :styles="transClass" :duration="duration"
+				:show="showTrans" @click="onTap" :once-render="onceRender">
+				<view class="uni-popup__wrapper" :style="{ backgroundColor: bg }" :class="[popupstyle]" @click="clear">
+					<slot />
+				</view>
+			</uni-transition>
+		</view>
+		<!-- #ifdef H5 -->
+		<keypress v-if="maskShow" @esc="onTap" />
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	// #ifdef H5
+	import keypress from './keypress.js'
+	// #endif
+
+	/**
+	 * PopUp 弹出层
+	 * @description 弹出层组件,为了解决遮罩弹层的问题
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=329
+	 * @property {String} type = [top|center|bottom|left|right|message|dialog|share] 弹出方式
+	 * 	@value top 顶部弹出
+	 * 	@value center 中间弹出
+	 * 	@value bottom 底部弹出
+	 * 	@value left		左侧弹出
+	 * 	@value right  右侧弹出
+	 * 	@value message 消息提示
+	 * 	@value dialog 对话框
+	 * 	@value share 底部分享示例
+	 * @property {Boolean} animation = [true|false] 是否开启动画
+	 * @property {Boolean} maskClick = [true|false] 蒙版点击是否关闭弹窗(废弃)
+	 * @property {Boolean} isMaskClick = [true|false] 蒙版点击是否关闭弹窗
+	 * @property {String}  backgroundColor 主窗口背景色
+	 * @property {String}  maskBackgroundColor 蒙版颜色
+	 * @property {Boolean} safeArea		   是否适配底部安全区
+	 * @event {Function} change 打开关闭弹窗触发,e={show: false}
+	 * @event {Function} maskClick 点击遮罩触发
+	 */
+
+	export default {
+		name: 'uniPopup',
+		components: {
+			// #ifdef H5
+			keypress
+			// #endif
+		},
+		emits: ['change', 'maskClick'],
+		props: {
+			// 开启动画
+			animation: {
+				type: Boolean,
+				default: true
+			},
+			// 弹出层类型,可选值,top: 顶部弹出层;bottom:底部弹出层;center:全屏弹出层
+			// message: 消息提示 ; dialog : 对话框
+			type: {
+				type: String,
+				default: 'center'
+			},
+			// maskClick
+			isMaskClick: {
+				type: Boolean,
+				default: null
+			},
+			// TODO 2 个版本后废弃属性 ,使用 isMaskClick
+			maskClick: {
+				type: Boolean,
+				default: null
+			},
+			backgroundColor: {
+				type: String,
+				default: 'none'
+			},
+			safeArea: {
+				type: Boolean,
+				default: true
+			},
+			maskBackgroundColor: {
+				type: String,
+				default: 'rgba(0, 0, 0, 0.4)'
+			},
+			// 指定使用v-show指令,不重新渲染Pop组件
+			onceRender:{
+				type:Boolean,
+				default:false
+			},
+		},
+
+		watch: {
+			/**
+			 * 监听type类型
+			 */
+			type: {
+				handler: function(type) {
+					if (!this.config[type]) return
+					this[this.config[type]](true)
+				},
+				immediate: true
+			},
+			isDesktop: {
+				handler: function(newVal) {
+					if (!this.config[newVal]) return
+					this[this.config[this.type]](true)
+				},
+				immediate: true
+			},
+			/**
+			 * 监听遮罩是否可点击
+			 * @param {Object} val
+			 */
+			maskClick: {
+				handler: function(val) {
+					this.mkclick = val
+				},
+				immediate: true
+			},
+			isMaskClick: {
+				handler: function(val) {
+					this.mkclick = val
+				},
+				immediate: true
+			},
+			// H5 下禁止底部滚动
+			showPopup(show) {
+				// #ifdef H5
+				// fix by mehaotian 处理 h5 滚动穿透的问题
+				document.getElementsByTagName('body')[0].style.overflow = show ? 'hidden' : 'visible'
+				// #endif
+			}
+		},
+		data() {
+			return {
+				duration: 300,
+				ani: [],
+				showPopup: false,
+				showTrans: false,
+				popupWidth: 0,
+				popupHeight: 0,
+				config: {
+					top: 'top',
+					bottom: 'bottom',
+					center: 'center',
+					left: 'left',
+					right: 'right',
+					message: 'top',
+					dialog: 'center',
+					share: 'bottom'
+				},
+				maskClass: {
+					position: 'fixed',
+					bottom: 0,
+					top: 0,
+					left: 0,
+					right: 0,
+					backgroundColor: 'rgba(0, 0, 0, 0.4)'
+				},
+				transClass: {
+					position: 'fixed',
+					left: 0,
+					right: 0
+				},
+				maskShow: true,
+				mkclick: true,
+				popupstyle: this.isDesktop ? 'fixforpc-top' : 'top'
+			}
+		},
+		computed: {
+			isDesktop() {
+				return this.popupWidth >= 500 && this.popupHeight >= 500
+			},
+			bg() {
+				if (this.backgroundColor === '' || this.backgroundColor === 'none') {
+					return 'transparent'
+				}
+				return this.backgroundColor
+			}
+		},
+		mounted() {
+			const fixSize = () => {
+				const {
+					windowWidth,
+					windowHeight,
+					windowTop,
+					safeArea,
+					screenHeight,
+					safeAreaInsets
+				} = uni.getSystemInfoSync()
+				this.popupWidth = windowWidth
+				this.popupHeight = windowHeight + (windowTop || 0)
+				// TODO fix by mehaotian 是否适配底部安全区 ,目前微信ios 、和 app ios 计算有差异,需要框架修复
+				if (safeArea && this.safeArea) {
+					// #ifdef MP-WEIXIN
+					this.safeAreaInsets = screenHeight - safeArea.bottom
+					// #endif
+					// #ifndef MP-WEIXIN
+					this.safeAreaInsets = safeAreaInsets.bottom
+					// #endif
+				} else {
+					this.safeAreaInsets = 0
+				}
+			}
+			fixSize()
+			// #ifdef H5
+			// window.addEventListener('resize', fixSize)
+			// this.$once('hook:beforeDestroy', () => {
+			// 	window.removeEventListener('resize', fixSize)
+			// })
+			// #endif
+		},
+		// #ifndef VUE3
+		// TODO vue2
+		destroyed() {
+			this.setH5Visible()
+		},
+		// #endif
+		// #ifdef VUE3
+		// TODO vue3
+		unmounted() {
+			this.setH5Visible()
+		},
+		// #endif
+		created() {
+			// this.mkclick =  this.isMaskClick || this.maskClick
+			if (this.isMaskClick === null && this.maskClick === null) {
+				this.mkclick = true
+			} else {
+				this.mkclick = this.isMaskClick !== null ? this.isMaskClick : this.maskClick
+			}
+			if (this.animation) {
+				this.duration = 300
+			} else {
+				this.duration = 0
+			}
+			// TODO 处理 message 组件生命周期异常的问题
+			this.messageChild = null
+			// TODO 解决头条冒泡的问题
+			this.clearPropagation = false
+			this.maskClass.backgroundColor = this.maskBackgroundColor
+		},
+		methods: {
+			setH5Visible() {
+				// #ifdef H5
+				// fix by mehaotian 处理 h5 滚动穿透的问题
+				document.getElementsByTagName('body')[0].style.overflow = 'visible'
+				// #endif
+			},
+			/**
+			 * 公用方法,不显示遮罩层
+			 */
+			closeMask() {
+				this.maskShow = false
+			},
+			/**
+			 * 公用方法,遮罩层禁止点击
+			 */
+			disableMask() {
+				this.mkclick = false
+			},
+			// TODO nvue 取消冒泡
+			clear(e) {
+				// #ifndef APP-NVUE
+				e.stopPropagation()
+				// #endif
+				this.clearPropagation = true
+			},
+
+			open(direction) {
+				// fix by mehaotian 处理快速打开关闭的情况
+				if (this.showPopup) {
+					clearTimeout(this.timer)
+					this.showPopup = false
+				}
+				let innerType = ['top', 'center', 'bottom', 'left', 'right', 'message', 'dialog', 'share']
+				if (!(direction && innerType.indexOf(direction) !== -1)) {
+					direction = this.type
+				}
+				if (!this.config[direction]) {
+					console.error('缺少类型:', direction)
+					return
+				}
+				this[this.config[direction]]()
+				this.$emit('change', {
+					show: true,
+					type: direction
+				})
+			},
+			close(type) {
+				this.showTrans = false
+				this.$emit('change', {
+					show: false,
+					type: this.type
+				})
+				clearTimeout(this.timer)
+				// // 自定义关闭事件
+				// this.customOpen && this.customClose()
+				this.timer = setTimeout(() => {
+					this.showPopup = false
+				}, 300)
+			},
+			// TODO 处理冒泡事件,头条的冒泡事件有问题 ,先这样兼容
+			touchstart() {
+				this.clearPropagation = false
+			},
+
+			onTap() {
+				if (this.clearPropagation) {
+					// fix by mehaotian 兼容 nvue
+					this.clearPropagation = false
+					return
+				}
+				this.$emit('maskClick')
+				if (!this.mkclick) return
+				this.close()
+			},
+			/**
+			 * 顶部弹出样式处理
+			 */
+			top(type) {
+				this.popupstyle = this.isDesktop ? 'fixforpc-top' : 'top'
+				this.ani = ['slide-top']
+				this.transClass = {
+					position: 'fixed',
+					left: 0,
+					right: 0,
+					backgroundColor: this.bg
+				}
+				// TODO 兼容 type 属性 ,后续会废弃
+				if (type) return
+				this.showPopup = true
+				this.showTrans = true
+				this.$nextTick(() => {
+					if (this.messageChild && this.type === 'message') {
+						this.messageChild.timerClose()
+					}
+				})
+			},
+			/**
+			 * 底部弹出样式处理
+			 */
+			bottom(type) {
+				this.popupstyle = 'bottom'
+				this.ani = ['slide-bottom']
+				this.transClass = {
+					position: 'fixed',
+					left: 0,
+					right: 0,
+					bottom: 0,
+					paddingBottom: this.safeAreaInsets + 'px',
+					backgroundColor: this.bg
+				}
+				// TODO 兼容 type 属性 ,后续会废弃
+				if (type) return
+				this.showPopup = true
+				this.showTrans = true
+			},
+			/**
+			 * 中间弹出样式处理
+			 */
+			center(type) {
+				this.popupstyle = 'center'
+				this.ani = ['zoom-out', 'fade']
+				this.transClass = {
+					position: 'fixed',
+					/* #ifndef APP-NVUE */
+					display: 'flex',
+					flexDirection: 'column',
+					/* #endif */
+					bottom: 0,
+					left: 0,
+					right: 0,
+					top: 0,
+					justifyContent: 'center',
+					alignItems: 'center'
+				}
+				// TODO 兼容 type 属性 ,后续会废弃
+				if (type) return
+				this.showPopup = true
+				this.showTrans = true
+			},
+			left(type) {
+				this.popupstyle = 'left'
+				this.ani = ['slide-left']
+				this.transClass = {
+					position: 'fixed',
+					left: 0,
+					bottom: 0,
+					top: 0,
+					backgroundColor: this.bg,
+					/* #ifndef APP-NVUE */
+					display: 'flex',
+					flexDirection: 'column'
+					/* #endif */
+				}
+				// TODO 兼容 type 属性 ,后续会废弃
+				if (type) return
+				this.showPopup = true
+				this.showTrans = true
+			},
+			right(type) {
+				this.popupstyle = 'right'
+				this.ani = ['slide-right']
+				this.transClass = {
+					position: 'fixed',
+					bottom: 0,
+					right: 0,
+					top: 0,
+					backgroundColor: this.bg,
+					/* #ifndef APP-NVUE */
+					display: 'flex',
+					flexDirection: 'column'
+					/* #endif */
+				}
+				// TODO 兼容 type 属性 ,后续会废弃
+				if (type) return
+				this.showPopup = true
+				this.showTrans = true
+			}
+		}
+	}
+</script>
+<style lang="scss">
+	.uni-popup {
+		position: fixed;
+		/* #ifndef APP-NVUE */
+		z-index: 99;
+
+		/* #endif */
+		&.top,
+		&.left,
+		&.right {
+			/* #ifdef H5 */
+			top: var(--window-top);
+			/* #endif */
+			/* #ifndef H5 */
+			top: 0;
+			/* #endif */
+		}
+
+		.uni-popup__wrapper {
+			/* #ifndef APP-NVUE */
+			display: block;
+			/* #endif */
+			position: relative;
+
+			/* iphonex 等安全区设置,底部安全区适配 */
+			/* #ifndef APP-NVUE */
+			// padding-bottom: constant(safe-area-inset-bottom);
+			// padding-bottom: env(safe-area-inset-bottom);
+			/* #endif */
+			&.left,
+			&.right {
+				/* #ifdef H5 */
+				padding-top: var(--window-top);
+				/* #endif */
+				/* #ifndef H5 */
+				padding-top: 0;
+				/* #endif */
+				flex: 1;
+			}
+		}
+	}
+
+	.fixforpc-z-index {
+		/* #ifndef APP-NVUE */
+		z-index: 999;
+		/* #endif */
+	}
+
+	.fixforpc-top {
+		top: 0;
+	}
 </style>

+ 1 - 1
uni_modules/uni-table/components/uni-table/uni-table.vue

@@ -125,7 +125,7 @@ export default {
 			} else {
 				startIndex = theadChildren.rowspan - 1
 			}
-			let isHaveData = this.data && this.data.length.length > 0
+			let isHaveData = this.data && this.data.length > 0
 			theadChildren.checked = true
 			theadChildren.indeterminate = false
 			this.trChildren.forEach((item, index) => {

+ 269 - 265
uni_modules/uni-transition/components/uni-transition/uni-transition.vue

@@ -1,277 +1,281 @@
-<template>
-	<view v-if="isShow" ref="ani" :animation="animationData" :class="customClass" :style="transformStyles" @click="onClick"><slot></slot></view>
-</template>
-
-<script>
-import { createAnimation } from './createAnimation'
-
-/**
- * Transition 过渡动画
- * @description 简单过渡动画组件
- * @tutorial https://ext.dcloud.net.cn/plugin?id=985
- * @property {Boolean} show = [false|true] 控制组件显示或隐藏
- * @property {Array|String} modeClass = [fade|slide-top|slide-right|slide-bottom|slide-left|zoom-in|zoom-out] 过渡动画类型
- *  @value fade 渐隐渐出过渡
- *  @value slide-top 由上至下过渡
- *  @value slide-right 由右至左过渡
- *  @value slide-bottom 由下至上过渡
- *  @value slide-left 由左至右过渡
- *  @value zoom-in 由小到大过渡
- *  @value zoom-out 由大到小过渡
- * @property {Number} duration 过渡动画持续时间
- * @property {Object} styles 组件样式,同 css 样式,注意带’-‘连接符的属性需要使用小驼峰写法如:`backgroundColor:red`
- */
-export default {
-	name: 'uniTransition',
-	emits:['click','change'],
-	props: {
-		show: {
-			type: Boolean,
-			default: false
-		},
-		modeClass: {
-			type: [Array, String],
-			default() {
-				return 'fade'
-			}
-		},
-		duration: {
-			type: Number,
-			default: 300
-		},
-		styles: {
-			type: Object,
-			default() {
-				return {}
-			}
+<template>
+	<view v-if="isShow||onceRender" v-show="isShow" ref="ani" :animation="animationData" :class="customClass" :style="transformStyles" @click="onClick"><slot></slot></view>
+</template>
+
+<script>
+import { createAnimation } from './createAnimation'
+
+/**
+ * Transition 过渡动画
+ * @description 简单过渡动画组件
+ * @tutorial https://ext.dcloud.net.cn/plugin?id=985
+ * @property {Boolean} show = [false|true] 控制组件显示或隐藏
+ * @property {Array|String} modeClass = [fade|slide-top|slide-right|slide-bottom|slide-left|zoom-in|zoom-out] 过渡动画类型
+ *  @value fade 渐隐渐出过渡
+ *  @value slide-top 由上至下过渡
+ *  @value slide-right 由右至左过渡
+ *  @value slide-bottom 由下至上过渡
+ *  @value slide-left 由左至右过渡
+ *  @value zoom-in 由小到大过渡
+ *  @value zoom-out 由大到小过渡
+ * @property {Number} duration 过渡动画持续时间
+ * @property {Object} styles 组件样式,同 css 样式,注意带’-‘连接符的属性需要使用小驼峰写法如:`backgroundColor:red`
+ */
+export default {
+	name: 'uniTransition',
+	emits:['click','change'],
+	props: {
+		show: {
+			type: Boolean,
+			default: false
+		},
+		modeClass: {
+			type: [Array, String],
+			default() {
+				return 'fade'
+			}
+		},
+		duration: {
+			type: Number,
+			default: 300
+		},
+		styles: {
+			type: Object,
+			default() {
+				return {}
+			}
 		},
 		customClass:{
 			type: String,
 			default: ''
-		}
-	},
-	data() {
-		return {
-			isShow: false,
-			transform: '',
-			opacity: 1,
-			animationData: {},
-			durationTime: 300,
-			config: {}
-		}
-	},
-	watch: {
-		show: {
-			handler(newVal) {
-				if (newVal) {
-					this.open()
-				} else {
-					// 避免上来就执行 close,导致动画错乱
-					if (this.isShow) {
-						this.close()
-					}
-				}
-			},
-			immediate: true
-		}
-	},
-	computed: {
-		// 生成样式数据
-		stylesObject() {
-			let styles = {
-				...this.styles,
-				'transition-duration': this.duration / 1000 + 's'
-			}
-			let transform = ''
-			for (let i in styles) {
-				let line = this.toLine(i)
-				transform += line + ':' + styles[i] + ';'
-			}
-			return transform
-		},
-		// 初始化动画条件
-		transformStyles() {
-			return 'transform:' + this.transform + ';' + 'opacity:' + this.opacity + ';' + this.stylesObject
-		}
-	},
-	created() {
-		// 动画默认配置
-		this.config = {
-			duration: this.duration,
-			timingFunction: 'ease',
-			transformOrigin: '50% 50%',
-			delay: 0
-		}
-		this.durationTime = this.duration
-	},
-	methods: {
-		/**
-		 *  ref 触发 初始化动画
-		 */
-		init(obj = {}) {
-			if (obj.duration) {
-				this.durationTime = obj.duration
-			}
-			this.animation = createAnimation(Object.assign(this.config, obj),this)
-		},
-		/**
-		 * 点击组件触发回调
-		 */
-		onClick() {
-			this.$emit('click', {
-				detail: this.isShow
-			})
-		},
-		/**
-		 * ref 触发 动画分组
-		 * @param {Object} obj
-		 */
-		step(obj, config = {}) {
+		},
+		onceRender:{
+			type:Boolean,
+			default:false
+		},
+	},
+	data() {
+		return {
+			isShow: false,
+			transform: '',
+			opacity: 1,
+			animationData: {},
+			durationTime: 300,
+			config: {}
+		}
+	},
+	watch: {
+		show: {
+			handler(newVal) {
+				if (newVal) {
+					this.open()
+				} else {
+					// 避免上来就执行 close,导致动画错乱
+					if (this.isShow) {
+						this.close()
+					}
+				}
+			},
+			immediate: true
+		}
+	},
+	computed: {
+		// 生成样式数据
+		stylesObject() {
+			let styles = {
+				...this.styles,
+				'transition-duration': this.duration / 1000 + 's'
+			}
+			let transform = ''
+			for (let i in styles) {
+				let line = this.toLine(i)
+				transform += line + ':' + styles[i] + ';'
+			}
+			return transform
+		},
+		// 初始化动画条件
+		transformStyles() {
+			return 'transform:' + this.transform + ';' + 'opacity:' + this.opacity + ';' + this.stylesObject
+		}
+	},
+	created() {
+		// 动画默认配置
+		this.config = {
+			duration: this.duration,
+			timingFunction: 'ease',
+			transformOrigin: '50% 50%',
+			delay: 0
+		}
+		this.durationTime = this.duration
+	},
+	methods: {
+		/**
+		 *  ref 触发 初始化动画
+		 */
+		init(obj = {}) {
+			if (obj.duration) {
+				this.durationTime = obj.duration
+			}
+			this.animation = createAnimation(Object.assign(this.config, obj),this)
+		},
+		/**
+		 * 点击组件触发回调
+		 */
+		onClick() {
+			this.$emit('click', {
+				detail: this.isShow
+			})
+		},
+		/**
+		 * ref 触发 动画分组
+		 * @param {Object} obj
+		 */
+		step(obj, config = {}) {
 			if (!this.animation) return
-			for (let i in obj) {
+			for (let i in obj) {
 				try {
 					if(typeof obj[i] === 'object'){
 						this.animation[i](...obj[i])
 					}else{
 						this.animation[i](obj[i])
-					}
-				} catch (e) {
-					console.error(`方法 ${i} 不存在`)
-				}
-			}
+					}
+				} catch (e) {
+					console.error(`方法 ${i} 不存在`)
+				}
+			}
 			this.animation.step(config)
-			return this
-		},
-		/**
-		 *  ref 触发 执行动画
-		 */
-		run(fn) {
-			if (!this.animation) return
-			this.animation.run(fn)
-		},
-		// 开始过度动画
-		open() {
-			clearTimeout(this.timer)
-			this.transform = ''
-			this.isShow = true
-			let { opacity, transform } = this.styleInit(false)
-			if (typeof opacity !== 'undefined') {
-				this.opacity = opacity
-			}
-			this.transform = transform
-			// 确保动态样式已经生效后,执行动画,如果不加 nextTick ,会导致 wx 动画执行异常
-			this.$nextTick(() => {
-				// TODO 定时器保证动画完全执行,目前有些问题,后面会取消定时器
-				this.timer = setTimeout(() => {
-					this.animation = createAnimation(this.config, this)
-					this.tranfromInit(false).step()
-					this.animation.run()
-					this.$emit('change', {
-						detail: this.isShow
-					})
-				}, 20)
-			})
-		},
-		// 关闭过度动画
-		close(type) {
-			if (!this.animation) return
-			this.tranfromInit(true)
-				.step()
-				.run(() => {
-					this.isShow = false
-					this.animationData = null
-					this.animation = null
-					let { opacity, transform } = this.styleInit(false)
-					this.opacity = opacity || 1
-					this.transform = transform
-					this.$emit('change', {
-						detail: this.isShow
-					})
-				})
-		},
-		// 处理动画开始前的默认样式
-		styleInit(type) {
-			let styles = {
-				transform: ''
-			}
-			let buildStyle = (type, mode) => {
-				if (mode === 'fade') {
-					styles.opacity = this.animationType(type)[mode]
-				} else {
-					styles.transform += this.animationType(type)[mode] + ' '
-				}
-			}
-			if (typeof this.modeClass === 'string') {
-				buildStyle(type, this.modeClass)
-			} else {
-				this.modeClass.forEach(mode => {
-					buildStyle(type, mode)
-				})
-			}
-			return styles
-		},
-		// 处理内置组合动画
-		tranfromInit(type) {
-			let buildTranfrom = (type, mode) => {
-				let aniNum = null
-				if (mode === 'fade') {
-					aniNum = type ? 0 : 1
-				} else {
-					aniNum = type ? '-100%' : '0'
-					if (mode === 'zoom-in') {
-						aniNum = type ? 0.8 : 1
-					}
-					if (mode === 'zoom-out') {
-						aniNum = type ? 1.2 : 1
-					}
-					if (mode === 'slide-right') {
-						aniNum = type ? '100%' : '0'
-					}
-					if (mode === 'slide-bottom') {
-						aniNum = type ? '100%' : '0'
-					}
-				}
-				this.animation[this.animationMode()[mode]](aniNum)
-			}
-			if (typeof this.modeClass === 'string') {
-				buildTranfrom(type, this.modeClass)
-			} else {
-				this.modeClass.forEach(mode => {
-					buildTranfrom(type, mode)
-				})
-			}
-
-			return this.animation
-		},
-		animationType(type) {
-			return {
-				fade: type ? 1 : 0,
-				'slide-top': `translateY(${type ? '0' : '-100%'})`,
-				'slide-right': `translateX(${type ? '0' : '100%'})`,
-				'slide-bottom': `translateY(${type ? '0' : '100%'})`,
-				'slide-left': `translateX(${type ? '0' : '-100%'})`,
-				'zoom-in': `scaleX(${type ? 1 : 0.8}) scaleY(${type ? 1 : 0.8})`,
-				'zoom-out': `scaleX(${type ? 1 : 1.2}) scaleY(${type ? 1 : 1.2})`
-			}
-		},
-		// 内置动画类型与实际动画对应字典
-		animationMode() {
-			return {
-				fade: 'opacity',
-				'slide-top': 'translateY',
-				'slide-right': 'translateX',
-				'slide-bottom': 'translateY',
-				'slide-left': 'translateX',
-				'zoom-in': 'scale',
-				'zoom-out': 'scale'
-			}
-		},
-		// 驼峰转中横线
-		toLine(name) {
-			return name.replace(/([A-Z])/g, '-$1').toLowerCase()
-		}
-	}
-}
-</script>
-
+			return this
+		},
+		/**
+		 *  ref 触发 执行动画
+		 */
+		run(fn) {
+			if (!this.animation) return
+			this.animation.run(fn)
+		},
+		// 开始过度动画
+		open() {
+			clearTimeout(this.timer)
+			this.transform = ''
+			this.isShow = true
+			let { opacity, transform } = this.styleInit(false)
+			if (typeof opacity !== 'undefined') {
+				this.opacity = opacity
+			}
+			this.transform = transform
+			// 确保动态样式已经生效后,执行动画,如果不加 nextTick ,会导致 wx 动画执行异常
+			this.$nextTick(() => {
+				// TODO 定时器保证动画完全执行,目前有些问题,后面会取消定时器
+				this.timer = setTimeout(() => {
+					this.animation = createAnimation(this.config, this)
+					this.tranfromInit(false).step()
+					this.animation.run()
+					this.$emit('change', {
+						detail: this.isShow
+					})
+				}, 20)
+			})
+		},
+		// 关闭过度动画
+		close(type) {
+			if (!this.animation) return
+			this.tranfromInit(true)
+				.step()
+				.run(() => {
+					this.isShow = false
+					this.animationData = null
+					this.animation = null
+					let { opacity, transform } = this.styleInit(false)
+					this.opacity = opacity || 1
+					this.transform = transform
+					this.$emit('change', {
+						detail: this.isShow
+					})
+				})
+		},
+		// 处理动画开始前的默认样式
+		styleInit(type) {
+			let styles = {
+				transform: ''
+			}
+			let buildStyle = (type, mode) => {
+				if (mode === 'fade') {
+					styles.opacity = this.animationType(type)[mode]
+				} else {
+					styles.transform += this.animationType(type)[mode] + ' '
+				}
+			}
+			if (typeof this.modeClass === 'string') {
+				buildStyle(type, this.modeClass)
+			} else {
+				this.modeClass.forEach(mode => {
+					buildStyle(type, mode)
+				})
+			}
+			return styles
+		},
+		// 处理内置组合动画
+		tranfromInit(type) {
+			let buildTranfrom = (type, mode) => {
+				let aniNum = null
+				if (mode === 'fade') {
+					aniNum = type ? 0 : 1
+				} else {
+					aniNum = type ? '-100%' : '0'
+					if (mode === 'zoom-in') {
+						aniNum = type ? 0.8 : 1
+					}
+					if (mode === 'zoom-out') {
+						aniNum = type ? 1.2 : 1
+					}
+					if (mode === 'slide-right') {
+						aniNum = type ? '100%' : '0'
+					}
+					if (mode === 'slide-bottom') {
+						aniNum = type ? '100%' : '0'
+					}
+				}
+				this.animation[this.animationMode()[mode]](aniNum)
+			}
+			if (typeof this.modeClass === 'string') {
+				buildTranfrom(type, this.modeClass)
+			} else {
+				this.modeClass.forEach(mode => {
+					buildTranfrom(type, mode)
+				})
+			}
+
+			return this.animation
+		},
+		animationType(type) {
+			return {
+				fade: type ? 1 : 0,
+				'slide-top': `translateY(${type ? '0' : '-100%'})`,
+				'slide-right': `translateX(${type ? '0' : '100%'})`,
+				'slide-bottom': `translateY(${type ? '0' : '100%'})`,
+				'slide-left': `translateX(${type ? '0' : '-100%'})`,
+				'zoom-in': `scaleX(${type ? 1 : 0.8}) scaleY(${type ? 1 : 0.8})`,
+				'zoom-out': `scaleX(${type ? 1 : 1.2}) scaleY(${type ? 1 : 1.2})`
+			}
+		},
+		// 内置动画类型与实际动画对应字典
+		animationMode() {
+			return {
+				fade: 'opacity',
+				'slide-top': 'translateY',
+				'slide-right': 'translateX',
+				'slide-bottom': 'translateY',
+				'slide-left': 'translateX',
+				'zoom-in': 'scale',
+				'zoom-out': 'scale'
+			}
+		},
+		// 驼峰转中横线
+		toLine(name) {
+			return name.replace(/([A-Z])/g, '-$1').toLowerCase()
+		}
+	}
+}
+</script>
+
 <style></style>