fix: 🐛 修复Picker选择器多列选择模式绑定值为空数组时将列第一项作为显示值的问题

This commit is contained in:
xuqingkai 2024-05-16 10:37:25 +08:00
parent 103298e4c1
commit c3b96ce912
3 changed files with 29 additions and 36 deletions

View File

@ -1,6 +1,6 @@
<frame/>
# Picker 选择器视图
# Picker 选择器
Picker 组件为 popup 和 pickerView 的组合。

View File

@ -98,7 +98,7 @@ const columns2 = ref(['选项1', '选项2', '选项3', '选项4', '选项5', '
const columns3 = ref(['选项1', '选项2', '选项3', '选项4', '选项5', '选项6', '选项7'])
const value3 = ref('选项4')
const value4 = ref(['中南大学', '软件工程'])
const value4 = ref([])
const columns4 = ref([
['中山大学', '中南大学', '华南理工大学'],
['计算机科学与技术', '软件工程', '通信工程', '法学', '经济学']

View File

@ -89,7 +89,7 @@ export default {
import { getCurrentInstance, onBeforeMount, ref, watch, computed, onMounted, nextTick } from 'vue'
import { deepClone, defaultDisplayFormat, getType, isArray, isDef, isFunction } from '../common/util'
import { useCell } from '../composables/useCell'
import { type ColumnItem, formatArray } from '../wd-picker-view/types'
import { type ColumnItem, formatArray, type PickerViewInstance } from '../wd-picker-view/types'
import { FORM_KEY, type FormItemRule } from '../wd-form/types'
import { useParent } from '../composables/useParent'
import { useTranslate } from '../composables/useTranslate'
@ -99,7 +99,7 @@ const { translate } = useTranslate('picker')
const props = defineProps(pickerProps)
const emit = defineEmits(['confirm', 'open', 'cancel', 'update:modelValue'])
const pickerViewWd = ref<any>(null)
const pickerViewWd = ref<PickerViewInstance | null>(null)
const cell = useCell()
const innerLoading = ref<boolean>(false) // loading
@ -124,12 +124,8 @@ watch(
if (fn && !isFunction(fn)) {
console.error('The type of displayFormat must be Function')
}
if (pickerViewWd.value && pickerViewWd.value.selectedIndex && pickerViewWd.value.selectedIndex.length !== 0) {
if (isDef(props.modelValue) && props.modelValue !== '') {
setShowValue(pickerViewWd.value.getSelects())
} else {
showValue.value = ''
}
if (pickerViewWd.value && pickerViewWd.value.getSelectedIndex().length !== 0) {
handleShowValueUpdate(props.modelValue)
}
},
{
@ -143,17 +139,7 @@ watch(
(newValue) => {
pickerValue.value = newValue
// ,
if (isDef(newValue) && newValue !== '') {
if (pickerViewWd.value && pickerViewWd.value.getSelects) {
nextTick(() => {
setShowValue(pickerViewWd.value!.getSelects())
})
} else {
setShowValue(getSelects(newValue)!)
}
} else {
showValue.value = ''
}
handleShowValueUpdate(newValue)
},
{
deep: true,
@ -167,17 +153,7 @@ watch(
displayColumns.value = newValue
resetColumns.value = newValue
// ,
if (isDef(props.modelValue) && props.modelValue !== '') {
if (pickerViewWd.value && pickerViewWd.value.getSelects) {
nextTick(() => {
setShowValue(pickerViewWd.value!.getSelects())
})
} else {
setShowValue(getSelects(props.modelValue)!)
}
} else {
showValue.value = ''
}
handleShowValueUpdate(props.modelValue)
},
{
deep: true,
@ -226,10 +202,7 @@ const isRequired = computed(() => {
const { proxy } = getCurrentInstance() as any
onMounted(() => {
isDef(props.modelValue) && props.modelValue !== '' && setShowValue(getSelects(props.modelValue)!)
if (isDef(props.modelValue) && props.modelValue !== '' && pickerViewWd.value && pickerViewWd.value.getSelects) {
setShowValue(pickerViewWd.value!.getSelects())
}
handleShowValueUpdate(props.modelValue)
})
onBeforeMount(() => {
@ -237,6 +210,25 @@ onBeforeMount(() => {
resetColumns.value = deepClone(props.columns)
})
/**
* 值变更时更新显示内容
* @param value
*/
function handleShowValueUpdate(value: string | number | Array<string | number>) {
// ,
if ((isArray(value) && value.length > 0) || (isDef(value) && !isArray(value) && value !== '')) {
if (pickerViewWd.value) {
nextTick(() => {
setShowValue(pickerViewWd.value!.getSelects())
})
} else {
setShowValue(getSelects(value)!)
}
} else {
showValue.value = ''
}
}
/**
* @description 根据传入的valuepicker组件获取当前cell展示值
* @param {String|Number|Array<String|Number|Array<any>>}value
@ -344,6 +336,7 @@ function handleConfirm() {
popupShow.value = false
resetColumns.value = deepClone(columns)
emit('update:modelValue', values)
setShowValue(selects)
emit('confirm', {
value: values,