From f09d9ec905b6247b36a394158662fe90d02197a5 Mon Sep 17 00:00:00 2001
From: xuxueyang <xuxy@fengyuntec.com>
Date: 星期一, 15 七月 2024 14:59:36 +0800
Subject: [PATCH] fix bug

---
 uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue |  677 +++++++++++++++++++++++++++++---------------------------
 1 files changed, 353 insertions(+), 324 deletions(-)

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

--
Gitblit v1.9.3