|
@@ -1,24 +1,27 @@
|
|
|
<template>
|
|
<template>
|
|
|
- <view>
|
|
|
|
|
|
|
+ <view-block class="nut-picker">
|
|
|
<nut-popup
|
|
<nut-popup
|
|
|
position="bottom"
|
|
position="bottom"
|
|
|
:style="{ height: height + 56 + 'px' }"
|
|
:style="{ height: height + 56 + 'px' }"
|
|
|
v-model:show="show"
|
|
v-model:show="show"
|
|
|
@close="close"
|
|
@close="close"
|
|
|
>
|
|
>
|
|
|
- <view class="nut-picker__bar">
|
|
|
|
|
- <view class="nut-picker__left" @click="close()"> 取消</view>
|
|
|
|
|
- <view> {{ title }}</view>
|
|
|
|
|
- <view @click="confirm()"> 确定</view>
|
|
|
|
|
- </view>
|
|
|
|
|
|
|
+ <view-block class="nut-picker__bar">
|
|
|
|
|
+ <view-block class="nut-picker__left" @click="close()"> 取消</view-block>
|
|
|
|
|
+ <view-block> {{ title }}</view-block>
|
|
|
|
|
+ <view-block @click="confirm()"> 确定</view-block>
|
|
|
|
|
+ </view-block>
|
|
|
|
|
|
|
|
- <view class="nut-picker__column">
|
|
|
|
|
- <view
|
|
|
|
|
|
|
+ <view-block class="nut-picker__column">
|
|
|
|
|
+ <view-block
|
|
|
class="nut-picker__mask"
|
|
class="nut-picker__mask"
|
|
|
:style="{ backgroundSize: `100% ${top}px` }"
|
|
:style="{ backgroundSize: `100% ${top}px` }"
|
|
|
- ></view>
|
|
|
|
|
- <view class="nut-picker__hairline" :style="{ top: ` ${top}px` }"></view>
|
|
|
|
|
- <view
|
|
|
|
|
|
|
+ ></view-block>
|
|
|
|
|
+ <view-block
|
|
|
|
|
+ class="nut-picker__hairline"
|
|
|
|
|
+ :style="{ top: ` ${top}px` }"
|
|
|
|
|
+ ></view-block>
|
|
|
|
|
+ <view-block
|
|
|
class="nut-picker__columnitem"
|
|
class="nut-picker__columnitem"
|
|
|
v-for="(item, columnIndex) in columnList"
|
|
v-for="(item, columnIndex) in columnList"
|
|
|
:key="columnIndex"
|
|
:key="columnIndex"
|
|
@@ -36,10 +39,10 @@
|
|
|
}
|
|
}
|
|
|
"
|
|
"
|
|
|
></nut-picker-column>
|
|
></nut-picker-column>
|
|
|
- </view>
|
|
|
|
|
- </view>
|
|
|
|
|
|
|
+ </view-block>
|
|
|
|
|
+ </view-block>
|
|
|
</nut-popup>
|
|
</nut-popup>
|
|
|
- </view>
|
|
|
|
|
|
|
+ </view-block>
|
|
|
</template>
|
|
</template>
|
|
|
<script lang="ts">
|
|
<script lang="ts">
|
|
|
import { reactive, ref, watch, computed, toRaw } from 'vue';
|
|
import { reactive, ref, watch, computed, toRaw } from 'vue';
|
|
@@ -62,12 +65,13 @@ export default create({
|
|
|
},
|
|
},
|
|
|
...commonProps
|
|
...commonProps
|
|
|
},
|
|
},
|
|
|
- emits: ['close', 'confirm', 'update:isVisible'],
|
|
|
|
|
|
|
+ components: { column },
|
|
|
|
|
+ emits: ['close', 'change', 'confirm', 'update:isVisible'],
|
|
|
|
|
|
|
|
setup(props, { emit }) {
|
|
setup(props, { emit }) {
|
|
|
const show = ref(false);
|
|
const show = ref(false);
|
|
|
const defaultIndex = ref(props.defaultIndex);
|
|
const defaultIndex = ref(props.defaultIndex);
|
|
|
- const listData: any = reactive(props.listData);
|
|
|
|
|
|
|
+ const formattedColumns: any = ref(props.listData);
|
|
|
//临时变量,当点击确定时候赋值
|
|
//临时变量,当点击确定时候赋值
|
|
|
let _defaultIndex = props.defaultIndex;
|
|
let _defaultIndex = props.defaultIndex;
|
|
|
const childrenKey = 'children';
|
|
const childrenKey = 'children';
|
|
@@ -81,6 +85,13 @@ export default create({
|
|
|
}
|
|
}
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
|
|
+ watch(
|
|
|
|
|
+ () => props.listData,
|
|
|
|
|
+ val => {
|
|
|
|
|
+ formattedColumns.value = val;
|
|
|
|
|
+ }
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
const addDefaultIndexList = listData => {
|
|
const addDefaultIndexList = listData => {
|
|
|
defaultIndexList = [];
|
|
defaultIndexList = [];
|
|
|
listData.forEach(res => {
|
|
listData.forEach(res => {
|
|
@@ -88,7 +99,7 @@ export default create({
|
|
|
});
|
|
});
|
|
|
};
|
|
};
|
|
|
const dataType = computed(() => {
|
|
const dataType = computed(() => {
|
|
|
- const firstColumn = listData[0] || {};
|
|
|
|
|
|
|
+ const firstColumn = formattedColumns.value[0] || {};
|
|
|
|
|
|
|
|
if (typeof firstColumn === 'object') {
|
|
if (typeof firstColumn === 'object') {
|
|
|
if (firstColumn?.[childrenKey]) {
|
|
if (firstColumn?.[childrenKey]) {
|
|
@@ -118,13 +129,15 @@ export default create({
|
|
|
|
|
|
|
|
const columnList = computed(() => {
|
|
const columnList = computed(() => {
|
|
|
if (dataType.value === 'text') {
|
|
if (dataType.value === 'text') {
|
|
|
- return [{ values: listData, defaultIndex: defaultIndex.value }];
|
|
|
|
|
|
|
+ return [
|
|
|
|
|
+ { values: formattedColumns.value, defaultIndex: defaultIndex.value }
|
|
|
|
|
+ ];
|
|
|
} else if (dataType.value === 'multipleColumns') {
|
|
} else if (dataType.value === 'multipleColumns') {
|
|
|
- return listData;
|
|
|
|
|
|
|
+ return formattedColumns.value;
|
|
|
} else if (dataType.value === 'cascade') {
|
|
} else if (dataType.value === 'cascade') {
|
|
|
- return formatCascade(listData, defaultIndex.value);
|
|
|
|
|
|
|
+ return formatCascade(formattedColumns.value, defaultIndex.value);
|
|
|
}
|
|
}
|
|
|
- return listData;
|
|
|
|
|
|
|
+ return formattedColumns.value;
|
|
|
});
|
|
});
|
|
|
const getCascadeData = (listData, defaultIndex) => {
|
|
const getCascadeData = (listData, defaultIndex) => {
|
|
|
let arr = listData;
|
|
let arr = listData;
|
|
@@ -152,7 +165,7 @@ export default create({
|
|
|
},
|
|
},
|
|
|
changeHandler: (columnIndex, dataIndex) => {
|
|
changeHandler: (columnIndex, dataIndex) => {
|
|
|
if (dataType.value === 'cascade') {
|
|
if (dataType.value === 'cascade') {
|
|
|
- let cursor: any = listData;
|
|
|
|
|
|
|
+ let cursor: any = toRaw(formattedColumns.value);
|
|
|
//最外层使用props.defaultIndex作为初始index
|
|
//最外层使用props.defaultIndex作为初始index
|
|
|
if (columnIndex === 0) {
|
|
if (columnIndex === 0) {
|
|
|
defaultIndex.value = dataIndex;
|
|
defaultIndex.value = dataIndex;
|
|
@@ -172,22 +185,32 @@ export default create({
|
|
|
_defaultIndex = dataIndex;
|
|
_defaultIndex = dataIndex;
|
|
|
} else if (dataType.value === 'multipleColumns') {
|
|
} else if (dataType.value === 'multipleColumns') {
|
|
|
defaultIndexList[columnIndex] = dataIndex;
|
|
defaultIndexList[columnIndex] = dataIndex;
|
|
|
|
|
+ const val = defaultIndexList.map(
|
|
|
|
|
+ (res, i) => toRaw(formattedColumns.value)[i].values[res]
|
|
|
|
|
+ );
|
|
|
|
|
+ console.log('val', defaultIndexList);
|
|
|
|
|
+ emit('change', val);
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
|
|
+
|
|
|
confirm: () => {
|
|
confirm: () => {
|
|
|
if (dataType.value === 'text') {
|
|
if (dataType.value === 'text') {
|
|
|
defaultIndex.value = _defaultIndex;
|
|
defaultIndex.value = _defaultIndex;
|
|
|
- emit('confirm', listData[_defaultIndex]);
|
|
|
|
|
|
|
+ emit('confirm', formattedColumns.value[_defaultIndex]);
|
|
|
} else if (dataType.value === 'multipleColumns') {
|
|
} else if (dataType.value === 'multipleColumns') {
|
|
|
for (let i = 0; i < defaultIndexList.length; i++) {
|
|
for (let i = 0; i < defaultIndexList.length; i++) {
|
|
|
- listData[i].defaultIndex = defaultIndexList[i];
|
|
|
|
|
|
|
+ formattedColumns.value[i].defaultIndex = defaultIndexList[i];
|
|
|
}
|
|
}
|
|
|
- const checkedArr = toRaw(listData).map(
|
|
|
|
|
|
|
+ const checkedArr = toRaw(formattedColumns.value).map(
|
|
|
(res: any) => res.values[res.defaultIndex]
|
|
(res: any) => res.values[res.defaultIndex]
|
|
|
);
|
|
);
|
|
|
|
|
+ console.log(formattedColumns.value);
|
|
|
emit('confirm', checkedArr);
|
|
emit('confirm', checkedArr);
|
|
|
} else if (dataType.value === 'cascade') {
|
|
} else if (dataType.value === 'cascade') {
|
|
|
- emit('confirm', getCascadeData(toRaw(listData), defaultIndex.value));
|
|
|
|
|
|
|
+ emit(
|
|
|
|
|
+ 'confirm',
|
|
|
|
|
+ getCascadeData(toRaw(formattedColumns.value), defaultIndex.value)
|
|
|
|
|
+ );
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
emit('update:isVisible', false);
|
|
emit('update:isVisible', false);
|