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