lilei преди 4 години
родител
ревизия
86dd94f996
променени са 97 файла, в които са добавени 1223 реда и са изтрити 853 реда
  1. 4 2
      api/taskTarget.js
  2. 9 8
      hybrid/html/video.html
  3. 4 0
      node_modules/uview-ui/README.md
  4. 12 4
      node_modules/uview-ui/components/u-action-sheet/u-action-sheet.vue
  5. 1 1
      node_modules/uview-ui/components/u-alert-tips/u-alert-tips.vue
  6. 3 3
      node_modules/uview-ui/components/u-avatar-cropper/u-avatar-cropper.vue
  7. 0 0
      node_modules/uview-ui/components/u-avatar/u-avatar.vue
  8. 2 2
      node_modules/uview-ui/components/u-back-top/u-back-top.vue
  9. 4 1
      node_modules/uview-ui/components/u-badge/u-badge.vue
  10. 23 5
      node_modules/uview-ui/components/u-button/u-button.vue
  11. 6 8
      node_modules/uview-ui/components/u-calendar/u-calendar.vue
  12. 8 5
      node_modules/uview-ui/components/u-car-keyboard/u-car-keyboard.vue
  13. 1 0
      node_modules/uview-ui/components/u-cell-group/u-cell-group.vue
  14. 23 7
      node_modules/uview-ui/components/u-cell-item/u-cell-item.vue
  15. 4 3
      node_modules/uview-ui/components/u-checkbox-group/u-checkbox-group.vue
  16. 23 14
      node_modules/uview-ui/components/u-checkbox/u-checkbox.vue
  17. 3 1
      node_modules/uview-ui/components/u-circle-progress/u-circle-progress.vue
  18. 19 3
      node_modules/uview-ui/components/u-col/u-col.vue
  19. 22 24
      node_modules/uview-ui/components/u-collapse-item/u-collapse-item.vue
  20. 0 5
      node_modules/uview-ui/components/u-collapse/u-collapse.vue
  21. 9 5
      node_modules/uview-ui/components/u-column-notice/u-column-notice.vue
  22. 8 5
      node_modules/uview-ui/components/u-count-down/u-count-down.vue
  23. 3 1
      node_modules/uview-ui/components/u-count-to/u-count-to.vue
  24. 4 2
      node_modules/uview-ui/components/u-divider/u-divider.vue
  25. 26 14
      node_modules/uview-ui/components/u-dropdown-item/u-dropdown-item.vue
  26. 28 16
      node_modules/uview-ui/components/u-dropdown/u-dropdown.vue
  27. 2 2
      node_modules/uview-ui/components/u-empty/u-empty.vue
  28. 7 5
      node_modules/uview-ui/components/u-field/u-field.vue
  29. 271 241
      node_modules/uview-ui/components/u-form-item/u-form-item.vue
  30. 0 15
      node_modules/uview-ui/components/u-form/u-form.vue
  31. 34 21
      node_modules/uview-ui/components/u-grid-item/u-grid-item.vue
  32. 19 6
      node_modules/uview-ui/components/u-grid/u-grid.vue
  33. 8 0
      node_modules/uview-ui/components/u-icon/u-icon.vue
  34. 1 1
      node_modules/uview-ui/components/u-image/u-image.vue
  35. 8 3
      node_modules/uview-ui/components/u-index-anchor/u-index-anchor.vue
  36. 3 9
      node_modules/uview-ui/components/u-index-list/u-index-list.vue
  37. 28 7
      node_modules/uview-ui/components/u-input/u-input.vue
  38. 1 1
      node_modules/uview-ui/components/u-keyboard/u-keyboard.vue
  39. 2 0
      node_modules/uview-ui/components/u-lazy-load/u-lazy-load.vue
  40. 3 1
      node_modules/uview-ui/components/u-line-progress/u-line-progress.vue
  41. 4 4
      node_modules/uview-ui/components/u-link/u-link.vue
  42. 3 1
      node_modules/uview-ui/components/u-loading/u-loading.vue
  43. 25 21
      node_modules/uview-ui/components/u-loadmore/u-loadmore.vue
  44. 1 1
      node_modules/uview-ui/components/u-mask/u-mask.vue
  45. 19 12
      node_modules/uview-ui/components/u-message-input/u-message-input.vue
  46. 1 1
      node_modules/uview-ui/components/u-modal/u-modal.vue
  47. 5 5
      node_modules/uview-ui/components/u-navbar/u-navbar.vue
  48. 2 2
      node_modules/uview-ui/components/u-no-network/u-no-network.vue
  49. 4 4
      node_modules/uview-ui/components/u-notice-bar/u-notice-bar.vue
  50. 13 2
      node_modules/uview-ui/components/u-number-box/u-number-box.vue
  51. 3 3
      node_modules/uview-ui/components/u-number-keyboard/u-number-keyboard.vue
  52. 3 3
      node_modules/uview-ui/components/u-parse/libs/MpHtmlParser.js
  53. 1 1
      node_modules/uview-ui/components/u-parse/libs/trees.vue
  54. 8 4
      node_modules/uview-ui/components/u-parse/u-parse.vue
  55. 2 2
      node_modules/uview-ui/components/u-picker/u-picker.vue
  56. 11 7
      node_modules/uview-ui/components/u-popup/u-popup.vue
  57. 32 9
      node_modules/uview-ui/components/u-radio-group/u-radio-group.vue
  58. 60 26
      node_modules/uview-ui/components/u-radio/u-radio.vue
  59. 6 4
      node_modules/uview-ui/components/u-rate/u-rate.vue
  60. 2 2
      node_modules/uview-ui/components/u-read-more/u-read-more.vue
  61. 5 3
      node_modules/uview-ui/components/u-row-notice/u-row-notice.vue
  62. 3 8
      node_modules/uview-ui/components/u-row/u-row.vue
  63. 14 14
      node_modules/uview-ui/components/u-search/u-search.vue
  64. 3 3
      node_modules/uview-ui/components/u-section/u-section.vue
  65. 2 2
      node_modules/uview-ui/components/u-select/u-select.vue
  66. 6 6
      node_modules/uview-ui/components/u-steps/u-steps.vue
  67. 3 4
      node_modules/uview-ui/components/u-subsection/u-subsection.vue
  68. 1 1
      node_modules/uview-ui/components/u-swipe-action/u-swipe-action.vue
  69. 8 6
      node_modules/uview-ui/components/u-swiper/u-swiper.vue
  70. 4 2
      node_modules/uview-ui/components/u-switch/u-switch.vue
  71. 19 12
      node_modules/uview-ui/components/u-tabbar/u-tabbar.vue
  72. 0 5
      node_modules/uview-ui/components/u-table/u-table.vue
  73. 4 2
      node_modules/uview-ui/components/u-tabs-swiper/u-tabs-swiper.vue
  74. 8 2
      node_modules/uview-ui/components/u-tabs/u-tabs.vue
  75. 4 2
      node_modules/uview-ui/components/u-tag/u-tag.vue
  76. 25 61
      node_modules/uview-ui/components/u-td/u-td.vue
  77. 20 11
      node_modules/uview-ui/components/u-th/u-th.vue
  78. 2 2
      node_modules/uview-ui/components/u-time-line-item/u-time-line-item.vue
  79. 32 34
      node_modules/uview-ui/components/u-toast/u-toast.vue
  80. 1 1
      node_modules/uview-ui/components/u-top-tips/u-top-tips.vue
  81. 1 1
      node_modules/uview-ui/components/u-tr/u-tr.vue
  82. 51 13
      node_modules/uview-ui/components/u-upload/u-upload.vue
  83. 2 7
      node_modules/uview-ui/components/u-waterfall/u-waterfall.vue
  84. 1 1
      node_modules/uview-ui/index.js
  85. 2 2
      node_modules/uview-ui/libs/config/config.js
  86. 5 0
      node_modules/uview-ui/libs/css/common.scss
  87. 6 2
      node_modules/uview-ui/libs/css/style.components.scss
  88. 27 2
      node_modules/uview-ui/libs/css/style.mp.scss
  89. 2 1
      node_modules/uview-ui/libs/css/style.vue.scss
  90. 15 1
      node_modules/uview-ui/libs/mixin/mixin.js
  91. 11 11
      node_modules/uview-ui/package.json
  92. 6 6
      package-lock.json
  93. 2 2
      package.json
  94. 3 1
      pages/shopTour/shopTour.vue
  95. 75 49
      unpackage/dist/dev/app-plus/app-service.js
  96. 0 0
      unpackage/dist/dev/app-plus/app-view.js
  97. 9 8
      unpackage/dist/dev/app-plus/hybrid/html/video.html

+ 4 - 2
api/taskTarget.js

@@ -3,7 +3,8 @@ import axios from '@/libs/axios.js'
 export const taskCommentsSave = params => {
   return axios.request({
     url: `taskTarget/comments/save`,
-    method: 'post'
+    method: 'post',
+	data: params
   })
 }
 // 查询点检任务列表根据任务ID
@@ -17,6 +18,7 @@ export const getTaskTargetById = params => {
 export const taskTargetSave = params => {
   return axios.request({
     url: `taskTarget/save`,
-    method: 'post'
+    method: 'post',
+	data: params
   })
 }

+ 9 - 8
hybrid/html/video.html

@@ -124,15 +124,15 @@
               <div><!-- 分值:{{zb.getScore}} <a-icon @click="openEditFs" type="edit" style="font-size: 20px;margin-left: 10px;"/> --></div>
               <div>
 				  <!-- 不适用 -->
-                <a-icon @click="selZbResult(0,zb)" type="minus-circle" :class="zb.result=='bsy'?'choose-bsy':''"/>
+                <a-icon @click="selZbResult(0,zb)" type="minus-circle" :class="zb.result=='NOT_WORK'?'choose-bsy':''"/>
               </div>
 			  <div>
 				  <!-- 不合格 -->
-				  <a-icon @click="selZbResult(1,zb)" type="close-circle" :class="zb.result=='bhg'?'choose-bhg':''"/>
+				  <a-icon @click="selZbResult(1,zb)" type="close-circle" :class="zb.result=='NOT_PASS'?'choose-bhg':''"/>
 			  </div>
 			  <div>
 				  <!-- 合格 -->
-				  <a-icon @click="selZbResult(2,zb)" type="check-circle" :class="zb.result=='hg'?'choose-hg':''"/>
+				  <a-icon @click="selZbResult(2,zb)" type="check-circle" :class="zb.result=='PASS'?'choose-hg':''"/>
 			  </div>
             </div>
           </div>
@@ -451,15 +451,16 @@
 		  // 评分,0 不适用,1 不合格,2 合格
 		  selZbResult(type,zb){
 			  let {id,taskItemId,taskId} = zb
-			  this.sendMsg('selZbResult',JSON.stringify({result:type,id:id,taskItemId:taskItemId,taskId:taskId}))
+			  let result = ['NOT_WORK','NOT_PASS','PASS']
+			  this.sendMsg('selZbResult',JSON.stringify({result:result[type],id:id,taskItemId:taskItemId,taskId:taskId}))
 		  },
 		  // 保存指标结果成功
-		  saveZbResultSuccess(id,result){
-			  console.log(result)
-			  let ret = ['bsy','bhg','hg']
+		  saveZbResultSuccess(data){
+			  let {id,result} = JSON.parse(data)
+			  console.log(id,result)
 			  let zb = this.zbItem.find(item=> item.id == id)
 			  if(zb){
-				  zb.result = ret[result]
+				  zb.result = result
 				  // 更新考评项已完成指标数
 				  this.updateKpFinish()
 			  }

+ 4 - 0
node_modules/uview-ui/README.md

@@ -55,7 +55,11 @@ Vue.use(uView);
 // pages.json
 {
 	"easycom": {
+		// npm安装的方式不需要前面的"@/",下载安装的方式需要"@/"
+		// npm安装方式
 		"^u-(.*)": "uview-ui/components/u-$1/u-$1.vue"
+		// 下载安装方式
+		// "^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue"
 	},
 	// 此为本身已有的内容
 	"pages": [

+ 12 - 4
node_modules/uview-ui/components/u-action-sheet/u-action-sheet.vue

@@ -9,11 +9,12 @@
 				@touchmove.stop.prevent 
 				@tap="itemClick(index)" 
 				:style="[itemStyle(index)]" 
-				class="u-action-sheet-item" 
+				class="u-action-sheet-item u-line-1" 
 				:class="[index < list.length - 1 ? 'u-border-bottom' : '']"
 				:hover-stay-time="150"
 			>
-				{{item.text}}
+				<text>{{item.text}}</text>
+				<text class="u-action-sheet-item__subtext u-line-1" v-if="item.subText">{{item.subText}}</text>
 			</view>
 		</block>
 		<view class="u-gab" v-if="cancelBtn">
@@ -163,12 +164,19 @@
 	}
 
 	.u-action-sheet-item {
-		display: flex;
+		@include vue-flex;;
 		line-height: 1;
 		justify-content: center;
 		align-items: center;
-		font-size: 34rpx;
+		font-size: 32rpx;
 		padding: 34rpx 0;
+		flex-direction: column;
+	}
+	
+	.u-action-sheet-item__subtext {
+		font-size: 24rpx;
+		color: $u-tips-color;
+		margin-top: 20rpx;
 	}
 
 	.u-gab {

+ 1 - 1
node_modules/uview-ui/components/u-alert-tips/u-alert-tips.vue

@@ -166,7 +166,7 @@
 	@import "../../libs/css/style.components.scss";
 	
 	.u-alert-tips {
-		display: flex;
+		@include vue-flex;
 		align-items: center;
 		padding: 16rpx 30rpx;
 		border-radius: 8rpx;

+ 3 - 3
node_modules/uview-ui/components/u-avatar-cropper/u-avatar-cropper.vue

@@ -229,7 +229,7 @@ export default {
 };
 </script>
 
-<style scoped>
+<style scoped lang="scss">
 @import '../../libs/css/style.components.scss';
 
 .content {
@@ -252,7 +252,7 @@ export default {
 
 .cropper-wrapper {
 	position: relative;
-	display: flex;
+	@include vue-flex;
 	flex-direction: row;
 	justify-content: space-between;
 	align-items: center;
@@ -262,7 +262,7 @@ export default {
 
 .cropper-buttons {
 	width: 100vw;
-	display: flex;
+	@include vue-flex;
 	flex-direction: row;
 	justify-content: space-between;
 	align-items: center;

Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
node_modules/uview-ui/components/u-avatar/u-avatar.vue


+ 2 - 2
node_modules/uview-ui/components/u-back-top/u-back-top.vue

@@ -130,7 +130,7 @@
 		height: 80rpx;
 		position: fixed;
 		z-index: 9;
-		display: flex;
+		@include vue-flex;
 		flex-direction: column;
 		justify-content: center;
 		background-color: #E1E1E1;
@@ -139,7 +139,7 @@
 		transition: opacity 0.4s;
 		
 		&__content {
-			display: flex;
+			@include vue-flex;
 			flex-direction: column;
 			align-items: center;
 			

+ 4 - 1
node_modules/uview-ui/components/u-badge/u-badge.vue

@@ -141,12 +141,15 @@
 	@import "../../libs/css/style.components.scss";
 	
 	.u-badge {
+		/* #ifndef APP-NVUE */
 		display: inline-flex;
+		/* #endif */
 		justify-content: center;
 		align-items: center;
 		line-height: 24rpx;
 		padding: 4rpx 8rpx;
 		border-radius: 100rpx;
+		z-index: 9;
 		
 		&--bg--primary {
 			background-color: $u-type-primary;
@@ -207,7 +210,7 @@
 	// }
 	
 	.u-info {
-		background: $u-type-info;
+		background-color: $u-type-info;
 		color: #fff;
 	}
 </style>

+ 23 - 5
node_modules/uview-ui/components/u-button/u-button.vue

@@ -11,6 +11,8 @@
 			'u-btn--' + type,
 			disabled ? `u-btn--${type}--disabled` : '',
 		]"
+		:hover-start-time="Number(hoverStartTime)"
+		:hover-stay-time="Number(hoverStayTime)"
 		:disabled="disabled"
 		:form-type="formType"
 		:open-type="openType"
@@ -211,7 +213,17 @@ export default {
 		throttleTime: {
 			type: [String, Number],
 			default: 1000
-		}
+		},
+		// 按住后多久出现点击态,单位毫秒
+		hoverStartTime: {
+			type: [String, Number],
+			default: 20
+		},
+		// 手指松开后点击态保留时间,单位毫秒
+		hoverStayTime: {
+			type: [String, Number],
+			default: 150
+		},
 	},
 	computed: {
 		// 当没有传bgColor变量时,按钮按下去的颜色类名
@@ -339,11 +351,13 @@ export default {
 	position: relative;
 	border: 0;
 	//border-radius: 10rpx;
-	display: inline-block;
+	/* #ifndef APP-NVUE */
+	display: inline-flex;		
+	/* #endif */
 	// 避免边框某些场景可能被“裁剪”,不能设置为hidden
 	overflow: visible;
 	line-height: 1;
-	display: flex;
+	@include vue-flex;
 	align-items: center;
 	justify-content: center;
 	cursor: pointer;
@@ -497,7 +511,9 @@ export default {
 }
 
 .u-size-medium {
-	display: inline-flex;
+	/* #ifndef APP-NVUE */
+	display: inline-flex;		
+	/* #endif */
 	width: auto;
 	font-size: 26rpx;
 	height: 70rpx;
@@ -506,7 +522,9 @@ export default {
 }
 
 .u-size-mini {
-	display: inline-flex;
+	/* #ifndef APP-NVUE */
+	display: inline-flex;		
+	/* #endif */
 	width: auto;
 	font-size: 22rpx;
 	padding-top: 1px;

+ 6 - 8
node_modules/uview-ui/components/u-calendar/u-calendar.vue

@@ -502,7 +502,7 @@
 			&__text {
 				margin-top: 30rpx;
 				padding: 0 60rpx;
-				display: flex;
+				@include vue-flex;
 				justify-content: center;
 				align-items: center;
 			}
@@ -525,7 +525,7 @@
 		}
 	
 		&__week-day {
-			display: flex;
+			@include vue-flex;
 			align-items: center;
 			justify-content: center;
 			padding: 6px 0;
@@ -539,7 +539,7 @@
 	
 		&__content {
 			width: 100%;
-			display: flex;
+			@include vue-flex;
 			flex-wrap: wrap;
 			padding: 6px 0;
 			box-sizing: border-box;
@@ -558,7 +558,7 @@
 			
 			&__item {
 				width: 14.2857%;
-				display: flex;
+				@include vue-flex;
 				align-items: center;
 				justify-content: center;
 				padding: 6px 0;
@@ -568,9 +568,7 @@
 				
 				&__inner {
 					height: 84rpx;
-					display: -webkit-box;
-					display: -webkit-flex;
-					display: flex;
+					@include vue-flex;
 					align-items: center;
 					justify-content: center;
 					flex-direction: column;
@@ -619,7 +617,7 @@
 	
 		&__bottom {
 			width: 100%;
-			display: flex;
+			@include vue-flex;
 			align-items: center;
 			justify-content: center;
 			flex-direction: column;

+ 8 - 5
node_modules/uview-ui/components/u-car-keyboard/u-car-keyboard.vue

@@ -1,5 +1,5 @@
 <template>
-	<view class="u-keyboard" @touchmove.stop.prevent>
+	<view class="u-keyboard" @touchmove.stop.prevent="() => {}">
 		<view class="u-keyboard-grids">
 			<block>
 				<view class="u-keyboard-grids-item" v-for="(group, i) in abc ? EngKeyBoardList : areaList" :key="i">
@@ -176,7 +176,7 @@
 	}
 
 	.u-keyboard-grids-item {
-		display: flex;
+		@include vue-flex;
 		align-items: center;
 		justify-content: center;
 	}
@@ -186,7 +186,9 @@
 		width: 62rpx;
 		flex: 0 0 64rpx;
 		height: 80rpx;
-		display: inline-block;
+		/* #ifndef APP-NVUE */
+		display: inline-flex;		
+		/* #endif */
 		font-size: 36rpx;
 		text-align: center;
 		line-height: 80rpx;
@@ -195,6 +197,7 @@
 		border-radius: 8rpx;
 		box-shadow: 0 2rpx 0rpx #888992;
 		font-weight: 500;
+		justify-content: center;
 	}
 
 	.u-carinput-hover {
@@ -208,7 +211,7 @@
 		bottom: 32rpx;
 		height: 80rpx;
 		background-color: rgb(185, 188, 195);
-		display: flex;
+		@include vue-flex;
 		align-items: center;
 		border-radius: 8rpx;
 		justify-content: center;
@@ -225,7 +228,7 @@
 		bottom: 32rpx;
 		height: 80rpx;
 		background-color: #ffffff;
-		display: flex;
+		@include vue-flex;
 		align-items: center;
 		border-radius: 8rpx;
 		justify-content: center;

+ 1 - 0
node_modules/uview-ui/components/u-cell-group/u-cell-group.vue

@@ -65,5 +65,6 @@
 
 	.u-cell-item-box {
 		background-color: #FFFFFF;
+		flex-direction: row;
 	}
 </style>

+ 23 - 7
node_modules/uview-ui/components/u-cell-item/u-cell-item.vue

@@ -35,7 +35,7 @@
 			<block class="u-cell__value" v-if="value">{{ value }}</block>
 			<slot v-else></slot>
 		</view>
-		<view class="u-flex" v-if="$slots['right-icon']">
+		<view class="u-flex u-cell_right" v-if="$slots['right-icon']">
 			<slot name="right-icon"></slot>
 		</view>
 		<u-icon v-if="arrow" name="arrow-right" :style="[arrowStyle]" class="u-icon-wrap u-cell__right-icon-wrap"></u-icon>
@@ -211,9 +211,12 @@ export default {
 <style lang="scss" scoped>
 @import "../../libs/css/style.components.scss";
 .u-cell {
+	@include vue-flex;
+	align-items: center;
 	position: relative;
-	display: flex;
+	/* #ifndef APP-NVUE */
 	box-sizing: border-box;
+	/* #endif */
 	width: 100%;
 	padding: 26rpx 32rpx;
 	font-size: 28rpx;
@@ -240,21 +243,22 @@ export default {
 
 .u-cell__left-icon-wrap,
 .u-cell__right-icon-wrap {
-	display: flex;
+	@include vue-flex;
 	align-items: center;
 	height: 48rpx;
 }
 
 .u-cell-border:after {
-	position: absolute;
+	position: absolute; 
+	/* #ifndef APP-NVUE */
 	box-sizing: border-box;
 	content: ' ';
 	pointer-events: none;
+	border-bottom: 1px solid $u-border-color;
+	/* #endif */
 	right: 0;
 	left: 0;
 	top: 0;
-	border-bottom: 1px solid $u-border-color;
-	-webkit-transform: scaleY(0.5);
 	transform: scaleY(0.5);
 }
 
@@ -267,13 +271,17 @@ export default {
 	font-size: 26rpx;
 	line-height: 36rpx;
 	color: $u-tips-color;
+	/* #ifndef APP-NVUE */
 	word-wrap: break-word;
+	/* #endif */
 }
 
 .u-cell__value {
 	overflow: hidden;
 	text-align: right;
+	/* #ifndef APP-NVUE */
 	vertical-align: middle;
+	/* #endif */
 	color: $u-tips-color;
 	font-size: 26rpx;
 }
@@ -284,17 +292,25 @@ export default {
 }
 
 .u-cell--required {
+	/* #ifndef APP-NVUE */
 	overflow: visible;
-	display: flex;
+	/* #endif */
+	@include vue-flex;
 	align-items: center;
 }
 
 .u-cell--required:before {
 	position: absolute;
+	/* #ifndef APP-NVUE */
 	content: '*';
+	/* #endif */
 	left: 8px;
 	margin-top: 4rpx;
 	font-size: 14px;
 	color: $u-type-error;
 }
+
+.u-cell_right {
+	line-height: 1;
+}
 </style>

+ 4 - 3
node_modules/uview-ui/components/u-checkbox-group/u-checkbox-group.vue

@@ -101,10 +101,11 @@
 				})
 				this.$emit('change', values);
 				// 发出事件,用于在表单组件中嵌入checkbox的情况,进行验证
-				this.$nextTick(() => {
+				// 由于头条小程序执行迟钝,故需要用几十毫秒的延时
+				setTimeout(() => {
 					// 将当前的值发送到 u-form-item 进行校验
 					this.dispatch('u-form-item', 'on-form-change', values);
-				});
+				}, 60)
 			}
 		}
 	}
@@ -114,7 +115,7 @@
 	@import "../../libs/css/style.components.scss";
 
 	.u-checkbox-group {
-		/* #ifndef MP */
+		/* #ifndef MP || APP-NVUE */
 		display: inline-flex;
 		flex-wrap: wrap;
 		/* #endif */

+ 23 - 14
node_modules/uview-ui/components/u-checkbox/u-checkbox.vue

@@ -1,7 +1,7 @@
 <template>
 	<view class="u-checkbox" :style="[checkboxStyle]">
 		<view class="u-checkbox__icon-wrap" @tap="toggle" :class="[iconClass]" :style="[iconStyle]">
-			<u-icon name="checkbox-mark" :size="checkboxIconSize" :color="iconColor"/>
+			<u-icon class="u-checkbox__icon-wrap__icon" name="checkbox-mark" :size="checkboxIconSize" :color="iconColor"/>
 		</view>
 		<view class="u-checkbox__label" @tap="onClickLabel" :style="{
 			fontSize: $u.addUnit(labelSize)
@@ -172,11 +172,14 @@
 			},
 			emitEvent() {
 				this.$emit('change', {
-					value: this.value,
+					value: !this.value,
 					name: this.name
 				})
 				// 执行父组件u-checkbox-group的事件方法
-				if(this.parent && this.parent.emitEvent) this.parent.emitEvent();
+				// 等待下一个周期再执行,因为this.$emit('input')作用于父组件,再反馈到子组件内部,需要时间
+				setTimeout(() => {
+					if(this.parent && this.parent.emitEvent) this.parent.emitEvent();
+				}, 80);
 			},
 			// 设置input的值,这里通过input事件,设置通过v-model绑定的组件的值
 			setValue() {
@@ -190,20 +193,17 @@
 				}
 				// 如果原来为选中状态,那么可以取消
 				if (this.value == true) {
+					this.emitEvent();
 					this.$emit('input', !this.value);
-					// 等待下一个周期再执行,因为this.$emit('input')作用于父组件,再反馈到子组件内部,需要时间
-					this.$nextTick(function() {
-						this.emitEvent();
-					})
-				} else if ((this.parent && checkedNum < this.parent.max) || !this.parent) {
+				} else {
+					// 如果超出最多可选项,提示
+					if(this.parent && checkedNum >= this.parent.max) {
+						return this.$u.toast(`最多可选${this.parent.max}项`);
+					}
 					// 如果原来为未选中状态,需要选中的数量少于父组件中设置的max值,才可以选中
+					this.emitEvent();
 					this.$emit('input', !this.value);
-					// 等待下一个周期再执行,因为this.$emit('input')作用于父组件,再反馈到子组件内部,需要时间
-					this.$nextTick(function() {
-						this.emitEvent();
-					})
 				}
-
 			}
 		}
 	};
@@ -213,7 +213,9 @@
 	@import "../../libs/css/style.components.scss";
 
 	.u-checkbox {
+		/* #ifndef APP-NVUE */
 		display: inline-flex;
+		/* #endif */
 		align-items: center;
 		overflow: hidden;
 		user-select: none;
@@ -223,7 +225,7 @@
 			color: $u-content-color;
 			flex: none;
 			display: -webkit-flex;
-			display: flex;
+			@include vue-flex;
 			align-items: center;
 			justify-content: center;
 			box-sizing: border-box;
@@ -236,6 +238,13 @@
 			border: 1px solid #c8c9cc;
 			transition-duration: 0.2s;
 			
+			/* #ifdef MP-TOUTIAO */
+			// 头条小程序兼容性问题,需要设置行高为0,否则图标偏下
+			&__icon {
+				line-height: 0;
+			}
+			/* #endif */
+			
 			&--circle {
 				border-radius: 100%;
 			}

+ 3 - 1
node_modules/uview-ui/components/u-circle-progress/u-circle-progress.vue

@@ -203,7 +203,9 @@ export default {
 @import "../../libs/css/style.components.scss";
 .u-circle-progress {
 	position: relative;
-	display: inline-flex;
+	/* #ifndef APP-NVUE */
+	display: inline-flex;		
+	/* #endif */
 	align-items: center;
 	justify-content: center;
 }

+ 19 - 3
node_modules/uview-ui/components/u-col/u-col.vue

@@ -8,7 +8,8 @@
 		alignItems: uAlignItem,
 		justifyContent: uJustify,
 		textAlign: textAlign
-	}" @tap.stop.prevent="click">
+	}"
+	 @tap.stop.prevent="click">
 		<slot></slot>
 	</view>
 </template>
@@ -52,7 +53,21 @@
 				default: 'left'
 			}
 		},
-		inject: ['gutter'],
+		data() {
+			return {
+				gutter: 20, // 给col添加间距,左右边距各占一半,从父组件u-row获取
+			}
+		},
+		created() {
+			this.parent = false;
+		},
+		mounted() {
+			// 获取父组件实例,并赋值给对应的参数
+			this.parent = this.$u.$parent.call(this, 'u-row');
+			if (this.parent) {
+				this.gutter = this.parent.gutter;
+			}
+		},
 		computed: {
 			uJustify() {
 				if (this.justify == 'end' || this.justify == 'start') return 'flex-' + this.justify;
@@ -75,8 +90,9 @@
 
 <style lang="scss">
 	@import "../../libs/css/style.components.scss";
+
 	.u-col {
-		/* #ifdef MP-WEIXIN || MP-QQ */
+		/* #ifdef MP-WEIXIN || MP-QQ || MP-TOUTIAO */
 		float: left;
 		/* #endif */
 	}

+ 22 - 24
node_modules/uview-ui/components/u-collapse-item/u-collapse-item.vue

@@ -80,7 +80,6 @@
 				default: ''
 			}
 		},
-		inject: ['uCollapse'],
 		data() {
 			return {
 				isShow: false,
@@ -88,41 +87,37 @@
 				height: 0, // body内容的高度
 				headStyle: {}, // 头部样式,对象形式
 				bodyStyle: {}, // 主体部分样式
-				//itemStyle: {}, // 每个item的整体样式
+				itemStyle: {}, // 每个item的整体样式
 				arrowColor: '', // 箭头的颜色
 				hoverClass: '', // 头部按下时的效果样式类
+				arrow: true, // 是否显示右侧箭头
+				
 			};
 		},
-		mounted() {
-			this.init();
-		},
 		watch: {
 			open(val) {
 				this.isShow = val;
 			}
 		},
-		computed: {
-			arrow() {
-				return this.uCollapse.arrow;
-			},
-			itemStyle() {
-				return this.uCollapse.itemStyle;
-			}
-		},
 		created() {
+			this.parent = false;
 			// 获取u-collapse的信息,放在u-collapse是为了方便,不用每个u-collapse-item写一遍
 			this.isShow = this.open;
-			this.nameSync = this.name ? this.name : this.uCollapse.childrens.length;
-			this.uCollapse.childrens.push(this);
-			//this.itemStyle = this.uCollapse.itemStyle;
-			this.headStyle = this.uCollapse.headStyle;
-			this.bodyStyle = this.uCollapse.bodyStyle;
-			this.arrowColor = this.uCollapse.arrowColor;
-			this.hoverClass = this.uCollapse.hoverClass;
 		},
 		methods: {
 			// 异步获取内容,或者动态修改了内容时,需要重新初始化
 			init() {
+				this.parent = this.$u.$parent.call(this, 'u-collapse');
+				if(this.parent) {
+					this.nameSync = this.name ? this.name : this.parent.childrens.length;
+					this.parent.childrens.push(this);
+					this.headStyle = this.parent.headStyle;
+					this.bodyStyle = this.parent.bodyStyle;
+					this.arrowColor = this.parent.arrowColor;
+					this.hoverClass = this.parent.hoverClass;
+					this.arrow = this.parent.arrow;
+					this.itemStyle = this.parent.itemStyle;
+				}
 				this.$nextTick(() => {
 					this.queryRect();
 				});
@@ -130,8 +125,8 @@
 			// 点击collapsehead头部
 			headClick() {
 				if (this.disabled) return;
-				if (this.uCollapse.accordion == true) {
-					this.uCollapse.childrens.map(val => {
+				if (this.parent && this.parent.accordion == true) {
+					this.parent.childrens.map(val => {
 						// 自身不设置为false,因为后面有this.isShow = !this.isShow;处理了
 						if (this != val) {
 							val.isShow = false;
@@ -146,7 +141,7 @@
 					show: this.isShow
 				})
 				// 只有在打开时才发出事件
-				if (this.isShow) this.uCollapse.onChange();
+				if (this.isShow) this.parent && this.parent.onChange();
 				this.$forceUpdate();
 			},
 			// 查询内容高度
@@ -157,6 +152,9 @@
 					this.height = res.height;
 				})
 			}
+		},
+		mounted() {
+			this.init();
 		}
 	};
 </script>
@@ -166,7 +164,7 @@
 	
 	.u-collapse-head {
 		position: relative;
-		display: flex;
+		@include vue-flex;
 		justify-content: space-between;
 		align-items: center;
 		color: $u-main-color;

+ 0 - 5
node_modules/uview-ui/components/u-collapse/u-collapse.vue

@@ -63,11 +63,6 @@
 				default: 'u-hover-class'
 			}
 		},
-		provide() {
-			return {
-				uCollapse: this
-			}
-		},
 		created() {
 			this.childrens = []
 		},

+ 9 - 5
node_modules/uview-ui/components/u-column-notice/u-column-notice.vue

@@ -193,7 +193,7 @@ export default {
 
 .u-notice-bar {
 	width: 100%;
-	display: flex;
+	@include vue-flex;
 	align-items: center;
 	justify-content: center;
 	flex-wrap: nowrap;
@@ -204,14 +204,14 @@ export default {
 .u-swiper {
 	font-size: 26rpx;
 	height: 32rpx;
-	display: flex;
+	@include vue-flex;
 	align-items: center;
 	flex: 1;
 	margin-left: 12rpx;
 }
 
 .u-swiper-item {
-	display: flex;
+	@include vue-flex;
 	align-items: center;
 	overflow: hidden;
 }
@@ -222,12 +222,16 @@ export default {
 
 .u-right-icon {
 	margin-left: 12rpx;
-	display: inline-flex;
+	/* #ifndef APP-NVUE */
+	display: inline-flex;		
+	/* #endif */
 	align-items: center;
 }
 
 .u-left-icon {
-	display: inline-flex;
+	/* #ifndef APP-NVUE */
+	display: inline-flex;		
+	/* #endif */
 	align-items: center;
 }
 </style>

+ 8 - 5
node_modules/uview-ui/components/u-count-down/u-count-down.vue

@@ -1,6 +1,6 @@
 <template>
 	<view class="u-countdown">
-		<view class="u-countdown-item" :style="[itemStyle]" v-if="showDays && (hideZeroDay || (!hideZeroDay && d != '0'))">
+		<view class="u-countdown-item" :style="[itemStyle]" v-if="showDays && (hideZeroDay || (!hideZeroDay && d != '00'))">
 			<view class="u-countdown-time" :style="[letterStyle]">
 				{{ d }}
 			</view>
@@ -8,7 +8,7 @@
 		<view
 			class="u-countdown-colon"
 			:style="{fontSize: separatorSize + 'rpx', color: separatorColor, paddingBottom: separator == 'colon' ? '4rpx' : 0}"
-			v-if="showDays && (hideZeroDay || (!hideZeroDay && d != '0'))"
+			v-if="showDays && (hideZeroDay || (!hideZeroDay && d != '00'))"
 		>
 			{{ separator == 'colon' ? ':' : '天' }}
 		</view>
@@ -249,6 +249,7 @@ export default {
 			showHour = showHour < 10 ? '0' + showHour : showHour;
 			minute = minute < 10 ? '0' + minute : minute;
 			second = second < 10 ? '0' + second : second;
+			day = day < 10 ? '0' + day : day;
 			this.d = day;
 			this.h = showHour;
 			this.i = minute;
@@ -279,12 +280,14 @@ export default {
 	@import "../../libs/css/style.components.scss";
 
 	.u-countdown {
-		display: inline-flex;
+		/* #ifndef APP-NVUE */
+		display: inline-flex;		
+		/* #endif */
 		align-items: center;
 	}
 
 	.u-countdown-item {
-		display: flex;
+		@include vue-flex;
 		align-items: center;
 		justify-content: center;
 		padding: 2rpx;
@@ -300,7 +303,7 @@ export default {
 	}
 
 	.u-countdown-colon {
-		display: flex;
+		@include vue-flex;
 		justify-content: center;
 		padding: 0 5rpx;
 		line-height: 1;

+ 3 - 1
node_modules/uview-ui/components/u-count-to/u-count-to.vue

@@ -233,7 +233,9 @@ export default {
 @import "../../libs/css/style.components.scss";
 
 .u-count-num {
-	display: inline-block;
+	/* #ifndef APP-NVUE */
+	display: inline-flex;		
+	/* #endif */
 	text-align: center;
 }
 </style>

+ 4 - 2
node_modules/uview-ui/components/u-divider/u-divider.vue

@@ -110,7 +110,7 @@ export default {
 	width: 100%;
 	position: relative;
 	text-align: center;
-	display: flex;
+	@include vue-flex;
 	justify-content: center;
 	align-items: center;
 	overflow: hidden;
@@ -146,6 +146,8 @@ export default {
 .u-divider-text {
 	white-space: nowrap;
 	padding: 0 16rpx;
-	display: inline-flex;
+	/* #ifndef APP-NVUE */
+	display: inline-flex;		
+	/* #endif */
 }
 </style>

+ 26 - 14
node_modules/uview-ui/components/u-dropdown-item/u-dropdown-item.vue

@@ -1,14 +1,21 @@
 <template>
-	<view class="u-dropdown-item" v-if="active" @touchmove.stop.prevent @tap.stop.prevent>
-		<view class="u-dropdown-item__options" v-if="!$slots.default">
-			<u-cell-group>
-				<u-cell-item @click="cellClick(item.value)" :arrow="false" :title="item.label" v-for="(item, index) in options" :key="index" :title-style="{
-					color: value == item.value ? activeColor : inactiveColor
-				}">
-					<u-icon v-if="value == item.value" name="checkbox-mark" :color="activeColor" size="32"></u-icon>
-				</u-cell-item>
-			</u-cell-group>
-		</view>
+	<view class="u-dropdown-item" v-if="active" @touchmove.stop.prevent="() => {}" @tap.stop.prevent="() => {}">
+		<block v-if="!$slots.default">
+			<scroll-view scroll-y="true" :style="{
+				height: $u.addUnit(height)
+			}">
+				<view class="u-dropdown-item__options">
+					<u-cell-group>
+						<u-cell-item @click="cellClick(item.value)" :arrow="false" :title="item.label" v-for="(item, index) in options"
+						 :key="index" :title-style="{
+							color: value == item.value ? activeColor : inactiveColor
+						}">
+							<u-icon v-if="value == item.value" name="checkbox-mark" :color="activeColor" size="32"></u-icon>
+						</u-cell-item>
+					</u-cell-group>
+				</view>
+			</scroll-view>
+		</block>
 		<slot v-else />
 	</view>
 </template>
@@ -39,6 +46,11 @@
 				type: Boolean,
 				default: false
 			},
+			// 下拉弹窗的高度
+			height: {
+				type: [Number, String],
+				default: 'auto'
+			}
 		},
 		data() {
 			return {
@@ -57,7 +69,7 @@
 			propsChange(n) {
 				// 当值变化时,通知父组件重新初始化,让父组件执行每个子组件的init()方法
 				// 将所有子组件数据重新整理一遍
-				if(this.parent) this.parent.init();
+				if (this.parent) this.parent.init();
 			}
 		},
 		created() {
@@ -68,7 +80,7 @@
 			init() {
 				// 获取父组件u-dropdown
 				let parent = this.$u.$parent.call(this, 'u-dropdown');
-				if(parent) {
+				if (parent) {
 					this.parent = parent;
 					// 将子组件的激活颜色配置为父组件设置的激活和未激活时的颜色
 					this.activeColor = parent.activeColor;
@@ -78,8 +90,8 @@
 					let exist = parent.children.find(val => {
 						return this === val;
 					})
-					if(!exist) parent.children.push(this);
-					if(parent.children.length == 1) this.active = true;
+					if (!exist) parent.children.push(this);
+					if (parent.children.length == 1) this.active = true;
 					// 父组件无法监听children的变化,故将子组件的title,传入父组件的menuList数组中
 					parent.menuList.push({
 						title: this.title,

+ 28 - 16
node_modules/uview-ui/components/u-dropdown/u-dropdown.vue

@@ -20,11 +20,14 @@
 			</view>
 		</view>
 		<view class="u-dropdown__content" :style="[contentStyle, {
-			transition: `opacity ${duration / 1000}s linear`
-		}]" @tap="maskClick"  @touchmove.stop.prevent>
+			transition: `opacity ${duration / 1000}s linear`,
+			top: $u.addUnit(height)
+		}]"
+		 @tap="maskClick" @touchmove.stop.prevent>
 			<view @tap.stop.prevent class="u-dropdown__content__popup" :style="[popupStyle]">
 				<slot></slot>
 			</view>
+			<view class="u-dropdown__content__mask"></view>
 		</view>
 	</view>
 </template>
@@ -57,7 +60,7 @@
 			duration: {
 				type: [Number, String],
 				default: 300
-			}, 
+			},
 			// 标题菜单的高度,单位任意,数值默认为rpx单位
 			height: {
 				type: [Number, String],
@@ -81,7 +84,7 @@
 				active: false, // 下拉菜单的状态
 				// 当前是第几个菜单处于激活状态,小程序中此处不能写成false或者"",否则后续将current赋值为0,
 				// 无能的TX没有使用===而是使用==判断,导致程序认为前后二者没有变化,从而不会触发视图更新
-				current: 99999, 
+				current: 99999,
 				// 外层内容的样式,初始时处于底层,且透明
 				contentStyle: {
 					zIndex: -1,
@@ -97,6 +100,7 @@
 				let style = {};
 				// 进行Y轴位移,展开状态时,恢复原位。收齐状态时,往上位移100%,进行隐藏
 				style.transform = `translateY(${this.active ? 0 : '-100%'})`
+				style['transition-duration'] = this.duration / 1000 + 's';
 				return style;
 			}
 		},
@@ -116,7 +120,7 @@
 			// 点击菜单
 			menuClick(index) {
 				// 判断是否被禁用
-				if(this.menuList[index].disabled) return ;
+				if (this.menuList[index].disabled) return;
 				// 如果点击时的索引和当前激活项索引相同,意味着点击了激活项,需要收起下拉菜单
 				if (index === this.current && this.closeOnClickSelf) {
 					this.close();
@@ -135,7 +139,6 @@
 				// 展开时,设置下拉内容的样式
 				this.contentStyle = {
 					zIndex: 11,
-					opacity: 1
 				}
 				// 标记展开状态以及当前展开项的索引
 				this.active = true;
@@ -162,7 +165,7 @@
 			// 点击遮罩
 			maskClick() {
 				// 如果不允许点击遮罩,直接返回
-				if(!this.closeOnClickMask) return;
+				if (!this.closeOnClickMask) return;
 				this.close();
 			},
 			// 外部手动设置某个菜单高亮
@@ -181,14 +184,14 @@
 		width: 100%;
 
 		&__menu {
-			display: flex;
+			@include vue-flex;
 			position: relative;
 			z-index: 11;
 			height: 80rpx;
 
 			&__item {
 				flex: 1;
-				display: flex;
+				@include vue-flex;
 				justify-content: center;
 				align-items: center;
 
@@ -201,8 +204,8 @@
 					margin-left: 6rpx;
 					transition: transform .3s;
 					align-items: center;
-					display: flex;
-					
+					@include vue-flex;
+
 					&--rotate {
 						transform: rotate(180deg);
 					}
@@ -212,16 +215,25 @@
 
 		&__content {
 			position: absolute;
-			z-index: 11;
-			height: 100%;
+			z-index: 8;
 			width: 100%;
 			left: 0px;
+			bottom: 0;
 			overflow: hidden;
-			background: rgba(0, 0, 0, .3);
-			opacity: 0;
+
+			&__mask {
+				position: absolute;
+				z-index: 9;
+				background: rgba(0, 0, 0, .3);
+				width: 100%;
+				left: 0;
+				top: 0;
+				bottom: 0;
+			}
 
 			&__popup {
-				z-index: 11;
+				position: relative;
+				z-index: 10;
 				transition: all 0.3s;
 				transform: translate3D(0, -100%, 0);
 			}

+ 2 - 2
node_modules/uview-ui/components/u-empty/u-empty.vue

@@ -173,7 +173,7 @@
 	@import "../../libs/css/style.components.scss";
 
 	.u-empty {
-		display: flex;
+		@include vue-flex;
 		flex-direction: column;
 		justify-content: center;
 		align-items: center;
@@ -185,7 +185,7 @@
 	}
 
 	.u-slot-wrap {
-		display: flex;
+		@include vue-flex;
 		justify-content: center;
 		align-items: center;
 		margin-top: 20rpx;

+ 7 - 5
node_modules/uview-ui/components/u-field/u-field.vue

@@ -292,7 +292,7 @@ export default {
 }
 
 .u-field-inner {
-	display: flex;
+	@include vue-flex;
 	align-items: center;
 }
 
@@ -307,7 +307,7 @@ export default {
 }
 
 .fild-body {
-	display: flex;
+	@include vue-flex;
 	flex: 1;
 	align-items: center;
 }
@@ -317,7 +317,9 @@ export default {
 }
 
 .u-label-text {
-	display: inline-block;
+	/* #ifndef APP-NVUE */
+	display: inline-flex;		
+	/* #endif */
 }
 
 .u-label-left-gap {
@@ -334,7 +336,7 @@ export default {
 	flex: 1 1 130rpx;
 	text-align: left;
 	position: relative;
-	display: flex;
+	@include vue-flex;
 	align-items: center;
 }
 
@@ -358,7 +360,7 @@ export default {
 }
 
 .u-clear-icon {
-	display: flex;
+	@include vue-flex;
 	align-items: center;
 }
 

+ 271 - 241
node_modules/uview-ui/components/u-form-item/u-form-item.vue

@@ -10,7 +10,7 @@
 				marginBottom: elLabelPosition == 'left' ? 0 : '10rpx',
 			}">
 				<!-- 为了块对齐 -->
-				<view class="u-form-item--left__content">
+				<view class="u-form-item--left__content" v-if="required || leftIcon || label">
 					<!-- nvue不支持伪元素before -->
 					<text v-if="required" class="u-form-item--left__content--required">*</text>
 					<view class="u-form-item--left__content__icon" v-if="leftIcon">
@@ -42,10 +42,10 @@
 </template>
 
 <script>
-import Emitter from '../../libs/util/emitter.js';
-import schema from '../../libs/util/async-validator';
-// 去除警告信息
-schema.warning = function(){};
+	import Emitter from '../../libs/util/emitter.js';
+	import schema from '../../libs/util/async-validator';
+	// 去除警告信息
+	schema.warning = function() {};
 
 	/**
 	 * form-item 表单item
@@ -66,260 +66,290 @@ schema.warning = function(){};
 	 * @example <u-form-item label="姓名"><u-input v-model="form.name" /></u-form-item>
 	 */
 
-export default {
-	name: 'u-form-item',
-	mixins: [Emitter],
-	inject: {
-		uForm: {
-			default() {
-				return null
-			}
-		}
-	},
-	props: {
-		// input的label提示语
-		label: {
-			type: String,
-			default: ''
-		},
-		// 绑定的值
-		prop: {
-			type: String,
-			default: ''
-		},
-		// 是否显示表单域的下划线边框
-		borderBottom: {
-			type: [String, Boolean],
-			default: ''
-		},
-		// label的位置,left-左边,top-上边
-		labelPosition: {
-			type: String,
-			default: ''
-		},
-		// label的宽度,单位rpx
-		labelWidth: {
-			type: [String, Number],
-			default: ''
-		},
-		// lable的样式,对象形式
-		labelStyle: {
-			type: Object,
-			default() {
-				return {}
-			}
-		},
-		// lable字体的对齐方式
-		labelAlign: {
-			type: String,
-			default: ''
-		},
-		// 右侧图标
-		rightIcon: {
-			type: String,
-			default: ''
-		},
-		// 左侧图标
-		leftIcon: {
-			type: String,
-			default: ''
-		},
-		// 左侧图标的样式
-		leftIconStyle: {
-			type: Object,
-			default() {
-				return {}
+	export default {
+		name: 'u-form-item',
+		mixins: [Emitter],
+		inject: {
+			uForm: {
+				default () {
+					return null
+				}
 			}
 		},
-		// 左侧图标的样式
-		rightIconStyle: {
-			type: Object,
-			default() {
-				return {}
+		props: {
+			// input的label提示语
+			label: {
+				type: String,
+				default: ''
+			},
+			// 绑定的值
+			prop: {
+				type: String,
+				default: ''
+			},
+			// 是否显示表单域的下划线边框
+			borderBottom: {
+				type: [String, Boolean],
+				default: ''
+			},
+			// label的位置,left-左边,top-上边
+			labelPosition: {
+				type: String,
+				default: ''
+			},
+			// label的宽度,单位rpx
+			labelWidth: {
+				type: [String, Number],
+				default: ''
+			},
+			// lable的样式,对象形式
+			labelStyle: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			// lable字体的对齐方式
+			labelAlign: {
+				type: String,
+				default: ''
+			},
+			// 右侧图标
+			rightIcon: {
+				type: String,
+				default: ''
+			},
+			// 左侧图标
+			leftIcon: {
+				type: String,
+				default: ''
+			},
+			// 左侧图标的样式
+			leftIconStyle: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			// 左侧图标的样式
+			rightIconStyle: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			// 是否显示左边的必填星号,只作显示用,具体校验必填的逻辑,请在rules中配置
+			required: {
+				type: Boolean,
+				default: false
 			}
 		},
-		// 是否显示左边的必填星号,只作显示用,具体校验必填的逻辑,请在rules中配置
-		required: {
-			type: Boolean,
-			default: false
-		}
-	},
-	data() {
-		return {
-			initialValue: '', // 存储的默认值
-			// isRequired: false, // 是否必填,由于人性化考虑,必填"*"号通过props的required配置,不再通过rules的规则自动生成
-			validateState: '', // 是否校验成功
-			validateMessage: '' ,// 校验失败的提示语
-			// 有错误时的提示方式,message-提示信息,border-如果input设置了边框,变成呈红色,
-			errorType: ['message'],
-		};
-	},
-	created() {
-		// 支付宝小程序不支持provide/inject,所以使用这个方法获取整个父组件,在created定义,避免循环应用
-		this.parent = this.$u.$parent.call(this, 'u-form');
-	},
-	watch: {
-		validateState(val) {
-			this.broadcastInputError();
-		},
-		// 监听u-form组件的errorType的变化
-		"uForm.errorType"(val) {
-			this.errorType = val;
-			this.broadcastInputError();
-		},
-	},
-	computed: {
-		// 计算后的label宽度,由于需要多个判断,故放到computed中
-		uLabelWidth() {
-			// 如果用户设置label为空字符串(微信小程序空字符串最终会变成字符串的'true'),意味着要将label的位置宽度设置为auto
-			return this.elLabelPosition == 'left' ? (this.label === 'true' || this.label === '' ? 'auto' : this.$u.addUnit(this.elLabelWidth)) : '100%';
+		data() {
+			return {
+				initialValue: '', // 存储的默认值
+				// isRequired: false, // 是否必填,由于人性化考虑,必填"*"号通过props的required配置,不再通过rules的规则自动生成
+				validateState: '', // 是否校验成功
+				validateMessage: '', // 校验失败的提示语
+				// 有错误时的提示方式,message-提示信息,border-如果input设置了边框,变成呈红色,
+				errorType: ['message'],
+				fieldValue: '', // 获取当前子组件input的输入的值
+				// 父组件的参数,在computed计算中,无法得知this.parent发生变化,故将父组件的参数值,放到data中
+				parentData: {
+					borderBottom: true,
+					labelWidth: 90,
+					labelPosition: 'left',
+					labelStyle: {},
+					labelAlign: 'left',
+				}
+			};
 		},
-		fieldValue() {
-			return this.uForm.model[this.prop];
+		watch: {
+			validateState(val) {
+				this.broadcastInputError();
+			},
+			// 监听u-form组件的errorType的变化
+			"uForm.errorType"(val) {
+				this.errorType = val;
+				this.broadcastInputError();
+			},
 		},
-		showError() {
-			return type => {
-				// 如果errorType数组中含有none,或者toast提示类型
-				if(this.errorType.indexOf('none') >= 0) return false;
-				else if(this.errorType.indexOf(type) >= 0) return true;
-				else return false;
+		computed: {
+			// 计算后的label宽度,由于需要多个判断,故放到computed中
+			uLabelWidth() {
+				// 如果用户设置label为空字符串(微信小程序空字符串最终会变成字符串的'true'),意味着要将label的位置宽度设置为auto
+				return this.elLabelPosition == 'left' ? (this.label === 'true' || this.label === '' ? 'auto' : this.$u.addUnit(this
+					.elLabelWidth)) : '100%';
+			},
+			showError() {
+				return type => {
+					// 如果errorType数组中含有none,或者toast提示类型
+					if (this.errorType.indexOf('none') >= 0) return false;
+					else if (this.errorType.indexOf(type) >= 0) return true;
+					else return false;
+				}
+			},
+			// label的宽度
+			elLabelWidth() {
+				// label默认宽度为90,优先使用本组件的值,如果没有(如果设置为0,也算是配置了值,依然起效),则用u-form的值
+				return (this.labelWidth != 0 || this.labelWidth != '') ? this.labelWidth : (this.parentData.labelWidth ? this.parentData
+					.labelWidth :
+					90);
+			},
+			// label的样式
+			elLabelStyle() {
+				return Object.keys(this.labelStyle).length ? this.labelStyle : (this.parentData.labelStyle ? this.parentData.labelStyle :
+					{});
+			},
+			// label的位置,左侧或者上方
+			elLabelPosition() {
+				return this.labelPosition ? this.labelPosition : (this.parentData.labelPosition ? this.parentData.labelPosition :
+					'left');
+			},
+			// label的对齐方式
+			elLabelAlign() {
+				return this.labelAlign ? this.labelAlign : (this.parentData.labelAlign ? this.parentData.labelAlign : 'left');
+			},
+			// label的下划线
+			elBorderBottom() {
+				// 子组件的borderBottom默认为空字符串,如果不等于空字符串,意味着子组件设置了值,优先使用子组件的值
+				return this.borderBottom !== '' ? this.borderBottom : this.parentData.borderBottom ? this.parentData.borderBottom :
+					true;
 			}
 		},
-		// label的宽度
-		elLabelWidth() {
-			// label默认宽度为90,优先使用本组件的值,如果没有(如果设置为0,也算是配置了值,依然起效),则用u-form的值
-			return (this.labelWidth != 0 || this.labelWidth != '') ? this.labelWidth : (this.parent ? this.parent.labelWidth : 90);
-		},
-		// label的样式
-		elLabelStyle() {
-			return Object.keys(this.labelStyle).length ? this.labelStyle : (this.parent ? this.parent.labelStyle : {});
-		},
-		// label的位置,左侧或者上方
-		elLabelPosition() {
-			return this.labelPosition ? this.labelPosition : (this.parent ? this.parent.labelPosition : 'left');
-		}, 
-		// label的对齐方式
-		elLabelAlign() {
-			return this.labelAlign ? this.labelAlign : (this.parent ? this.parent.labelAlign : 'left');
-		},
-		// label的下划线
-		elBorderBottom() {
-			// 子组件的borderBottom默认为空字符串,如果不等于空字符串,意味着子组件设置了值,优先使用子组件的值
-			return this.borderBottom !== '' ? this.borderBottom : this.parent ? this.parent.borderBottom : true;
-		}
-	},
-	methods: {
-		broadcastInputError() {
-			// 子组件发出事件,第三个参数为true或者false,true代表有错误
-			this.broadcast('u-input', 'on-form-item-error', this.validateState === 'error' && this.showError('border'));
-		},
-		// 判断是否需要required校验
-		setRules() {
-			let that = this;
-			// 由于人性化考虑,必填"*"号通过props的required配置,不再通过rules的规则自动生成
-			// 从父组件u-form拿到当前u-form-item需要验证 的规则
-			// let rules = this.getRules();
-			// if (rules.length) {
-			// 	this.isRequired = rules.some(rule => {
-			// 		// 如果有必填项,就返回,没有的话,就是undefined
-			// 		return rule.required;
-			// 	});
-			// }
+		methods: {
+			broadcastInputError() {
+				// 子组件发出事件,第三个参数为true或者false,true代表有错误
+				this.broadcast('u-input', 'on-form-item-error', this.validateState === 'error' && this.showError('border'));
+			},
+			// 判断是否需要required校验
+			setRules() {
+				let that = this;
+				// 由于人性化考虑,必填"*"号通过props的required配置,不再通过rules的规则自动生成
+				// 从父组件u-form拿到当前u-form-item需要验证 的规则
+				// let rules = this.getRules();
+				// if (rules.length) {
+				// 	this.isRequired = rules.some(rule => {
+				// 		// 如果有必填项,就返回,没有的话,就是undefined
+				// 		return rule.required;
+				// 	});
+				// }
 
-			// blur事件
-			this.$on('on-form-blur', that.onFieldBlur);
-			// change事件
-			this.$on('on-form-change', that.onFieldChange);
-		},
+				// blur事件
+				this.$on('on-form-blur', that.onFieldBlur);
+				// change事件
+				this.$on('on-form-change', that.onFieldChange);
+			},
 
-		// 从u-form的rules属性中,取出当前u-form-item的校验规则
-		getRules() {
-			// 父组件的所有规则
-			let rules = this.uForm.rules;
-			rules = rules ? rules[this.prop] : [];
-			// 保证返回的是一个数组形式
-			return [].concat(rules || []);
-		},
+			// 从u-form的rules属性中,取出当前u-form-item的校验规则
+			getRules() {
+				// 父组件的所有规则
+				let rules = this.parent.rules;
+				rules = rules ? rules[this.prop] : [];
+				// 保证返回的是一个数组形式
+				return [].concat(rules || []);
+			},
 
-		// blur事件时进行表单校验
-		onFieldBlur() {
-			this.validation('blur');
-		},
+			// blur事件时进行表单校验
+			onFieldBlur() {
+				this.validation('blur');
+			},
 
-		// change事件进行表单校验
-		onFieldChange() {
-			this.validation('change');
-		},
+			// change事件进行表单校验
+			onFieldChange() {
+				this.validation('change');
+			},
 
-		// 过滤出符合要求的rule规则
-		getFilteredRule(triggerType = '') {
-			let rules = this.getRules();
-			// 整体验证表单时,triggerType为空字符串,此时返回所有规则进行验证
-			if(!triggerType) return rules;
-			// 历遍判断规则是否有对应的事件,比如blur,change触发等的事件
-			// 使用indexOf判断,是因为某些时候设置的验证规则的trigger属性可能为多个,比如['blur','change']
-			// 某些场景可能的判断规则,可能不存在trigger属性,故先判断是否存在此属性
-			return rules.filter(res => res.trigger && res.trigger.indexOf(triggerType) !== -1);
-		},
+			// 过滤出符合要求的rule规则
+			getFilteredRule(triggerType = '') {
+				let rules = this.getRules();
+				// 整体验证表单时,triggerType为空字符串,此时返回所有规则进行验证
+				if (!triggerType) return rules;
+				// 历遍判断规则是否有对应的事件,比如blur,change触发等的事件
+				// 使用indexOf判断,是因为某些时候设置的验证规则的trigger属性可能为多个,比如['blur','change']
+				// 某些场景可能的判断规则,可能不存在trigger属性,故先判断是否存在此属性
+				return rules.filter(res => res.trigger && res.trigger.indexOf(triggerType) !== -1);
+			},
+
+			// 校验数据
+			validation(trigger, callback = () => {}) {
+				// 检验之间,先获取需要校验的值
+				this.fieldValue = this.parent.model[this.prop];
+				// blur和change是否有当前方式的校验规则
+				let rules = this.getFilteredRule(trigger);
+				// 判断是否有验证规则,如果没有规则,也调用回调方法,否则父组件u-form会因为
+				// 对count变量的统计错误而无法进入上一层的回调
+				if (!rules || rules.length === 0) {
+					return callback('');
+				}
+				// 设置当前的装填,标识为校验中
+				this.validateState = 'validating';
+				// 调用async-validator的方法
+				let validator = new schema({
+					[this.prop]: rules
+				});
+				validator.validate({
+					[this.prop]: this.fieldValue
+				}, {
+					firstFields: true
+				}, (errors, fields) => {
+					// 记录状态和报错信息
+					this.validateState = !errors ? 'success' : 'error';
+					this.validateMessage = errors ? errors[0].message : '';
+					// 调用回调方法
+					callback(this.validateMessage);
+				});
+			},
 
-		// 校验数据
-		validation(trigger, callback = () => {}) {
-			// blur和change是否有当前方式的校验规则
-			let rules = this.getFilteredRule(trigger);
-			// 判断是否有验证规则,如果没有规则,也调用回调方法,否则父组件u-form会因为
-			// 对count变量的统计错误而无法进入上一层的回调
-			if (!rules || rules.length === 0) {
-				return callback('');
+			// 清空当前的u-form-item
+			resetField() {
+				this.parent.model[this.prop] = this.initialValue;
+				// 设置为`success`状态,只是为了清空错误标记
+				this.validateState = 'success';
 			}
-			// 设置当前的装填,标识为校验中
-			this.validateState = 'validating';
-			// 调用async-validator的方法
-			let validator = new schema({ [this.prop]: rules });
-			validator.validate({ [this.prop]: this.fieldValue }, { firstFields: true }, (errors, fields) => {
-				// 记录状态和报错信息
-				this.validateState = !errors ? 'success' : 'error';
-				this.validateMessage = errors ? errors[0].message : '';
-				// 调用回调方法
-				callback(this.validateMessage);
-			});
 		},
 
-		// 清空当前的u-form-item
-		resetField() {
-			this.uForm.model[this.prop] = this.initialValue;
-			// 设置为`success`状态,只是为了清空错误标记
-			this.validateState = 'success';
-		}
-	},
-
-	// 组件创建完成时,将当前实例保存到u-form中
-	mounted() {
-		// 如果没有传入prop,或者uForm为空(如果u-form-input单独使用,就不会有uForm注入),就不进行校验
-		if (!this.prop || this.uForm === null) return;
-		// 发出事件,让父组件将本实例加入到管理数组中
-		this.dispatch('u-form', 'on-form-item-add', this);
-		this.errorType = this.uForm.errorType;
-		// 设置初始值
-		this.initialValue = this.fieldValue;
-		// 添加表单校验,这里必须要写在$nextTick中,因为u-form的rules是通过ref手动传入的
-		// 不在$nextTick中的话,可能会造成执行此处代码时,父组件还没通过ref把规则给u-form,导致规则为空
-		this.$nextTick(() =>{
-			this.setRules();
-		})
-	},
+		// 组件创建完成时,将当前实例保存到u-form中
+		mounted() {
+			// 支付宝、头条小程序不支持provide/inject,所以使用这个方法获取整个父组件,在created定义,避免循环应用
+			this.parent = this.$u.$parent.call(this, 'u-form');
+			if (this.parent) {
+				// 历遍parentData中的属性,将parent中的同名属性赋值给parentData
+				Object.keys(this.parentData).map(key => {
+					this.parentData[key] = this.parent[key];
+				});
+				// 如果没有传入prop,或者uForm为空(如果u-form-input单独使用,就不会有uForm注入),就不进行校验
+				if (this.prop) {
+					// 将本实例添加到父组件中
+					this.parent.fields.push(this);
+					this.errorType = this.parent.errorType;
+					// 设置初始值
+					this.initialValue = this.fieldValue;
+					// 添加表单校验,这里必须要写在$nextTick中,因为u-form的rules是通过ref手动传入的
+					// 不在$nextTick中的话,可能会造成执行此处代码时,父组件还没通过ref把规则给u-form,导致规则为空
+					this.$nextTick(() => {
+						this.setRules();
+					})
+				}
+			}
+		},
 
-	// 组件销毁前,将实例从 Form 的缓存中移除
-	beforeDestroy() {
-		this.dispatch('u-form', 'on-form-item-remove', this);
-	},
-};
+		// 组件销毁前,将实例从u-form的缓存中移除
+		beforeDestroy() {
+			// 如果当前没有prop的话表示当前不要进行删除(因为没有注入)
+			if (this.parent && this.prop) {
+				this.parent.fields.map((item, index) => {
+					if (item === this) this.parent.fields.splice(index, 1);
+				})
+			}
+		},
+	};
 </script>
 
 <style lang="scss" scoped>
 	@import "../../libs/css/style.components.scss";
 
 	.u-form-item {
-		display: flex;
+		@include vue-flex;
 		// align-items: flex-start;
 		padding: 20rpx 0;
 		font-size: 28rpx;
@@ -333,16 +363,16 @@ export default {
 		}
 
 		&__body {
-			display: flex;
+			@include vue-flex;
 		}
 
 		&--left {
-			display: flex;
+			@include vue-flex;
 			align-items: center;
 
 			&__content {
 				position: relative;
-				display: flex;
+				@include vue-flex;
 				align-items: center;
 				padding-right: 10rpx;
 				flex: 1;
@@ -360,7 +390,7 @@ export default {
 				}
 
 				&__label {
-					display: flex;
+					@include vue-flex;
 					align-items: center;
 					flex: 1;
 				}
@@ -371,14 +401,14 @@ export default {
 			flex: 1;
 
 			&__content {
-				display: flex;
+				@include vue-flex;
 				align-items: center;
 				flex: 1;
 
 				&__slot {
 					flex: 1;
 					/* #ifndef MP */
-					display: flex;
+					@include vue-flex;
 					align-items: center;
 					/* #endif */
 				}

+ 0 - 15
node_modules/uview-ui/components/u-form/u-form.vue

@@ -85,21 +85,6 @@ export default {
 		// 存储当前form下的所有u-form-item的实例
 		// 不能定义在data中,否则微信小程序会造成循环引用而报错
 		this.fields = [];
-		// 存当前实例
-		let that = this;
-		// 监听on-form-item-add事件,将子组件添加到fields中
-		this.$on('on-form-item-add', item => {
-			if (item) {
-				that.fields.push(item);
-			}
-		});
-		// 删除当前有的实例
-		this.$on('on-form-item-remove', item => {
-			// 如果当前没有prop的话表示当前不要进行删除(因为没有注入)
-			if (item.prop) {
-				that.fields.splice(that.fields.indexOf(item), 1);
-			}
-		});
 	},
 	methods: {
 		setRules(rules) {

+ 34 - 21
node_modules/uview-ui/components/u-grid-item/u-grid-item.vue

@@ -1,10 +1,10 @@
 <template>
-	<view class="u-grid-item" :hover-class="hoverClass"
+	<view class="u-grid-item" :hover-class="parentData.hoverClass"
 	 :hover-stay-time="200" @tap="click" :style="{
 			background: bgColor,
 			width: width,
 		}">
-		<view class="u-grid-item-box" :class="[showBorder ? 'u-border-right u-border-bottom' : '']">
+		<view class="u-grid-item-box" :style="customStyle" :class="[parentData.border ? 'u-border-right u-border-bottom' : '']">
 			<slot />
 		</view>
 	</view>
@@ -17,6 +17,7 @@
 	 * @tutorial https://www.uviewui.com/components/grid.html
 	 * @property {String} bg-color 宫格的背景颜色(默认#ffffff)
 	 * @property {String Number} index 点击宫格时,返回的值
+	 * @property {Object} custom-style 自定义样式,对象形式
 	 * @event {Function} click 点击宫格触发
 	 * @example <u-grid-item></u-grid-item>
 	 */
@@ -33,38 +34,48 @@
 				type: [Number, String],
 				default: ''
 			},
+			// 自定义样式,对象形式
+			customStyle: {
+				type: Object,
+				default() {
+					return {
+						padding: '30rpx 0'
+					}
+				}
+			}
 		},
-		// 父组件通过provide传递过来的整个this
-		inject: ['uGrid'],
 		data() {
 			return {
-				hoverClass: '', // 按下去的时候,是否显示背景灰色
+				parentData: {
+					hoverClass: '', // 按下去的时候,是否显示背景灰色
+					col: 3, // 父组件划分的宫格数
+					border: true, // 是否显示边框,根据父组件决定
+				}
 			};
 		},
 		created() {
-			this.hoverClass = this.uGrid.hoverClass;
+			// 父组件的实例
+			this.updateParentData();
+			// this.parent在updateParentData()中定义
+			this.parent.children.push(this);
 		},
 		computed: {
-			// 小于2,显示2列;大于12,显示12列
-			colNum() {
-				return this.col < 2 ? 2 : this.col > 12 ? 12 : this.col;
-			},
 			// 每个grid-item的宽度
 			width() {
-				return 100 / Number(this.uGrid.col) + '%';
+				return 100 / Number(this.parentData.col) + '%';
 			},
-			// 是否显示边框
-			// 为了迎合演示的需要,从created生命周期移到此,以为演示中可能需要动态修改有无边框
-			showBorder() {
-				return this.uGrid.border;
-			}
 		},
 		methods: {
+			// 获取父组件的参数
+			updateParentData() {
+				// 此方法写在mixin中
+				this.getParentData('u-grid');
+			},
 			click() {
 				this.$emit('click', this.index);
-				this.uGrid.click(this.index);
+				this.parent && this.parent.click(this.index);
 			}
-		},
+		}
 	};
 </script>
 
@@ -74,7 +85,7 @@
 	.u-grid-item {
 		box-sizing: border-box;
 		background: #fff;
-		display: flex;
+		@include vue-flex;
 		align-items: center;
 		justify-content: center;
 		position: relative;
@@ -92,7 +103,9 @@
 
 	.u-grid-marker-box {
 		position: absolute;
-		display: inline-block;
+		/* #ifndef APP-NVUE */
+		display: inline-flex;		
+		/* #endif */
 		line-height: 0;
 	}
 
@@ -102,7 +115,7 @@
 
 	.u-grid-item-box {
 		padding: 30rpx 0;
-		display: flex;
+		@include vue-flex;
 		align-items: center;
 		justify-content: center;
 		flex-direction: column;

+ 19 - 6
node_modules/uview-ui/components/u-grid/u-grid.vue

@@ -42,12 +42,26 @@ export default {
 			index: 0,
 		}
 	},
-	provide() {
-		return {
-			uGrid: this
-		}
+	watch: {
+		// 当父组件需要子组件需要共享的参数发生了变化,手动通知子组件
+		parentData() {
+			if(this.children.length) {
+				this.children.map(child => {
+					// 判断子组件(u-radio)如果有updateParentData方法的话,就就执行(执行的结果是子组件重新从父组件拉取了最新的值)
+					typeof(child.updateParentData) == 'function' && child.updateParentData();
+				})
+			}
+		},
+	},
+	created() {
+		// 如果将children定义在data中,在微信小程序会造成循环引用而报错
+		this.children = [];
 	},
 	computed: {
+		// 计算父组件的值是否发生变化
+		parentData() {
+			return [this.hoverClass, this.col, this.size, this.border];
+		},
 		// 宫格对齐方式
 		gridStyle() {
 			let style = {};
@@ -71,7 +85,6 @@ export default {
 			this.$emit('click', index);
 		}
 	}
-	
 };
 </script>
 
@@ -87,7 +100,7 @@ export default {
 	/* #endif */
 	
 	/* #ifndef MP */
-	display: flex;
+	@include vue-flex;
 	flex-wrap: wrap;
 	align-items: center;
 	/* #endif */

+ 8 - 0
node_modules/uview-ui/components/u-icon/u-icon.vue

@@ -200,10 +200,16 @@ export default {
 
 <style scoped lang="scss">
 @import "../../libs/css/style.components.scss";
+/* #ifndef APP-NVUE */
+// 目前由于nvue对定义字体时的content属性报错,所以nvue先不引入
 @import '../../iconfont.css';
+/* #endif */
 
 .u-icon {
+	/* #ifndef APP-NVUE */
 	display: inline-flex;
+	/* #endif */
+	flex-direction: row;
 	align-items: center;
 
 	&--left {
@@ -251,8 +257,10 @@ export default {
 	}
 
 	&__img {
+		/* #ifndef APP-PLUS */
 		height: auto;
 		will-change: transform;
+		/* #endif */
 	}
 
 	&__label {

+ 1 - 1
node_modules/uview-ui/components/u-image/u-image.vue

@@ -251,7 +251,7 @@ export default {
 		left: 0;
 		width: 100%;
 		height: 100%;
-		display: flex;
+		@include vue-flex;
 		align-items: center;
 		justify-content: center;
 		background-color: $u-bg-color;

+ 8 - 3
node_modules/uview-ui/components/u-index-anchor/u-index-anchor.vue

@@ -48,10 +48,15 @@
 				anchorStyle: {}
 			}
 		},
-		inject: ['UIndexList'],
+		created() {
+			this.parent = false;
+		},
 		mounted() {
-			this.UIndexList.children.push(this);
-			this.UIndexList.updateData();
+			this.parent = this.$u.$parent.call(this, 'u-index-list');
+			if(this.parent) {
+				this.parent.children.push(this);
+				this.parent.updateData();
+			}
 		},
 		computed: {
 			customAnchorStyle() {

+ 3 - 9
node_modules/uview-ui/components/u-index-list/u-index-list.vue

@@ -79,15 +79,9 @@
 			// #ifndef H5
 			this.stickyOffsetTop = this.offsetTop ? uni.upx2px(this.offsetTop) : 0;
 			// #endif
-			// 只能在created生命周期定义children,如果在data定义,会因为在子组件中通过provide/inject
-			// 进行push时而导致的莫名其妙的错误
+			// 只能在created生命周期定义children,如果在data定义,会因为循环引用而报错
 			this.children = [];
 		},
-		provide() {
-			return {
-				UIndexList: this
-			}
-		},
 		data() {
 			return {
 				activeAnchorIndex: 0,
@@ -282,7 +276,7 @@
 		position: fixed;
 		top: 50%;
 		right: 0;
-		display: flex;
+		@include vue-flex;
 		flex-direction: column;
 		text-align: center;
 		transform: translateY(-50%);
@@ -308,7 +302,7 @@
 		font-size: 50rpx;
 		color: #fff;
 		background-color: rgba(0, 0, 0, 0.65);
-		display: flex;
+		@include vue-flex;
 		justify-content: center;
 		align-items: center;
 		padding: 0;

+ 28 - 7
node_modules/uview-ui/components/u-input/u-input.vue

@@ -27,6 +27,7 @@
 			:selection-end="uSelectionEnd"
 			:selection-start="uSelectionStart"
 			:cursor-spacing="getCursorSpacing"
+			:show-confirm-bar="showConfirmbar"
 			@input="handleInput"
 			@blur="handleBlur"
 			@focus="onFocus"
@@ -48,6 +49,7 @@
 			:cursor-spacing="getCursorSpacing"
 			:selection-end="uSelectionEnd"
 			:selection-start="uSelectionStart"
+			:show-confirm-bar="showConfirmbar"
 			@focus="onFocus"
 			@blur="handleBlur"
 			@input="handleInput"
@@ -206,6 +208,11 @@ export default {
 		trim: {
 			type: Boolean,
 			default: true
+		},
+		// 是否显示键盘上方带有”完成“按钮那一栏
+		showConfirmbar:{
+			type:Boolean,
+			default:true
 		}
 	},
 	data() {
@@ -216,6 +223,7 @@ export default {
 			validateState: false, // 当前input的验证状态,用于错误时,边框是否改为红色
 			focused: false, // 当前是否处于获得焦点的状态
 			showPassword: false, // 是否预览密码
+			lastValue: '', // 用于头条小程序,判断@input中,前后的值是否发生了变化,因为头条中文下,按下键没有输入内容,也会触发@input时间
 		};
 	},
 	watch: {
@@ -268,16 +276,22 @@ export default {
 			let value = event.detail.value;
 			// 判断是否去除空格
 			if(this.trim) value = this.$u.trim(value);
-			// 当前model 赋值
-			this.defaultValue = value;
 			// vue 原生的方法 return 出去
 			this.$emit('input', value);
+			// 当前model 赋值
+			this.defaultValue = value;
 			// 过一个生命周期再发送事件给u-form-item,否则this.$emit('input')更新了父组件的值,但是微信小程序上
 			// 尚未更新到u-form-item,导致获取的值为空,从而校验混论
-			this.$nextTick(() => {
+			// 这里不能延时时间太短,或者使用this.$nextTick,否则在头条上,会造成混乱
+			setTimeout(() => {
+				// 头条小程序由于自身bug,导致中文下,每按下一个键(尚未完成输入),都会触发一次@input,导致错误,这里进行判断处理
+				// #ifdef MP-TOUTIAO
+				if(this.$u.trim(value) == this.lastValue) return ;
+				this.lastValue = value;
+				// #endif
 				// 将当前的值发送到 u-form-item 进行校验
 				this.dispatch('u-form-item', 'on-form-change', value);
-			});
+			}, 40)
 		},
 		/**
 		 * blur 事件
@@ -291,10 +305,15 @@ export default {
 			}, 100)
 			// vue 原生的方法 return 出去
 			this.$emit('blur', event.detail.value);
-			this.$nextTick(() => {
+			setTimeout(() => {
+				// 头条小程序由于自身bug,导致中文下,每按下一个键(尚未完成输入),都会触发一次@input,导致错误,这里进行判断处理
+				// #ifdef MP-TOUTIAO
+				if(this.$u.trim(value) == this.lastValue) return ;
+				this.lastValue = value;
+				// #endif
 				// 将当前的值发送到 u-form-item 进行校验
 				this.dispatch('u-form-item', 'on-form-blur', event.detail.value);
-			});
+			}, 40)
 		},
 		onFormItemError(status) {
 			this.validateState = status;
@@ -317,10 +336,12 @@ export default {
 </script>
 
 <style lang="scss" scoped>
+@import "../../libs/css/style.components.scss";
+
 .u-input {
 	position: relative;
 	flex: 1;
-	display: flex;
+	@include vue-flex;
 
 	&__input {
 		//height: $u-form-item-height;

+ 1 - 1
node_modules/uview-ui/components/u-keyboard/u-keyboard.vue

@@ -179,7 +179,7 @@
 	}
 
 	.u-tooltip {
-		display: flex;
+		@include vue-flex;
 		justify-content: space-between;
 	}
 

+ 2 - 0
node_modules/uview-ui/components/u-lazy-load/u-lazy-load.vue

@@ -237,6 +237,8 @@
 		transform: transition3d(0, 0, 0);
 		// 防止图片加载“闪一下”
 		will-change: transform;
+		/* #ifndef APP-NVUE */
 		display: block;
+		/* #endif */
 	}
 </style>

+ 3 - 1
node_modules/uview-ui/components/u-line-progress/u-line-progress.vue

@@ -106,7 +106,9 @@
 	.u-progress {
 		overflow: hidden;
 		height: 15px;
+		/* #ifndef APP-NVUE */
 		display: inline-flex;
+		/* #endif */
 		align-items: center;
 		width: 100%;
 		border-radius: 100rpx;
@@ -116,7 +118,7 @@
 		width: 0;
 		height: 100%;
 		align-items: center;
-		display: flex;
+		@include vue-flex;
 		justify-items: flex-end;
 		justify-content: space-around;
 		font-size: 20rpx;

+ 4 - 4
node_modules/uview-ui/components/u-link/u-link.vue

@@ -67,13 +67,13 @@
 				// #ifdef MP
 				uni.setClipboardData({
 					data: this.href,
-					success() {
+					success: () => {
 						uni.hideToast();
+						this.$nextTick(() => {
+							this.$u.toast(this.mpTips);
+						})
 					}
 				});
-				this.$nextTick(() => {
-					this.$u.toast(this.mpTips);
-				})
 				// #endif
 			}
 		}

+ 3 - 1
node_modules/uview-ui/components/u-loading/u-loading.vue

@@ -55,7 +55,9 @@
 	@import "../../libs/css/style.components.scss";
 	
 	.u-loading-circle {
-		display: inline-block;
+		/* #ifndef APP-NVUE */
+		display: inline-flex;
+		/* #endif */
 		vertical-align: middle;
 		width: 28rpx;
 		height: 28rpx;

+ 25 - 21
node_modules/uview-ui/components/u-loadmore/u-loadmore.vue

@@ -5,14 +5,18 @@
 		marginTop: marginTop + 'rpx',
 		height: $u.addUnit(height)
 	}">
+		<u-line color="#d4d4d4" length="50"></u-line>
 		<!-- 加载中和没有更多的状态才显示两边的横线 -->
 		<view :class="status == 'loadmore' || status == 'nomore' ? 'u-more' : ''" class="u-load-more-inner">
-			<u-loading class="u-loadmore-icon" :color="iconColor" :mode="iconType == 'circle' ? 'circle' : 'flower'" :show="status == 'loading' && icon"></u-loading>
+			<view class="u-loadmore-icon-wrap">
+				<u-loading class="u-loadmore-icon" :color="iconColor" :mode="iconType == 'circle' ? 'circle' : 'flower'" :show="status == 'loading' && icon"></u-loading>
+			</view>
 			<!-- 如果没有更多的状态下,显示内容为dot(粗点),加载特定样式 -->
-			<view :style="[loadTextStyle]" :class="[(status == 'nomore' && isDot == true) ? 'u-dot-text' : 'u-more-text']" @tap="loadMore">
+			<view class="u-line-1" :style="[loadTextStyle]" :class="[(status == 'nomore' && isDot == true) ? 'u-dot-text' : 'u-more-text']" @tap="loadMore">
 				{{ showText }}
 			</view>
 		</view>
+		<u-line color="#d4d4d4" length="50"></u-line>
 	</view>
 </template>
 
@@ -40,7 +44,7 @@
 			//当前页面背景颜色,如果背景为非白色的时候,需要把此值设置为背景的颜色
 			bgColor: {
 				type: String,
-				default: '#ffffff'
+				default: 'transparent'
 			},
 			// 是否显示加载中的图标
 			icon: {
@@ -120,7 +124,6 @@
 					zIndex: 1,
 					backgroundColor: this.bgColor,
 					// 如果是加载中状态,动画和文字需要距离近一点
-					padding: this.status == 'loading' ? '0 8px' : '0 12px',
 				}
 			},
 			// 加载中圆圈动画的样式
@@ -157,42 +160,43 @@
 <style scoped lang="scss">
 	@import "../../libs/css/style.components.scss";
 	
+	/* #ifdef MP */
+	// 在mp.scss中,赋予了u-line为flex: 1,这里需要一个明确的长度,所以重置掉它
+	// 在组件内部,把组件名(u-line)当做选择器,在微信开发工具会提示不合法,但不影响使用
+	u-line {
+		flex: none;
+	}
+	/* #endif */
+	
 	.u-load-more-wrap {
-		width: 100%;
-		display: flex;
+		@include vue-flex;
 		justify-content: center;
+		align-items: center;
 	}
 	
 	.u-load-more-inner {
-		display: flex;
+		@include vue-flex;
 		justify-content: center;
 		align-items: center;
+		padding: 0 12rpx;
 	}
 	
 	.u-more {
-		width: 60%;
 		position: relative;
-		display: flex;
+		@include vue-flex;
 		justify-content: center;
 	}
 	
-	.u-more::before {
-		content: ' ';
-		position: absolute;
-		border-bottom: 1px solid #d4d4d4;
-		-webkit-transform: scaleY(0.5);
-		transform: scaleY(0.5);
-		width: 100%;
-		top: 50%;
-		left: 0;
-	}
-	
 	.u-dot-text {
 		font-size: 28rpx;
 	}
 	
+	.u-loadmore-icon-wrap {
+		margin-right: 8rpx;
+	}
+	
 	.u-loadmore-icon {
-		display: flex;
+		@include vue-flex;
 		align-items: center;
 		justify-content: center;
 	}

+ 1 - 1
node_modules/uview-ui/components/u-mask/u-mask.vue

@@ -1,5 +1,5 @@
 <template>
-	<view class="u-mask" hover-stop-propagation :style="[maskStyle, zoomStyle]" @tap="click" @touchmove.stop.prevent :class="{
+	<view class="u-mask" hover-stop-propagation :style="[maskStyle, zoomStyle]" @tap="click" @touchmove.stop.prevent="() => {}" :class="{
 		'u-mask-zoom': zoom,
 		'u-mask-show': show
 	}">

+ 19 - 12
node_modules/uview-ui/components/u-message-input/u-message-input.vue

@@ -2,7 +2,7 @@
 	<view class="u-char-box">
 		<view class="u-char-flex">
 			<input :disabled="disabledKeyboard" :value="valueModel" type="number" :focus="focus" :maxlength="maxlength" class="u-input" @input="getVal"/>
-			<view v-for="(item, index) in maxlength" :key="index">
+			<view v-for="(item, index) in loopCharArr" :key="index">
 				<view :class="[breathe && charArrLength == index ? 'u-breathe' : '', 'u-char-item',
 				charArrLength === index && mode == 'box' ? 'u-box-active' : '',
 				mode === 'box' ? 'u-box' : '']" :style="{
@@ -10,7 +10,8 @@
 					fontSize: fontSize + 'rpx',
 					width: width + 'rpx',
 					height: width + 'rpx',
-					color: inactiveColor
+					color: inactiveColor,
+					borderColor: charArrLength === index && mode == 'box' ? activeColor : 'none'
 				}">
 					<view class="u-placeholder-line" :style="{
 							display: charArrLength === index ? 'block' : 'none',
@@ -99,7 +100,7 @@
 			// 激活样式
 			activeColor: {
 				type: String,
-				default: '#2979ff'
+				default: 'red'
 			},
 			// 未激活的样式
 			inactiveColor: {
@@ -118,13 +119,13 @@
 			}
 		},
 		watch: {
-			maxlength: {
-				// 此值设置为true,会在组件加载后无需maxlength变化就会执行一次本监听函数,无需再created生命周期中处理
-				immediate: true,
-				handler(val) {
-					this.maxlength = Number(val);
-				}
-			},
+			// maxlength: {
+			// 	// 此值设置为true,会在组件加载后无需maxlength变化就会执行一次本监听函数,无需再created生命周期中处理
+			// 	immediate: true,
+			// 	handler(val) {
+			// 		this.maxlength = Number(val);
+			// 	}
+			// }, 
 			value: {
 				immediate: true,
 				handler(val) {
@@ -154,6 +155,10 @@
 			},
 			charArrLength() {
 				return this.charArr.length;
+			},
+			// 根据长度,循环输入框的个数,因为头条小程序数值不能用于v-for
+			loopCharArr() {
+				return new Array(this.maxlength);
 			}
 		},
 		methods: {
@@ -196,7 +201,7 @@
 	}
 
 	.u-char-flex {
-		display: flex;
+		@include vue-flex;
 		justify-content: center;
 		flex-wrap: wrap;
 		position: relative;
@@ -223,7 +228,7 @@
 		font-weight: bold;
 		color: $u-main-color;
 		line-height: 90rpx;
-		display: flex;
+		@include vue-flex;
 		justify-content: center;
 		align-items: center;
 	}
@@ -256,7 +261,9 @@
 	}
 
 	.u-placeholder-line {
+		/* #ifndef APP-NVUE */
 		display: none;
+		/* #endif */
 		position: absolute;
 		left: 50%;
 		top: 50%;

+ 1 - 1
node_modules/uview-ui/components/u-modal/u-modal.vue

@@ -266,7 +266,7 @@
 		}
 
 		&__footer {
-			display: flex;
+			@include vue-flex;
 
 			&__button {
 				flex: 1;

+ 5 - 5
node_modules/uview-ui/components/u-navbar/u-navbar.vue

@@ -252,14 +252,14 @@
 	}
 
 	.u-navbar-inner {
-		display: flex;
+		@include vue-flex;
 		justify-content: space-between;
 		position: relative;
 		align-items: center;
 	}
 
 	.u-back-wrap {
-		display: flex;
+		@include vue-flex;
 		align-items: center;
 		flex: 1;
 		flex-grow: 0;
@@ -272,7 +272,7 @@
 	}
 
 	.u-navbar-content-title {
-		display: flex;
+		@include vue-flex;
 		align-items: center;
 		justify-content: center;
 		flex: 1;
@@ -296,14 +296,14 @@
 
 	.u-navbar-right {
 		flex: 1;
-		display: flex;
+		@include vue-flex;
 		align-items: center;
 		justify-content: flex-end;
 	}
 
 	.u-slot-content {
 		flex: 1;
-		display: flex;
+		@include vue-flex;
 		align-items: center;
 	}
 </style>

+ 2 - 2
node_modules/uview-ui/components/u-no-network/u-no-network.vue

@@ -1,5 +1,5 @@
 <template>
-	<view class="u-no-network" v-if="!isConnected" :style="{'z-index': uZIndex}" @touchmove.stop.prevent="">
+	<view class="u-no-network" v-if="!isConnected" :style="{'z-index': uZIndex}" @touchmove.stop.prevent="() => {}">
 		<view class="u-inner">
 			<image class="u-error-icon" :src="image" mode="widthFix"></image>
 			<view class="u-tips">
@@ -190,7 +190,7 @@
 
 	.u-inner {
 		height: 100vh;
-		display: flex;
+		@include vue-flex;
 		flex-direction: column;
 		align-items: center;
 		justify-content: center;

+ 4 - 4
node_modules/uview-ui/components/u-notice-bar/u-notice-bar.vue

@@ -227,26 +227,26 @@ export default {
 }
 
 .u-direction-row {
-	display: flex;
+	@include vue-flex;
 	align-items: center;
 	justify-content: space-between;
 }
 
 .u-left-icon {
-	display: flex;
+	@include vue-flex;
 	align-items: center;
 }
 
 .u-notice-box {
 	flex: 1;
-	display: flex;
+	@include vue-flex;
 	overflow: hidden;
 	margin-left: 12rpx;
 }
 
 .u-right-icon {
 	margin-left: 12rpx;
-	display: flex;
+	@include vue-flex;
 	align-items: center;
 }
 

+ 13 - 2
node_modules/uview-ui/components/u-number-box/u-number-box.vue

@@ -181,6 +181,7 @@
 				inputVal: 1, // 输入框中的值,不能直接使用props中的value,因为应该改变props的状态
 				timer: null, // 用作长按的定时器
 				changeFromInner: false, // 值发生变化,是来自内部还是外部
+				timer: null, // 内部定时器
 			};
 		},
 		created() {
@@ -289,8 +290,18 @@
 			},
 			handleChange(value, type) {
 				if (this.disabled) return;
+				// 清除定时器,避免造成混乱
+				if(this.timer) {
+					clearTimeout(this.timer);
+					this.timer = null;
+				}
 				// 发出input事件,修改通过v-model绑定的值,达到双向绑定的效果
 				this.changeFromInner = true;
+				// 一定时间内,清除changeFromInner标记,否则内部值改变后
+				// 外部通过程序修改value值,将会无效
+				setTimeout(() => {
+					this.changeFromInner = false;
+				}, 150);
 				this.$emit('input', Number(value));
 				this.$emit(type, {
 					// 转为Number类型
@@ -315,7 +326,7 @@
 		text-align: center;
 		padding: 0;
 		margin: 0 6rpx;
-		display: flex;
+		@include vue-flex;
 		align-items: center;
 		justify-content: center;
 	}
@@ -323,7 +334,7 @@
 	.u-icon-plus,
 	.u-icon-minus {
 		width: 60rpx;
-		display: flex;
+		@include vue-flex;
 		justify-content: center;
 		align-items: center;
 	}

+ 3 - 3
node_modules/uview-ui/components/u-number-keyboard/u-number-keyboard.vue

@@ -1,5 +1,5 @@
 <template>
-	<view class="u-keyboard" @touchmove.stop.prevent>
+	<view class="u-keyboard" @touchmove.stop.prevent="() => {}">
 		<view class="u-keyboard-grids">
 			<view
 			    class="u-keyboard-grids-item"
@@ -128,7 +128,7 @@
 	}
 
 	.u-keyboard-grids {
-		display: flex;
+		@include vue-flex;
 		flex-wrap: wrap;
 	}
 
@@ -137,7 +137,7 @@
 		text-align: center;
 		font-size: 50rpx;
 		color: #333;
-		display: flex;
+		@include vue-flex;
 		align-items: center;
 		justify-content: center;
 		height: 110rpx;

+ 3 - 3
node_modules/uview-ui/components/u-parse/libs/MpHtmlParser.js

@@ -1,7 +1,7 @@
 /**
  * html 解析器
  * @tutorial https://github.com/jin-yufeng/Parser
- * @version 20200728
+ * @version 20200828
  * @author JinYufeng
  * @listens MIT
  */
@@ -243,7 +243,7 @@ MpHtmlParser.prototype.setNode = function() {
 			}
 			var width;
 			if (styleObj.width) width = styleObj.width;
-			else if (attrs.width) width = attrs.width.includes('%') ? attrs.width : attrs.width + 'px';
+			else if (attrs.width) width = attrs.width.includes('%') ? attrs.width : parseFloat(attrs.width) + 'px';
 			if (width) {
 				styleObj.width = width;
 				attrs.width = '100%';
@@ -256,7 +256,7 @@ MpHtmlParser.prototype.setNode = function() {
 				attrs.height = styleObj.height;
 				styleObj.height = '';
 			} else if (attrs.height && !attrs.height.includes('%'))
-				attrs.height += 'px';
+				attrs.height = parseFloat(attrs.height) + 'px';
 		}
 		for (var key in styleObj) {
 			var value = styleObj[key];

+ 1 - 1
node_modules/uview-ui/components/u-parse/libs/trees.vue

@@ -112,7 +112,7 @@
 			init() {
 				for (var i = this.nodes.length, n; n = this.nodes[--i];) {
 					if (n.name == 'img') {
-						this.top.imgList.setItem(n.attrs.i, n.attrs.src);
+						this.top.imgList.setItem(n.attrs.i, n.attrs['original-src'] || n.attrs.src);
 						// #ifdef APP-PLUS
 						if (this.lazyLoad && !this.observer) {
 							this.observer = uni.createIntersectionObserver(this).relativeToViewport({

+ 8 - 4
node_modules/uview-ui/components/u-parse/u-parse.vue

@@ -34,7 +34,10 @@
 	}
 	// #endif
 	// #ifdef H5 || APP-PLUS-NVUE || MP-360
-	var windowWidth = uni.getSystemInfoSync().windowWidth,
+	var {
+		windowWidth,
+		platform
+	} = uni.getSystemInfoSync(),
 		cfg = require('./libs/config.js');
 	// #endif
 	// #ifdef APP-PLUS-NVUE
@@ -63,7 +66,7 @@
 	 * @event {Function} imgtap 图片点击事件
 	 * @event {Function} linkpress 链接点击事件
 	 * @author JinYufeng
-	 * @version 20200728
+	 * @version 20200828
 	 * @listens MIT
 	 */
 	export default {
@@ -216,12 +219,13 @@
 						'</div><script>"use strict";function e(e){if(window.__dcloud_weex_postMessage||window.__dcloud_weex_){var t={data:[e]};window.__dcloud_weex_postMessage?window.__dcloud_weex_postMessage(t):window.__dcloud_weex_.postMessage(JSON.stringify(t))}}document.body.onclick=function(){e({action:"click"})},' +
 						(this.showWithAnimation ? 'document.body.style.animation="_show .5s",' : '') +
 						'setTimeout(function(){e({action:"load",text:document.body.innerText,height:document.getElementById("parser").scrollHeight})},50);\x3c/script>';
+					if (platform == 'android') html = html.replace(/%/g, '%25');
 					this.$refs.web.evalJs("document.write('" + html.replace(/'/g, "\\'") + "');document.close()");
 				}
 				this.$refs.web.evalJs(
 					'var t=document.getElementsByTagName("title");t.length&&e({action:"getTitle",title:t[0].innerText});for(var o,n=document.getElementsByTagName("style"),r=1;o=n[r++];)o.innerHTML=o.innerHTML.replace(/body/g,"#parser");for(var a,c=document.getElementsByTagName("img"),s=[],i=0==c.length,d=0,l=0,g=0;a=c[l];l++)parseInt(a.style.width||a.getAttribute("width"))>' +
 					windowWidth + '&&(a.style.height="auto"),a.onload=function(){++d==c.length&&(i=!0)},a.onerror=function(){++d==c.length&&(i=!0),' + (cfg.errorImg ? 'this.src="' + cfg.errorImg + '",' : '') +
-					'e({action:"error",source:"img",target:this})},a.hasAttribute("ignore")||"A"==a.parentElement.nodeName||(a.i=g++,s.push(a.src),a.onclick=function(){e({action:"preview",img:{i:this.i,src:this.src}})});e({action:"getImgList",imgList:s});for(var u,m=document.getElementsByTagName("a"),f=0;u=m[f];f++)u.onclick=function(){var t,o=this.getAttribute("href");if("#"==o[0]){var n=document.getElementById(o.substr(1));n&&(t=n.offsetTop)}return e({action:"linkpress",href:o,offset:t}),!1};for(var h,y=document.getElementsByTagName("video"),v=0;h=y[v];v++)h.style.maxWidth="100%",h.onerror=function(){e({action:"error",source:"video",target:this})}' +
+					'e({action:"error",source:"img",target:this})},a.hasAttribute("ignore")||"A"==a.parentElement.nodeName||(a.i=g++,s.push(a.getAttribute("original-src")||a.src||a.getAttribute("data-src")),a.onclick=function(){e({action:"preview",img:{i:this.i,src:this.src}})});e({action:"getImgList",imgList:s});for(var u,m=document.getElementsByTagName("a"),f=0;u=m[f];f++)u.onclick=function(){var t,o=this.getAttribute("href");if("#"==o[0]){var n=document.getElementById(o.substr(1));n&&(t=n.offsetTop)}return e({action:"linkpress",href:o,offset:t}),!1};for(var h,y=document.getElementsByTagName("video"),v=0;h=y[v];v++)h.style.maxWidth="100%",h.onerror=function(){e({action:"error",source:"video",target:this})}' +
 					(this.autopause ? ',h.onplay=function(){for(var e,t=0;e=y[t];t++)e!=this&&e.pause()}' : '') +
 					';for(var _,p=document.getElementsByTagName("audio"),w=0;_=p[w];w++)_.onerror=function(){e({action:"error",source:"audio",target:this})};' +
 					(this.autoscroll ? 'for(var T,E=document.getElementsByTagName("table"),B=0;T=E[B];B++){var N=document.createElement("div");N.style.overflow="scroll",T.parentNode.replaceChild(N,T),N.appendChild(T)}' : '') +
@@ -284,7 +288,7 @@
 					}
 					if (!img.hasAttribute('ignore') && img.parentElement.nodeName != 'A') {
 						img.i = j++;
-						_ts.imgList.push(img.src || img.getAttribute('data-src'));
+						_ts.imgList.push(img.getAttribute('original-src') || img.src || img.getAttribute('data-src'));
 						img.onclick = function() {
 							var preview = true;
 							this.ignore = () => preview = false;

+ 2 - 2
node_modules/uview-ui/components/u-picker/u-picker.vue

@@ -610,7 +610,7 @@ export default {
 	width: 100%;
 	height: 90rpx;
 	padding: 0 40rpx;
-	display: flex;
+	@include vue-flex;
 	justify-content: space-between;
 	align-items: center;
 	box-sizing: border-box;
@@ -642,7 +642,7 @@ export default {
 }
 
 .u-column-item {
-	display: flex;
+	@include vue-flex;
 	align-items: center;
 	justify-content: center;
 	font-size: 32rpx;

+ 11 - 7
node_modules/uview-ui/components/u-popup/u-popup.vue

@@ -1,8 +1,8 @@
 <template>
 	<view v-if="visibleSync" :style="[customStyle, {
 		zIndex: uZindex - 1
-	}]" :class="{ 'u-drawer-visible': showDrawer }" class="u-drawer" hover-stop-propagation>
-		<u-mask :custom-style="maskCustomStyle" :maskClickAble="maskCloseAble" :z-index="uZindex - 2" :show="showDrawer && mask" @click="maskClick"></u-mask>
+	}]" class="u-drawer" hover-stop-propagation>
+		<u-mask :duration="duration" :custom-style="maskCustomStyle" :maskClickAble="maskCloseAble" :z-index="uZindex - 2" :show="showDrawer && mask" @click="maskClick"></u-mask>
 		<view
 			class="u-drawer-content"
 			@tap="modeCenterClose(mode)"
@@ -188,6 +188,11 @@ export default {
 			default() {
 				return {}
 			}
+		},
+		// 遮罩打开或收起的动画过渡时间,单位ms
+		duration: {
+			type: [String, Number],
+			default: 250
 		}
 	},
 	data() {
@@ -237,6 +242,7 @@ export default {
 				// 不加可能圆角无效
 				style.overflow = 'hidden';
 			}
+			if(this.duration) style.transition = `all ${this.duration / 1000}s linear`;
 			return style;
 		},
 		// 中部弹窗的特有样式
@@ -323,7 +329,7 @@ export default {
 				this.timer = setTimeout(() => {
 					this[param2] = status;
 					this.$emit(status ? 'open' : 'close');
-				}, 300);
+				}, this.duration);
 			}
 		}
 	}
@@ -351,7 +357,7 @@ export default {
 	/* #endif */
 	position: absolute;
 	z-index: 1003;
-	transition: all 0.3s linear;
+	transition: all 0.25s linear;
 }
 
 .u-drawer__scroll-view {
@@ -388,10 +394,8 @@ export default {
 }
 
 .u-drawer-center {
-	/* #ifndef APP-NVUE */
-	display: flex;
+	@include vue-flex;
 	flex-direction: column;
-	/* #endif */
 	bottom: 0;
 	left: 0;
 	right: 0;

+ 32 - 9
node_modules/uview-ui/components/u-radio-group/u-radio-group.vue

@@ -62,7 +62,7 @@
 			},
 			// 每个checkbox占u-checkbox-group的宽度
 			width: {
-				type: String,
+				type: [String, Number],
 				default: 'auto'
 			},
 			// 是否每个checkbox都换行
@@ -71,23 +71,46 @@
 				default: false
 			}
 		},
-		provide() {
-			return {
-				radioGroup: this
+		created() {
+			// 如果将children定义在data中,在微信小程序会造成循环引用而报错
+			this.children = [];
+		},
+		watch: {
+			// 当父组件需要子组件需要共享的参数发生了变化,手动通知子组件
+			parentData() {
+				if(this.children.length) {
+					this.children.map(child => {
+						// 判断子组件(u-radio)如果有updateParentData方法的话,就就执行(执行的结果是子组件重新从父组件拉取了最新的值)
+						typeof(child.updateParentData) == 'function' && child.updateParentData();
+					})
+				}
+			},
+		},
+		computed: {
+			// 这里computed的变量,都是子组件u-radio需要用到的,由于头条小程序的兼容性差异,子组件无法实时监听父组件参数的变化
+			// 所以需要手动通知子组件,这里返回一个parentData变量,供watch监听,在其中去通知每一个子组件重新从父组件(u-radio-group)
+			// 拉取父组件新的变化后的参数
+			parentData() {
+				return [this.value, this.disabled, this.activeColor, this.size, this.labelDisabled, this.shape, this.iconSize, this.width, this.wrap];
 			}
 		},
 		methods: {
 			// 该方法有子组件radio调用,当一个radio被选中的时候,给父组件设置value值(props传递的value)
 			setValue(val) {
+				// 通过子组件传递过来的val值(此被选中的子组件内部已将parentValue设置等于val的值),将其他
+				// u-radio设置未选中的状态
+				this.children.map(child => {
+					if(child.parentData.value != val) child.parentData.value = '';
+				})
 				// 通过emit事件,设置父组件通过v-model双向绑定的值
 				this.$emit('input', val);
+				this.$emit('change', val);
 				// 等待下一个周期再执行,因为this.$emit('input')作用于父组件,再反馈到子组件内部,需要时间
-				this.$nextTick(function() {
-					this.$emit('change', val);
-					// 发出事件,用于在表单组件中嵌入radio的情况,进行验证
+				// 由于头条小程序执行迟钝,故需要用几十毫秒的延时
+				setTimeout(() => {
 					// 将当前的值发送到 u-form-item 进行校验
 					this.dispatch('u-form-item', 'on-form-change', val);
-				});
+				}, 60)
 			}
 		}
 	}
@@ -97,7 +120,7 @@
 	@import "../../libs/css/style.components.scss";
 	
 	.u-radio-group {
-		/* #ifndef MP */
+		/* #ifndef MP || APP-NVUE */
 		display: inline-flex;
 		flex-wrap: wrap;
 		/* #endif */

+ 60 - 26
node_modules/uview-ui/components/u-radio/u-radio.vue

@@ -2,6 +2,7 @@
 	<view class="u-radio" :style="[radioStyle]">
 		<view class="u-radio__icon-wrap" @tap="toggle" :class="[iconClass]" :style="[iconStyle]">
 			<u-icon
+				class="u-radio__icon-wrap__icon"
 			    name="checkbox-mark"
 			    :size="elIconSize" 
 				:color="iconColor"/>
@@ -70,43 +71,57 @@
 		},
 		data() {
 			return {
-				parentDisabled: false
+				// 父组件的默认值,因为头条小程序不支持在computed中使用this.parent.shape的形式
+				// 故只能使用如此方法
+				parentData: {
+					iconSize: null,
+					labelDisabled: null,
+					disabled: null,
+					shape: null,
+					activeColor: null,
+					size: null,
+					width: null,
+					height: null,
+					value: null,
+					wrap: null
+				}
 			};
 		},
 		created() {
-			// this.parentDisabled = this.parent.disabled;
-			// 支付宝小程序不支持provide/inject,所以使用这个方法获取整个父组件,在created定义,避免循环应用
-			this.parent = this.$u.$parent.call(this, 'u-radio-group');
+			this.parent = false;
+			// 支付宝小程序不支持provide/inject,所以使用这个方法获取整个父组件,在created定义,避免循环引用
+			this.updateParentData();
+			this.parent.children.push(this);
 		},
 		computed: {
 			// 是否禁用,如果父组件u-raios-group禁用的话,将会忽略子组件的配置
 			elDisabled() {
-				return this.disabled !== '' ? this.disabled : this.parent ? this.parent.disabled : false;
+				return this.disabled !== '' ? this.disabled : this.parentData.disabled !== null ? this.parentData.disabled : false;
 			},
 			// 是否禁用label点击
 			elLabelDisabled() {
-				return this.labelDisabled !== '' ? this.labelDisabled : this.parent ? this.parent.labelDisabled : false;
+				return this.labelDisabled !== '' ? this.labelDisabled : this.parentData.labelDisabled !== null ? this.parentData.labelDisabled : false;
 			},
 			// 组件尺寸,对应size的值,默认值为34rpx
 			elSize() {
-				return this.size ? this.size : (this.parent ? this.parent.size : 34);
+				return this.size ? this.size : (this.parentData.size ? this.parentData.size : 34);
 			},
 			// 组件的勾选图标的尺寸,默认20
 			elIconSize() {
-				return this.iconSize ? this.iconSize : (this.parent ? this.parent.iconSize : 20);
+				return this.iconSize ? this.iconSize : (this.parentData.iconSize ? this.parentData.iconSize : 20);
 			},
 			// 组件选中激活时的颜色
 			elActiveColor() {
-				return this.activeColor ? this.activeColor : (this.parent ? this.parent.activeColor : 'primary');
+				return this.activeColor ? this.activeColor : (this.parentData.activeColor ? this.parentData.activeColor : 'primary');
 			},
 			// 组件的形状
 			elShape() {
-				return this.shape ? this.shape : (this.parent ? this.parent.shape : 'circle');
+				return this.shape ? this.shape : (this.parentData.shape ? this.parentData.shape : 'circle');
 			},
 			// 设置radio的状态,要求radio的name等于parent的value时才为选中状态
 			iconStyle() {
 				let style = {};
-				if (this.elActiveColor && this.name == this.parent.value && !this.elDisabled) {
+				if (this.elActiveColor && this.parentData.value == this.name && !this.elDisabled) {
 					style.borderColor = this.elActiveColor;
 					style.backgroundColor = this.elActiveColor;
 				}
@@ -115,32 +130,32 @@
 				return style;
 			},
 			iconColor() {
-				return this.name == this.parent.value ? '#ffffff' : 'transparent';
+				return this.name ==  this.parentData.value ? '#ffffff' : 'transparent';
 			},
 			iconClass() {
 				let classes = [];
 				classes.push('u-radio__icon-wrap--' + this.elShape);
-				if (this.name == this.parent.value) classes.push('u-radio__icon-wrap--checked');
+				if (this.name == this.parentData.value) classes.push('u-radio__icon-wrap--checked');
 				if (this.elDisabled) classes.push('u-radio__icon-wrap--disabled');
-				if (this.name == this.parent.value && this.elDisabled) classes.push(
+				if (this.name == this.parentData.value && this.elDisabled) classes.push(
 					'u-radio__icon-wrap--disabled--checked');
 				// 支付宝小程序无法动态绑定一个数组类名,否则解析出来的结果会带有",",而导致失效
 				return classes.join(' ');
 			},
 			radioStyle() {
 				let style = {};
-				if (this.parent.width) {
-					style.width = this.parent.width;
+				if (this.parentData.width) {
+					style.width = this.$u.addUnit(this.parentData.width);
 					// #ifdef MP
 					// 各家小程序因为它们特殊的编译结构,使用float布局
 					style.float = 'left';
 					// #endif
 					// #ifndef MP
 					// H5和APP使用flex布局
-					style.flex = `0 0 ${this.parent.width}`;
+					style.flex = `0 0 ${this.$u.addUnit(this.parentData.width)}`;
 					// #endif
 				}
-				if (this.parent.wrap) {
+				if (this.parentData.wrap) {
 					style.width = '100%';
 					// #ifndef MP
 					// H5和APP使用flex布局,将宽度设置100%,即可自动换行
@@ -151,22 +166,33 @@
 			}
 		},
 		methods: {
+			updateParentData() {
+				this.getParentData('u-radio-group');
+			},
 			onClickLabel() {
 				if (!this.elLabelDisabled && !this.elDisabled) {
-					this.parent.setValue(this.name);
-					this.emitEvent();
+					this.setRadioCheckedStatus();
 				}
 			},
 			toggle() {
 				if (!this.elDisabled) {
-					this.parent.setValue(this.name);
-					this.emitEvent();
+					this.setRadioCheckedStatus();
 				}
 			},
 			emitEvent() {
 				// u-radio的name不等于父组件的v-model的值时(意味着未选中),才发出事件,避免多次点击触发事件
-				if(this.parent.value != this.name) this.$emit('change', this.name);
+				if(this.parentData.value != this.name) this.$emit('change', this.name);
 			},
+			// 改变组件选中状态
+			// 这里的改变的依据是,更改本组件的parentData.value值为本组件的name值,同时通过父组件遍历所有u-radio实例
+			// 将本组件外的其他u-radio的parentData.value都设置为空(由computed计算后,都被取消选中状态),因而只剩下一个为选中状态
+			setRadioCheckedStatus() {
+				this.emitEvent();
+				if(this.parent) {
+					this.parent.setValue(this.name);
+					this.parentData.value = this.name;
+				}
+			}
 		}
 	};
 </script>
@@ -175,8 +201,9 @@
 	@import "../../libs/css/style.components.scss";
 
 	.u-radio {
-		display: -webkit-flex;
-		display: flex;
+		/* #ifndef APP-NVUE */
+		display: inline-flex;
+		/* #endif */
 		align-items: center;
 		overflow: hidden;
 		user-select: none;
@@ -184,7 +211,7 @@
 		
 		&__icon-wrap {
 			color: $u-content-color;
-			display: flex;
+			@include vue-flex;
 			flex: none;
 			align-items: center;
 			justify-content: center;
@@ -198,6 +225,13 @@
 			border: 1px solid #c8c9cc;
 			transition-duration: 0.2s;
 			
+			/* #ifdef MP-TOUTIAO */
+			// 头条小程序兼容性问题,需要设置行高为0,否则图标偏下
+			&__icon {
+				line-height: 0;
+			}
+			/* #endif */
+			
 			&--circle {
 				border-radius: 100%;
 			}

+ 6 - 4
node_modules/uview-ui/components/u-rate/u-rate.vue

@@ -123,14 +123,14 @@ export default {
 		// 获取评分组件盒子的布局信息
 		getElRectById() {
 			// uView封装的获取节点的方法,详见文档
-			this.$u.getRect('#' + this.elId).then(res => {
+			this.$uGetRect('#' + this.elId).then(res => {
 				this.starBoxLeft = res.left;
 			})
 		},
 		// 获取单个星星的尺寸
 		getElRectByClass() {
 			// uView封装的获取节点的方法,详见文档
-			this.$u.getRect('.' + this.elClass).then(res => {
+			this.$uGetRect('.' + this.elClass).then(res => {
 				this.starWidth = res.width;
 				// 把每个星星右边到组件盒子左边的距离放入数组中
 				for (let i = 0; i < this.count; i++) {
@@ -191,8 +191,10 @@ export default {
 		}
 	},
 	mounted() {
-		this.getElRectById();
-		this.getElRectByClass();
+		setTimeout(() => {
+			this.getElRectById();
+			this.getElRectByClass();
+		}, 100)
 	}
 };
 </script>

+ 2 - 2
node_modules/uview-ui/components/u-read-more/u-read-more.vue

@@ -160,12 +160,12 @@
 			position: relative;
 			width: 100%;
 			padding-bottom: 26rpx;
-			display: flex;
+			@include vue-flex;
 			align-items: center;
 			justify-content: center;
 
 			&__readmore-btn {
-				display: flex;
+				@include vue-flex;
 				align-items: center;
 				justify-content: center;
 				line-height: 1;

+ 5 - 3
node_modules/uview-ui/components/u-row-notice/u-row-notice.vue

@@ -217,19 +217,21 @@ export default {
 }
 
 .u-direction-row {
-	display: flex;
+	@include vue-flex;
 	align-items: center;
 	justify-content: space-between;
 }
 
 .u-left-icon {
+	/* #ifndef APP-NVUE */
 	display: inline-flex;
+	/* #endif */
 	align-items: center;
 }
 
 .u-notice-box {
 	flex: 1;
-	display: flex;
+	@include vue-flex;
 	overflow: hidden;
 	margin-left: 12rpx;
 }
@@ -245,7 +247,7 @@ export default {
 	text-align: right;
 	// 这一句很重要,为了能让滚动左右连接起来
 	padding-left: 100%;
-	display: flex;
+	@include vue-flex;
 	flex-wrap: nowrap;
 }
 

+ 3 - 8
node_modules/uview-ui/components/u-row/u-row.vue

@@ -38,11 +38,6 @@
 				default: 'center'
 			}
 		},
-		provide() {
-			return {
-				gutter: this.gutter
-			}
-		},
 		computed: {
 			uJustify() {
 				if (this.justify == 'end' || this.justify == 'start') return 'flex-' + this.justify;
@@ -68,14 +63,14 @@
 
 	.u-row {
 		// 由于微信小程序编译后奇怪的页面结构,只能使用float布局实现,flex无法实现
-		/* #ifndef MP-WEIXIN || MP-QQ */
-		display: flex;
+		/* #ifndef MP-WEIXIN || MP-QQ || MP-TOUTIAO */
+		@include vue-flex;
 		/* #endif */
 		flex-wrap: wrap;
 	}
 
 	.u-row:after {
-		/* #ifdef MP-WEIXIN || MP-QQ */
+		/* #ifdef MP-WEIXIN || MP-QQ || MP-TOUTIAO */
 		display: table;
 		clear: both;
 		content: "";

+ 14 - 14
node_modules/uview-ui/components/u-search/u-search.vue

@@ -22,8 +22,8 @@
 				@input="inputChange"
 				:disabled="disabled"
 				@focus="getFocus"
-				:maxlength="getMaxlength"
 				:focus="focus"
+				:maxlength="maxlength"
 				placeholder-class="u-placeholder-class"
 				:placeholder="placeholder"
 				:placeholder-style="`color: ${placeholderColor}`"
@@ -164,7 +164,7 @@ export default {
 		// 输入框最大能输入的长度,-1为不限制长度(来自uniapp文档)
 		maxlength: {
 			type: [Number, String],
-			default: -1
+			default: '-1'
 		},
 		// 搜索图标的颜色,默认同输入框字体颜色
 		searchIconColor: {
@@ -227,10 +227,6 @@ export default {
 			if (this.borderColor) return `1px solid ${this.borderColor}`;
 			else return 'none';
 		},
-		// 将maxlength转为数值
-		getMaxlength() {
-			return Number(this.maxlength);
-		}
 	},
 	methods: {
 		// 目前HX2.6.9 v-model双向绑定无效,故监听input事件获取输入框内容的变化
@@ -249,14 +245,18 @@ export default {
 		// 确定搜索
 		search(e) {
 			this.$emit('search', e.detail.value);
-			// 收起键盘
-			uni.hideKeyboard();
+			try{
+				// 收起键盘
+				uni.hideKeyboard();
+			}catch(e){}
 		},
 		// 点击右边自定义按钮的事件
 		custom() {
 			this.$emit('custom', this.keyword);
-			// 收起键盘
-			uni.hideKeyboard();
+			try{
+				// 收起键盘
+				uni.hideKeyboard();
+			}catch(e){}
 		},
 		// 获取焦点
 		getFocus() {
@@ -287,20 +287,20 @@ export default {
 @import "../../libs/css/style.components.scss";
 
 .u-search {
-	display: flex;
+	@include vue-flex;
 	align-items: center;
 	flex: 1;
 }
 
 .u-content {
-	display: flex;
+	@include vue-flex;
 	align-items: center;
 	padding: 0 18rpx;
 	flex: 1;
 }
 
 .u-clear-icon {
-	display: flex;
+	@include vue-flex;
 	align-items: center;
 }
 
@@ -315,7 +315,7 @@ export default {
 .u-close-wrap {
 	width: 40rpx;
 	height: 100%;
-	display: flex;
+	@include vue-flex;
 	align-items: center;
 	justify-content: center;
 	border-radius: 50%;

+ 3 - 3
node_modules/uview-ui/components/u-section/u-section.vue

@@ -119,7 +119,7 @@
 	@import "../../libs/css/style.components.scss";
 	
 	.u-section {
-		display: flex;
+		@include vue-flex;
 		justify-content: space-between;
 		align-items: center;
 		width: 100%;
@@ -128,7 +128,7 @@
 			position: relative;
 			font-size: 28rpx;
 			padding-left: 20rpx;
-			display: flex;
+			@include vue-flex;
 			align-items: center;
 			
 			&__icon-wrap {
@@ -143,7 +143,7 @@
 		&__right-info {
 			color: $u-tips-color;
 			font-size: 26rpx;
-			display: flex;
+			@include vue-flex;
 			align-items: center;
 			
 			&__icon-arrow {

+ 2 - 2
node_modules/uview-ui/components/u-select/u-select.vue

@@ -386,7 +386,7 @@ export default {
 	}
 
 	&__header {
-		display: flex;
+		@include vue-flex;
 		align-items: center;
 		justify-content: space-between;
 		height: 80rpx;
@@ -404,7 +404,7 @@ export default {
 			box-sizing: border-box;
 
 			&__item {
-				display: flex;
+				@include vue-flex;
 				align-items: center;
 				justify-content: center;
 				font-size: 32rpx;

+ 6 - 6
node_modules/uview-ui/components/u-steps/u-steps.vue

@@ -114,7 +114,7 @@ $u-steps-item-number-width: 44rpx;
 $u-steps-item-dot-width: 20rpx;
 
 .u-steps {
-	display: flex;
+	@include vue-flex;
 	
 	.u-steps__item {
 		flex: 1;
@@ -123,13 +123,13 @@ $u-steps-item-dot-width: 20rpx;
 		min-width: 100rpx;
 		font-size: 26rpx;
 		color: #8799a3;
-		display: flex;
+		@include vue-flex;
 		justify-content: center;
 		flex-direction: column;
 		align-items: center;
 		
 		&--row {
-			display: flex;
+			@include vue-flex;
 			flex-direction: column;
 			
 			.u-steps__item__line {
@@ -149,7 +149,7 @@ $u-steps-item-dot-width: 20rpx;
 		}
 		
 		&--column {
-			display: flex;
+			@include vue-flex;
 			flex-direction: row;
 			justify-content: flex-start;
 			min-height: 120rpx;
@@ -171,7 +171,7 @@ $u-steps-item-dot-width: 20rpx;
 		}
 		
 		&__num {
-			display: flex;
+			@include vue-flex;
 			align-items: center;
 			justify-content: center;
 			width: $u-steps-item-number-width;
@@ -184,7 +184,7 @@ $u-steps-item-dot-width: 20rpx;
 		&__dot {
 			width: $u-steps-item-dot-width;
 			height: $u-steps-item-dot-width;
-			display: flex;
+			@include vue-flex;
 			border-radius: 50%;
 		}
 		

+ 3 - 4
node_modules/uview-ui/components/u-subsection/u-subsection.vue

@@ -306,7 +306,7 @@
 	@import "../../libs/css/style.components.scss";
 	
 	.u-subsection {
-		display: flex;
+		@include vue-flex;
 		align-items: center;
 		overflow: hidden;
 		position: relative;
@@ -317,11 +317,10 @@
 		text-align: center;
 		font-size: 26rpx;
 		height: 100%;
-		display: flex;
+		@include vue-flex;
 		align-items: center;
 		justify-content: center;
 		color: $u-main-color;
-		display: inline-flex;
 		padding: 0 6rpx;
 	}
 
@@ -348,7 +347,7 @@
 	.u-item-text {
 		transition: all 0.35s;
 		color: $u-main-color;
-		display: flex;
+		@include vue-flex;
 		align-items: center;
 		position: relative;
 		z-index: 3;

+ 1 - 1
node_modules/uview-ui/components/u-swipe-action/u-swipe-action.vue

@@ -230,7 +230,7 @@ export default {
 }
 
 .u-swipe-view {
-	display: flex;
+	@include vue-flex;
 	height: initial;
 	position: relative;
 	/* 这一句很关键,覆盖默认的绝对定位 */

+ 8 - 6
node_modules/uview-ui/components/u-swiper/u-swiper.vue

@@ -5,17 +5,17 @@
 		<swiper :current="elCurrent" @change="change" @animationfinish="animationfinish" :interval="interval" :circular="circular" :duration="duration" :autoplay="autoplay"
 		 :previous-margin="effect3d ? effect3dPreviousMargin + 'rpx' : '0'" :next-margin="effect3d ? effect3dPreviousMargin + 'rpx' : '0'"
 		 :style="{
-				height: height + 'rpx'
+				height: height + 'rpx',
+				backgroundColor: bgColor
 			}">
 			<swiper-item class="u-swiper-item" v-for="(item, index) in list" :key="index">
 				<view class="u-list-image-wrap" @tap.stop.prevent="listClick(index)" :class="[uCurrent != index ? 'u-list-scale' : '']" :style="{
 						borderRadius: `${borderRadius}rpx`,
 						transform: effect3d && uCurrent != index ? 'scaleY(0.9)' : 'scaleY(1)',
 						margin: effect3d && uCurrent != index ? '0 20rpx' : 0,
-						backgroundColor: bgColor
 					}">
-					<image class="u-swiper-image" :src="item[name]" :mode="imgMode"></image>
-					<view v-if="title" class="u-swiper-title u-line-1" :style="[{
+					<image class="u-swiper-image" :src="item[name] || item" :mode="imgMode"></image>
+					<view v-if="title && item.title" class="u-swiper-title u-line-1" :style="[{
 							'padding-bottom': titlePaddingBottom
 						}, titleStyle]">
 						{{ item.title }}
@@ -243,7 +243,9 @@
 		width: 100%;
 		will-change: transform;
 		height: 100%;
+		/* #ifndef APP-NVUE */
 		display: block;
+		/* #endif */
 		/* #ifdef H5 */
 		pointer-events: none;
 		/* #endif */
@@ -252,7 +254,7 @@
 	.u-swiper-indicator {
 		padding: 0 24rpx;
 		position: absolute;
-		display: flex;
+		@include vue-flex;
 		width: 100%;
 		z-index: 1;
 	}
@@ -331,7 +333,7 @@
 	}
 
 	.u-swiper-item {
-		display: flex;
+		@include vue-flex;
 		overflow: hidden;
 		align-items: center;
 	}

+ 4 - 2
node_modules/uview-ui/components/u-switch/u-switch.vue

@@ -111,7 +111,9 @@
 	
 	.u-switch {
 		position: relative;
+		/* #ifndef APP-NVUE */
 		display: inline-block;
+		/* #endif */
 		box-sizing: initial;
 		width: 2em;
 		height: 1em;
@@ -123,7 +125,7 @@
 	}
 
 	.u-switch__node {
-		display: flex;
+		@include vue-flex;
 		align-items: center;
 		justify-content: center;
 		position: absolute;
@@ -142,7 +144,7 @@
 	}
 
 	.u-switch__loading {
-		display: flex;
+		@include vue-flex;
 		align-items: center;
 		justify-content: center;
 	}

+ 19 - 12
node_modules/uview-ui/components/u-tabbar/u-tabbar.vue

@@ -1,5 +1,5 @@
 <template>
-	<view v-if="show" class="u-tabbar" @touchmove.stop.prevent>
+	<view v-if="show" class="u-tabbar" @touchmove.stop.prevent="() => {}">
 		<view class="u-tabbar__content safe-area-inset-bottom" :style="{
 			height: $u.addUnit(height),
 			backgroundColor: bgColor,
@@ -21,7 +21,7 @@
 						:color="elColor(index)"
 						:custom-prefix="item.customIcon ? 'custom-icon' : 'uicon'"
 					></u-icon>
-					<u-badge :count="item.count" :is-dot="item.isDot" 
+					<u-badge :count="item.count" :is-dot="item.isDot"
 						v-if="item.count"
 						:offset="[-2, getOffsetRight(item.count, item.isDot)]"
 					></u-badge>
@@ -41,7 +41,7 @@
 			</view>
 		</view>
 		<!-- 这里加上一个48rpx的高度,是为了增高有凸起按钮时的防塌陷高度(也即按钮凸出来部分的高度) -->
-		<view class="u-fixed-placeholder safe-area-inset-bottom" :style="{ 
+		<view class="u-fixed-placeholder safe-area-inset-bottom" :style="{
 				height: `calc(${$u.addUnit(height)} + ${midButton ? 48 : 0}rpx)`,
 			}"></view>
 	</view>
@@ -121,7 +121,7 @@
 		data() {
 			return {
 				// 由于安卓太菜了,通过css居中凸起按钮的外层元素有误差,故通过js计算将其其中
-				midButtonLeft: '50%', 
+				midButtonLeft: '50%',
 				pageUrl: '', // 当前
 			}
 		},
@@ -183,7 +183,7 @@
 							// promise返回成功,
 							this.switchTab(index);
 						}).catch(err => {
-							
+
 						})
 					} else if(beforeSwitch === true) {
 						// 如果返回true
@@ -230,14 +230,17 @@
 </script>
 
 <style scoped lang="scss">
+	@import "../../libs/css/style.components.scss";
 	.u-fixed-placeholder {
+		/* #ifndef APP-NVUE */
 		box-sizing: content-box;
+		/* #endif */
 	}
 
 	.u-tabbar {
 
 		&__content {
-			display: flex;
+			@include vue-flex;
 			align-items: center;
 			position: relative;
 			position: fixed;
@@ -245,7 +248,9 @@
 			left: 0;
 			width: 100%;
 			z-index: 998;
+			/* #ifndef APP-NVUE */
 			box-sizing: content-box;
+			/* #endif */
 
 			&__circle__border {
 				border-radius: 100%;
@@ -259,7 +264,7 @@
 				// 故使用js计算的形式来定位,此处不注释,是因为js计算有延后,避免出现位置闪动
 				left: 50%;
 				transform: translateX(-50%);
-				
+
 				&:after {
 					border-radius: 100px;
 				}
@@ -270,14 +275,14 @@
 				justify-content: center;
 				height: 100%;
 				padding: 12rpx 0;
-				display: flex;
+				@include vue-flex;
 				flex-direction: column;
 				align-items: center;
 				position: relative;
 
 				&__button {
 					position: absolute;
-					top: 10rpx;
+					top: 14rpx;
 					left: 50%;
 					transform: translateX(-50%);
 				}
@@ -287,7 +292,7 @@
 					font-size: 26rpx;
 					line-height: 28rpx;
 					position: absolute;
-					bottom: 12rpx;
+					bottom: 14rpx;
 					left: 50%;
 					transform: translateX(-50%);
 				}
@@ -295,17 +300,19 @@
 
 			&__circle {
 				position: relative;
-				display: flex;
+				@include vue-flex;
 				flex-direction: column;
 				justify-content: space-between;
 				z-index: 10;
+				/* #ifndef APP-NVUE */
 				height: calc(100% - 1px);
+				/* #endif */
 
 				&__button {
 					width: 90rpx;
 					height: 90rpx;
 					border-radius: 100%;
-					display: flex;
+					@include vue-flex;
 					justify-content: center;
 					align-items: center;
 					position: absolute;

+ 0 - 5
node_modules/uview-ui/components/u-table/u-table.vue

@@ -59,11 +59,6 @@
 				default: '#ffffff'
 			}
 		},
-		provide() {
-			return {
-				uTable: this,
-			};
-		},
 		data() {
 			return {}
 		},

+ 4 - 2
node_modules/uview-ui/components/u-tabs-swiper/u-tabs-swiper.vue

@@ -381,6 +381,7 @@
 		transition-property: background-color, color;
 	}
 
+	/* #ifndef APP-NVUE */
 	::-webkit-scrollbar,
 	::-webkit-scrollbar,
 	::-webkit-scrollbar {
@@ -390,6 +391,7 @@
 		-webkit-appearance: none;
 		background: transparent;
 	}
+	/* #endif */
 
 	/* #ifdef H5 */
 	// 通过样式穿透,隐藏H5下,scroll-view下的滚动条
@@ -414,7 +416,7 @@
 	}
 
 	.u-tabs-scorll-flex {
-		display: flex;
+		@include vue-flex;
 		justify-content: space-between;
 	}
 
@@ -454,7 +456,7 @@
 		position: absolute;
 		top: 0;
 		transition-property: left, background-color;
-		display: flex;
+		@include vue-flex;
 		flex-direction: row;
 		justify-content: center;
 		align-items: center;

+ 8 - 2
node_modules/uview-ui/components/u-tabs/u-tabs.vue

@@ -296,6 +296,7 @@
 		box-sizing: border-box;
 	}
 
+	/* #ifndef APP-NVUE */
 	::-webkit-scrollbar,
 	::-webkit-scrollbar,
 	::-webkit-scrollbar {
@@ -305,9 +306,13 @@
 		-webkit-appearance: none;
 		background: transparent;
 	}
+	/* #endif */
 
 	.u-scroll-box {
 		position: relative;
+		/* #ifdef MP-TOUTIAO */
+		white-space: nowrap;
+		/* #endif */
 	}
 
 	/* #ifdef H5 */
@@ -319,7 +324,6 @@
 		-webkit-appearance: none;
 		background: transparent;
 	}
-
 	/* #endif */
 
 	.u-scroll-view {
@@ -330,7 +334,9 @@
 
 	.u-tab-item {
 		position: relative;
+		/* #ifndef APP-NVUE */
 		display: inline-block;
+		/* #endif */
 		text-align: center;
 		transition-property: background-color, color;
 	}
@@ -341,7 +347,7 @@
 	}
 
 	.u-tabs-scorll-flex {
-		display: flex;
+		@include vue-flex;
 		justify-content: space-between;
 	}
 </style>

+ 4 - 2
node_modules/uview-ui/components/u-tag/u-tag.vue

@@ -112,9 +112,9 @@
 			customStyle() {
 				let style = {};
 				// 文字颜色(如果有此值,会覆盖type值的颜色)
-				if(this.color) style.color = this.color+"!important";
+				if(this.color) style.color = this.color;
 				// tag的背景颜色(如果有此值,会覆盖type值的颜色)
-				if(this.bgColor) style.backgroundColor = this.bgColor+"!important";
+				if(this.bgColor) style.backgroundColor = this.bgColor;
 				// 如果是镂空型tag,没有传递边框颜色(borderColor)的话,使用文字的颜色(color属性)
 				if(this.mode == 'plain' && this.color && !this.borderColor) style.borderColor = this.color;
 				else style.borderColor = this.borderColor;
@@ -164,7 +164,9 @@
 		box-sizing: border-box;
 		align-items: center;
 		border-radius: 6rpx;
+		/* #ifndef APP-NVUE */
 		display: inline-block;
+		/* #endif */
 		line-height: 1;
 	}
 	

+ 25 - 61
node_modules/uview-ui/components/u-td/u-td.vue

@@ -21,28 +21,39 @@
 				default: 'auto'
 			}
 		},
-		inject: ['uTable'],
-		computed: {
-			tdStyle() {
+		data() {
+			return {
+				tdStyle: {
+					
+				}
+			}
+		},
+		created() {
+			this.parent = false;
+		},
+		mounted() {
+			this.parent = this.$u.$parent.call(this, 'u-table');
+			if (this.parent) {
+				// 将父组件的相关参数,合并到本组件
 				let style = {};
 				if (this.width != "auto") style.flex = `0 0 ${this.width}`;
-				style.textAlign = this.uTable.align;
-				style.fontSize = this.uTable.fontSize + 'rpx';
-				style.padding = this.uTable.padding;
-				style.borderBottom = `solid 1px ${this.uTable.borderColor}`;
-				style.borderRight = `solid 1px ${this.uTable.borderColor}`;
-				style.color = this.uTable.color;
-				return style;
+				style.textAlign = this.parent.align;
+				style.fontSize = this.parent.fontSize + 'rpx';
+				style.padding = this.parent.padding;
+				style.borderBottom = `solid 1px ${this.parent.borderColor}`;
+				style.borderRight = `solid 1px ${this.parent.borderColor}`;
+				style.color = this.parent.color;
+				this.tdStyle = style;
 			}
-		},
+		}
 	};
 </script>
 
 <style lang="scss" scoped>
 	@import "../../libs/css/style.components.scss";
-	
+
 	.u-td {
-		display: flex;
+		@include vue-flex;
 		flex-direction: column;
 		flex: 1;
 		justify-content: center;
@@ -50,53 +61,6 @@
 		color: $u-content-color;
 		align-self: stretch;
 		box-sizing: border-box;
-	}
-
-	.u-col-1 {
-		flex: 0 0 calc(100%/12);
-	}
-
-	.u-col-2 {
-		flex: 0 0 calc(100%/12 * 2);
-	}
-
-	.u-col-3 {
-		flex: 0 0 calc(100%/12 * 3);
-	}
-
-	.u-col-4 {
-		flex: 0 0 calc(100%/12 * 4);
-	}
-
-	.u-col-5 {
-		flex: 0 0 calc(100%/12 * 5);
-	}
-
-	.u-col-6 {
-		flex: 0 0 calc(100%/12 * 6);
-	}
-
-	.u-col-7 {
-		flex: 0 0 calc(100%/12 * 7);
-	}
-
-	.u-col-8 {
-		flex: 0 0 calc(100%/12 * 8);
-	}
-
-	.u-col-9 {
-		flex: 0 0 calc(100%/12 * 9);
-	}
-
-	.u-col-10 {
-		flex: 0 0 calc(100%/12 * 10);
-	}
-
-	.u-col-11 {
-		flex: 0 0 calc(100%/12 * 11);
-	}
-
-	.u-col-12 {
-		flex: 0 0 calc(100%/12 * 12);
+		height: 100%;
 	}
 </style>

+ 20 - 11
node_modules/uview-ui/components/u-th/u-th.vue

@@ -21,17 +21,26 @@
 				default: ''
 			}
 		},
-		inject: ['uTable'],
-		computed: {
-			thStyle() {
+		data() {
+			return {
+				thStyle: {}
+			}
+		},
+		created() {
+			this.parent = false;
+		},
+		mounted() {
+			this.parent = this.$u.$parent.call(this, 'u-table');
+			if (this.parent) {
+				// 将父组件的相关参数,合并到本组件
 				let style = {};
 				if (this.width) style.flex = `0 0 ${this.width}`;
-				style.textAlign = this.uTable.align;
-				style.padding = this.uTable.padding;
-				style.borderBottom = `solid 1px ${this.uTable.borderColor}`;
-				style.borderRight = `solid 1px ${this.uTable.borderColor}`;
-				Object.assign(style, this.uTable.thStyle);
-				return style;
+				style.textAlign = this.parent.align;
+				style.padding = this.parent.padding;
+				style.borderBottom = `solid 1px ${this.parent.borderColor}`;
+				style.borderRight = `solid 1px ${this.parent.borderColor}`;
+				Object.assign(style, this.parent.style);
+				this.thStyle = style;
 			}
 		}
 	};
@@ -39,9 +48,9 @@
 
 <style lang="scss" scoped>
 	@import "../../libs/css/style.components.scss";
-	
+
 	.u-th {
-		display: flex;
+		@include vue-flex;
 		flex-direction: column;
 		flex: 1;
 		justify-content: center;

+ 2 - 2
node_modules/uview-ui/components/u-time-line-item/u-time-line-item.vue

@@ -54,7 +54,7 @@
 	@import "../../libs/css/style.components.scss";
 	
 	.u-time-axis-item {
-		display: flex;
+		@include vue-flex;
 		flex-direction: column;
 		width: 100%;
 		position: relative;
@@ -67,7 +67,7 @@
 		left: -40rpx;
 		transform-origin: 0;
 		transform: translateX(-50%);
-		display: flex;
+		@include vue-flex;
 		align-items: center;
 		justify-content: center;
 		z-index: 1;

+ 32 - 34
node_modules/uview-ui/components/u-toast/u-toast.vue

@@ -1,11 +1,11 @@
 <template>
-	<view class="u-toast" :class="[isShow ? 'u-show' : '', 'u-type-' + config.type, 'u-position-' + config.position]" :style="{
+	<view class="u-toast" :class="[isShow ? 'u-show' : '', 'u-type-' + tmpConfig.type, 'u-position-' + tmpConfig.position]" :style="{
 		zIndex: uZIndex
 	}">
 		<view class="u-icon-wrap">
-			<u-icon v-if="config.icon" class="u-icon" :name="iconName" :size="30" :color="config.type"></u-icon>
+			<u-icon v-if="tmpConfig.icon" class="u-icon" :name="iconName" :size="30" :color="tmpConfig.type"></u-icon>
 		</view>
-		<text class="u-text">{{config.title}}</text>
+		<text class="u-text">{{tmpConfig.title}}</text>
 	</view>
 </template>
 
@@ -42,14 +42,15 @@
 					position: 'center', // toast出现的位置
 					callback: null, // 执行完后的回调函数
 					back: false, // 结束toast是否自动返回上一页
-				}
+				},
+				tmpConfig: {}, // 将用户配置和内置配置合并后的临时配置变量
 			};
 		},
 		computed: {
 			iconName() {
 				// 只有不为none,并且type为error|warning|succes|info时候,才显示图标
-				if (['error', 'warning', 'success', 'info'].indexOf(this.config.type) >= 0 && this.config.icon) {
-					let icon = this.$u.type2icon(this.config.type);
+				if (['error', 'warning', 'success', 'info'].indexOf(this.tmpConfig.type) >= 0 && this.tmpConfig.icon) {
+					let icon = this.$u.type2icon(this.tmpConfig.type);
 					return icon;
 				}
 			},
@@ -61,7 +62,8 @@
 		methods: {
 			// 显示toast组件,由父组件通过this.$refs.xxx.show(options)形式调用
 			show(options) {
-				this.config = this.$u.deepMerge(this.config, options);
+				// 不降结果合并到this.config变量,避免多次条用u-toast,前后的配置造成混论
+				this.tmpConfig = this.$u.deepMerge(this.config, options);
 				if (this.timer) {
 					// 清除定时器
 					clearTimeout(this.timer);
@@ -74,9 +76,9 @@
 					clearTimeout(this.timer);
 					this.timer = null;
 					// 判断是否存在callback方法,如果存在就执行
-					typeof(this.config.callback) === 'function' && this.config.callback();
+					typeof(this.tmpConfig.callback) === 'function' && this.tmpConfig.callback();
 					this.timeEnd();
-				}, this.config.duration);
+				}, this.tmpConfig.duration);
 			},
 			// 隐藏toast组件,由父组件通过this.$refs.xxx.hide()形式调用
 			hide() {
@@ -90,35 +92,35 @@
 			// 倒计时结束之后,进行的一些操作
 			timeEnd() {
 				// 如果带有url值,根据isTab为true或者false进行跳转
-				if (this.config.url) {
+				if (this.tmpConfig.url) {
 					// 如果url没有"/"开头,添加上,因为uni的路由跳转需要"/"开头
-					if (this.config.url[0] != '/') this.config.url = '/' + this.config.url;
+					if (this.tmpConfig.url[0] != '/') this.tmpConfig.url = '/' + this.tmpConfig.url;
 					// 判断是否有传递显式的参数
-					if (Object.keys(this.config.params).length) {
+					if (Object.keys(this.tmpConfig.params).length) {
 						// 判断用户传递的url中,是否带有参数
 						// 使用正则匹配,主要依据是判断是否有"/","?","="等,如“/page/index/index?name=mary"
 						// 如果有params参数,转换后无需带上"?"
 						let query = '';
-						if (/.*\/.*\?.*=.*/.test(this.config.url)) {
+						if (/.*\/.*\?.*=.*/.test(this.tmpConfig.url)) {
 							// object对象转为get类型的参数
-							query = this.$u.queryParams(this.config.params, false);
-							this.config.url = this.config.url + "&" + query;
+							query = this.$u.queryParams(this.tmpConfig.params, false);
+							this.tmpConfig.url = this.tmpConfig.url + "&" + query;
 						} else {
-							query = this.$u.queryParams(this.config.params);
-							this.config.url += query;
+							query = this.$u.queryParams(this.tmpConfig.params);
+							this.tmpConfig.url += query;
 						}
 					}
 					// 如果是跳转tab页面,就使用uni.switchTab
-					if (this.config.isTab) {
+					if (this.tmpConfig.isTab) {
 						uni.switchTab({
-							url: this.config.url
+							url: this.tmpConfig.url
 						});
 					} else {
 						uni.navigateTo({
-							url: this.config.url
+							url: this.tmpConfig.url
 						});
 					}
-				} else if(this.config.back) {
+				} else if(this.tmpConfig.back) {
 					// 回退到上一页
 					this.$u.route({
 						type: 'back'
@@ -140,29 +142,22 @@
 		color: #fff;
 		border-radius: 8rpx;
 		background: #585858;
-		height: 80rpx;
-		display: flex;
+		@include vue-flex;
 		align-items: center;
 		justify-content: center;
 		font-size: 28rpx;
 		opacity: 0;
 		pointer-events: none;
-		padding:0 40rpx;
+		padding: 18rpx 40rpx;
 	}
 
 	.u-toast.u-show {
 		opacity: 1;
 	}
 
-	.u-text {
-		word-break: keep-all;
-		white-space: nowrap;
-		line-height: normal;
-	}
-
 	.u-icon {
 		margin-right: 10rpx;
-		display: flex;
+		@include vue-flex;
 		align-items: center;
 		line-height: normal;
 	}
@@ -170,19 +165,22 @@
 	.u-position-center {
 		left: 50%;
 		top: 50%;
-		transform: translateX(-50%) translateY(-50%);
+		transform: translate(-50%,-50%);
+		/* #ifndef APP-NVUE */
+		max-width: 70%;
+		/* #endif */
 	}
 
 	.u-position-top {
 		left: 50%;
 		top: 20%;
-		transform: translateX(-50%) translateY(-50%);
+		transform: translate(-50%,-50%);
 	}
 
 	.u-position-bottom {
 		left: 50%;
 		bottom: 20%;
-		transform: translateX(-50%) translateY(-50%);
+		transform: translate(-50%,-50%);
 	}
 
 	.u-type-primary {

+ 1 - 1
node_modules/uview-ui/components/u-top-tips/u-top-tips.vue

@@ -84,7 +84,7 @@
 		font-size: 28rpx;
 		left: 0;
 		right: 0;
-		display: flex;
+		@include vue-flex;
 		align-items: center;
 		justify-content: center;
 		opacity: 0;

+ 1 - 1
node_modules/uview-ui/components/u-tr/u-tr.vue

@@ -20,6 +20,6 @@
 	@import "../../libs/css/style.components.scss";
 	
 	.u-tr {
-		display: flex;
+		@include vue-flex;
 	}
 </style>

+ 51 - 13
node_modules/uview-ui/components/u-upload/u-upload.vue

@@ -237,6 +237,11 @@ export default {
 			type: Function,
 			default: null
 		},
+		// 移除文件前的钩子
+		beforeRemove: {
+			type: Function,
+			default: null
+		},
 		// 允许上传的图片后缀
 		limitType:{
 			type: Array,
@@ -336,7 +341,7 @@ export default {
 					if (this.autoUpload) this.uploadFile(listOldLength);
 				})
 				.catch(error => {
-					// this.$emit('on-error', error);
+					this.$emit('on-choose-fail', error);
 				});
 		},
 		// 提示用户消息
@@ -394,8 +399,10 @@ export default {
 						return this.uploadFile(index + 1);
 					})
 				} else if(beforeResponse === false) {
-					 // 如果返回false,继续下一张图片的上传
+					// 如果返回false,继续下一张图片的上传
 					return this.uploadFile(index + 1);
+				} else {
+					// 此处为返回"true"的情形,这里不写代码,就跳过此处,继续执行当前的上传逻辑
 				}
 			}
 			// 检查上传地址
@@ -455,19 +462,48 @@ export default {
 			uni.showModal({
 				title: '提示',
 				content: '您确定要删除此项吗?',
-				success: res => {
+				success: async (res) => {
 					if (res.confirm) {
-						if (this.lists[index].process < 100 && this.lists[index].process > 0) {
-							typeof this.lists[index].uploadTask != 'undefined' && this.lists[index].uploadTask.abort();
+						// 先检查是否有定义before-remove移除前钩子
+						// 执行before-remove钩子
+						if(this.beforeRemove && typeof(this.beforeRemove) === 'function') {
+							// 此处钩子执行 原理同before-remove参数,见上方注释
+							let beforeResponse = this.beforeRemove.bind(this.$u.$parent.call(this))(index, this.lists);
+							// 判断是否返回了promise
+							if (!!beforeResponse && typeof beforeResponse.then === 'function') {
+								await beforeResponse.then(res => {
+									// promise返回成功,不进行动作,继续上传
+									this.handlerDeleteItem(index);
+								}).catch(err => {
+									// 如果进入promise的reject,终止删除操作
+									this.showToast('已终止移除');
+								})
+							} else if(beforeResponse === false) {
+								// 返回false,终止删除
+								this.showToast('已终止移除');
+							} else {
+								// 如果返回true,执行删除操作
+								this.handlerDeleteItem(index);
+							}
+						} else {
+							// 如果不存在before-remove钩子,
+							this.handlerDeleteItem(index);
 						}
-						this.lists.splice(index, 1);
-						this.$forceUpdate();
-						this.$emit('on-remove', index, this.lists, this.index);
-						this.showToast('移除成功');
 					}
 				}
 			});
 		},
+		// 执行移除图片的动作,上方代码只是判断是否可以移除
+		handlerDeleteItem(index) {
+			// 如果文件正在上传中,终止上传任务,进度在0 < progress < 100则意味着正在上传
+			if (this.lists[index].process < 100 && this.lists[index].process > 0) {
+				typeof this.lists[index].uploadTask != 'undefined' && this.lists[index].uploadTask.abort();
+			}
+			this.lists.splice(index, 1);
+			this.$forceUpdate();
+			this.$emit('on-remove', index, this.lists, this.index);
+			this.showToast('移除成功');
+		},
 		// 用户通过ref手动的形式,移除一张图片
 		remove(index) {
 			// 判断索引的合法范围
@@ -525,7 +561,7 @@ export default {
 @import '../../libs/css/style.components.scss';
 
 .u-upload {
-	display: flex;
+	@include vue-flex;
 	flex-wrap: wrap;
 	align-items: center;
 }
@@ -538,7 +574,9 @@ export default {
 	background: rgb(244, 245, 246);
 	position: relative;
 	border-radius: 10rpx;
-	display: inline-flex;
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
 	align-items: center;
 	justify-content: center;
 }
@@ -578,13 +616,13 @@ export default {
 	border-radius: 100rpx;
 	width: 44rpx;
 	height: 44rpx;
-	display: flex;
+	@include vue-flex;
 	align-items: center;
 	justify-content: center;
 }
 
 .u-icon {
-	display: flex;
+	@include vue-flex;
 	align-items: center;
 	justify-content: center;
 }

+ 2 - 7
node_modules/uview-ui/components/u-waterfall/u-waterfall.vue

@@ -38,11 +38,6 @@ export default {
 			default: 'id'
 		}
 	},
-	provide() {
-		return {
-			uWaterfall: this
-		}
-	},
 	data() {
 		return {
 			leftList: [],
@@ -163,13 +158,13 @@ export default {
 @import "../../libs/css/style.components.scss";
 
 .u-waterfall {
-	display: flex;
+	@include vue-flex;
 	flex-direction: row;
 	align-items: flex-start;
 }
 
 .u-column {
-	display: flex;
+	@include vue-flex;
 	flex: 1;
 	flex-direction: column;
 	height: auto;

+ 1 - 1
node_modules/uview-ui/index.js

@@ -113,7 +113,7 @@ const $u = {
 }
 
 const install = Vue => {
-	Vue.mixin(mixin)
+	Vue.mixin(mixin) 
 	if (Vue.prototype.openShare) {
 		Vue.mixin(mpShare);
 	}

+ 2 - 2
node_modules/uview-ui/libs/config/config.js

@@ -1,5 +1,5 @@
-// 此版本发布于2020-08-25
-let version = '1.6.5';
+// 此版本发布于2020-09-17
+let version = '1.7.1';
 
 export default {
 	v: version,

+ 5 - 0
node_modules/uview-ui/libs/css/common.scss

@@ -169,3 +169,8 @@ text {
 	}
 }
 
+// 重置nvue的默认关于flex的样式
+.u-reset-nvue {
+	flex-direction: row;
+	align-items: center;
+}

+ 6 - 2
node_modules/uview-ui/libs/css/style.components.scss

@@ -1,3 +1,7 @@
-.demo {
-	
+// 定义混入指令,用于在非nvue环境下的flex定义,因为nvue没有display属性,会报错
+@mixin vue-flex($direction: row) {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	flex-direction: $direction;
+	/* #endif */
 }

+ 27 - 2
node_modules/uview-ui/libs/css/style.mp.scss

@@ -37,11 +37,36 @@ u-dropdown {
 /* end-微信小程序编译后页面有组件名的元素,特别处理--end */
 
 
-/* #ifdef MP-QQ */
-/* 需要做这一切额外的兼容,都是因为TX的无能 */
+/* #ifdef MP-QQ || MP-TOUTIAO */
+// 需要做这一切额外的兼容,都是因为TX的无能
 u-icon {
 	line-height: 0;
 }
 /* #endif */
 
+/* start--头条小程序编译后页面有组件名的元素,特别处理--start */
+// 由于头条小程序不支持直接组件名形式写样式,目前只能在写组件的时候给组件加上对应的类名
+/* #ifdef MP-TOUTIAO */
+.u-td, .u-th, .u-tr {
+	flex: 1;
+	align-self: stretch;
+}
+
+.u-row, .u-col {
+	flex: 1;
+	align-self: stretch;
+}
+
+// 避免小程序线条组件因为父组件display: flex;而失效
+.u-line {
+	flex: 1;
+}
+
+.u-dropdown {
+	flex: 1;
+}
+/* #endif */
+/* end-头条小程序编译后页面有组件名的元素,特别处理--end */
+
+
 

+ 2 - 1
node_modules/uview-ui/libs/css/style.vue.scss

@@ -171,4 +171,5 @@ uni-toast .uni-toast {
 .u-reset-button::after {
    border: none;
 }
-/* end--去除button的所有默认样式--end */
+/* end--去除button的所有默认样式--end */
+

+ 15 - 1
node_modules/uview-ui/libs/mixin/mixin.js

@@ -24,7 +24,21 @@ module.exports = {
 					})
 					.exec()
 			})
-		}
+		},
+		getParentData(parentName = '') {
+			// 避免在created中去定义parent变量
+			if(!this.parent) this.parent = false;
+			// 这里的本质原理是,通过获取父组件实例(也即u-radio-group的this)
+			// 将父组件this中对应的参数,赋值给本组件(u-radio的this)的parentData对象中对应的属性
+			// 之所以需要这么做,是因为所有端中,头条小程序不支持通过this.parent.xxx去监听父组件参数的变化
+			this.parent = this.$u.$parent.call(this, parentName);
+			if(this.parent) {
+				// 历遍parentData中的属性,将parent中的同名属性赋值给parentData
+				Object.keys(this.parentData).map(key => {
+					this.parentData[key] = this.parent[key];
+				});
+			}
+		},
 	},
 	onReachBottom() {
 		uni.$emit('uOnReachBottom')

+ 11 - 11
node_modules/uview-ui/package.json

@@ -1,27 +1,27 @@
 {
-  "_from": "uview-ui",
-  "_id": "uview-ui@1.6.5",
+  "_from": "uview-ui@1.7.1",
+  "_id": "uview-ui@1.7.1",
   "_inBundle": false,
-  "_integrity": "sha512-bvesRrQiu99vMG5l6YHfBC5PnrK3S1efw5nYUu9oZpagUtjN2YIVzQUPSzCAduoGIVuqzQ8LrM9CMdWgNXv/RQ==",
+  "_integrity": "sha512-e2s7F7omTHxzdrE8kPtiaEof5LC4ADeY4m6i6ROqLoA0VCEqC2Y4SNGXZKW3y9D04z2EKX239w1l3H1jtdLTow==",
   "_location": "/uview-ui",
   "_phantomChildren": {},
   "_requested": {
-    "type": "tag",
+    "type": "version",
     "registry": true,
-    "raw": "uview-ui",
+    "raw": "uview-ui@1.7.1",
     "name": "uview-ui",
     "escapedName": "uview-ui",
-    "rawSpec": "",
+    "rawSpec": "1.7.1",
     "saveSpec": null,
-    "fetchSpec": "latest"
+    "fetchSpec": "1.7.1"
   },
   "_requiredBy": [
     "#USER",
     "/"
   ],
-  "_resolved": "https://registry.npmjs.org/uview-ui/-/uview-ui-1.6.5.tgz",
-  "_shasum": "6677c3462f57b67012d51c611fd18cbab81a7797",
-  "_spec": "uview-ui",
+  "_resolved": "https://registry.npmjs.org/uview-ui/-/uview-ui-1.7.1.tgz",
+  "_shasum": "e800b7384d7ea7b79aa9434326497e0098798d55",
+  "_spec": "uview-ui@1.7.1",
   "_where": "D:\\workSpace\\storeCheck-app",
   "author": {
     "name": "uView"
@@ -63,5 +63,5 @@
   "scripts": {
     "test": "echo \"Error: no test specified\" && exit 1"
   },
-  "version": "1.6.5"
+  "version": "1.7.1"
 }

+ 6 - 6
package-lock.json

@@ -146,9 +146,9 @@
       "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
     },
     "moment": {
-      "version": "2.27.0",
-      "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz",
-      "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ=="
+      "version": "2.28.0",
+      "resolved": "https://registry.npmjs.org/moment/-/moment-2.28.0.tgz",
+      "integrity": "sha512-Z5KOjYmnHyd/ukynmFd/WwyXHd7L4J9vTI/nn5Ap9AVUgaAE15VvQ9MOGmJJygEUklupqIrFnor/tjTwRU+tQw=="
     },
     "p-limit": {
       "version": "2.3.0",
@@ -229,9 +229,9 @@
       }
     },
     "uview-ui": {
-      "version": "1.6.5",
-      "resolved": "https://registry.npmjs.org/uview-ui/-/uview-ui-1.6.5.tgz",
-      "integrity": "sha512-bvesRrQiu99vMG5l6YHfBC5PnrK3S1efw5nYUu9oZpagUtjN2YIVzQUPSzCAduoGIVuqzQ8LrM9CMdWgNXv/RQ=="
+      "version": "1.7.1",
+      "resolved": "https://registry.npmjs.org/uview-ui/-/uview-ui-1.7.1.tgz",
+      "integrity": "sha512-e2s7F7omTHxzdrE8kPtiaEof5LC4ADeY4m6i6ROqLoA0VCEqC2Y4SNGXZKW3y9D04z2EKX239w1l3H1jtdLTow=="
     },
     "which-module": {
       "version": "2.0.0",

+ 2 - 2
package.json

@@ -16,8 +16,8 @@
   "dependencies": {
     "async-validator": "^3.3.0",
     "lodash": "^4.17.19",
-    "moment": "^2.27.0",
+    "moment": "^2.28.0",
     "qrcode": "^1.4.4",
-    "uview-ui": "^1.6.5"
+    "uview-ui": "^1.7.1"
   }
 }

+ 3 - 1
pages/shopTour/shopTour.vue

@@ -69,6 +69,7 @@
 			},
 			//指标评论,图片更新保存
 			saveZbPlImgs(data){
+				console.log(data,'saveZbPlImgs')
 				taskCommentsSave(data).then(res=>{
 					if(res.status == 200){
 						this.wv.evalJS("vm.saveZbPlImgsSuccess()") 
@@ -81,9 +82,10 @@
 			},
 			// 保存指标结果
 			saveZbResult(data){
+				console.log(data,'saveZbResult')
 				taskTargetSave(data).then(res=>{
 					if(res.status == 200){
-						this.wv.evalJS("vm.saveZbResultSuccess("+data.id+",'"+data.result+"')") 
+						this.wv.evalJS("vm.saveZbResultSuccess('"+JSON.stringify(data)+"')") 
 					}
 					uni.showToast({
 						icon:'none',

Файловите разлики са ограничени, защото са твърде много
+ 75 - 49
unpackage/dist/dev/app-plus/app-service.js


Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
unpackage/dist/dev/app-plus/app-view.js


+ 9 - 8
unpackage/dist/dev/app-plus/hybrid/html/video.html

@@ -124,15 +124,15 @@
               <div><!-- 分值:{{zb.getScore}} <a-icon @click="openEditFs" type="edit" style="font-size: 20px;margin-left: 10px;"/> --></div>
               <div>
 				  <!-- 不适用 -->
-                <a-icon @click="selZbResult(0,zb)" type="minus-circle" :class="zb.result=='bsy'?'choose-bsy':''"/>
+                <a-icon @click="selZbResult(0,zb)" type="minus-circle" :class="zb.result=='NOT_WORK'?'choose-bsy':''"/>
               </div>
 			  <div>
 				  <!-- 不合格 -->
-				  <a-icon @click="selZbResult(1,zb)" type="close-circle" :class="zb.result=='bhg'?'choose-bhg':''"/>
+				  <a-icon @click="selZbResult(1,zb)" type="close-circle" :class="zb.result=='NOT_PASS'?'choose-bhg':''"/>
 			  </div>
 			  <div>
 				  <!-- 合格 -->
-				  <a-icon @click="selZbResult(2,zb)" type="check-circle" :class="zb.result=='hg'?'choose-hg':''"/>
+				  <a-icon @click="selZbResult(2,zb)" type="check-circle" :class="zb.result=='PASS'?'choose-hg':''"/>
 			  </div>
             </div>
           </div>
@@ -451,15 +451,16 @@
 		  // 评分,0 不适用,1 不合格,2 合格
 		  selZbResult(type,zb){
 			  let {id,taskItemId,taskId} = zb
-			  this.sendMsg('selZbResult',JSON.stringify({result:type,id:id,taskItemId:taskItemId,taskId:taskId}))
+			  let result = ['NOT_WORK','NOT_PASS','PASS']
+			  this.sendMsg('selZbResult',JSON.stringify({result:result[type],id:id,taskItemId:taskItemId,taskId:taskId}))
 		  },
 		  // 保存指标结果成功
-		  saveZbResultSuccess(id,result){
-			  console.log(result)
-			  let ret = ['bsy','bhg','hg']
+		  saveZbResultSuccess(data){
+			  let {id,result} = JSON.parse(data)
+			  console.log(id,result)
 			  let zb = this.zbItem.find(item=> item.id == id)
 			  if(zb){
-				  zb.result = ret[result]
+				  zb.result = result
 				  // 更新考评项已完成指标数
 				  this.updateKpFinish()
 			  }

Някои файлове не бяха показани, защото твърде много файлове са промени