ソースを参照

fix: 修改 Picker 组件在 Taro 中v-model 失效问题 (#1801)

* fix: 修复 ImagePreview 在Taro编译成H5后报错的问题

* fix: 地址关闭时, Close 事件触发两次问题解决

* feat: 组件DatePicker 添加双向绑定

* docs: 组件Picker文档修改

* feat: 组件Picker与DatePicker新增属性safe-area-inset-bottom

* feat: imagepreview

* fix: 组件imagepreview点击视频遮罩关闭(#1729)

* fix: 解决 Picker 在微信小程序中无法使用问题 (#1774)

* fix: 修改 Picker 组件 v-model 失效问题
yangxiaolu1993 3 年 前
コミット
4aee9efb44
2 ファイル変更31 行追加21 行削除
  1. 16 16
      src/packages/__VUE/picker/index.taro.vue
  2. 15 5
      src/packages/__VUE/picker/index.vue

+ 16 - 16
src/packages/__VUE/picker/index.taro.vue

@@ -85,7 +85,7 @@ export default create({
     ...popupProps,
     ...popupProps,
     modelValue: {
     modelValue: {
       type: Array as PropType<(string | number)[]>,
       type: Array as PropType<(string | number)[]>,
-      default: () => []
+      default: []
     },
     },
     title: {
     title: {
       type: String,
       type: String,
@@ -133,7 +133,9 @@ export default create({
 
 
     const pickerline = ref(null);
     const pickerline = ref(null);
     // 选中项
     // 选中项
-    let defaultValues = ref<(number | string)[]>(props.modelValue);
+    let defaultValues = ref<(number | string)[]>(
+      Array.isArray(props.modelValue) && props.modelValue.length > 0 ? props.modelValue : []
+    );
     // 选中项的位置
     // 选中项的位置
     let defaultIndexes = ref<number[]>([]);
     let defaultIndexes = ref<number[]>([]);
 
 
@@ -244,7 +246,6 @@ export default create({
         } else {
         } else {
           defaultValues.value[columnIndex] = option.hasOwnProperty('value') ? option.value : '';
           defaultValues.value[columnIndex] = option.hasOwnProperty('value') ? option.value : '';
         }
         }
-
         emit('change', {
         emit('change', {
           columnIndex: columnIndex,
           columnIndex: columnIndex,
           selectedValue: defaultValues.value,
           selectedValue: defaultValues.value,
@@ -253,7 +254,7 @@ export default create({
       }
       }
     };
     };
 
 
-    const defaultValuesConvert = computed(() => {
+    const defaultValuesConvert = () => {
       let defaultIndexs = [];
       let defaultIndexs = [];
       if (defaultValues.value.length > 0) {
       if (defaultValues.value.length > 0) {
         defaultValues.value.forEach((value, index) => {
         defaultValues.value.forEach((value, index) => {
@@ -264,14 +265,18 @@ export default create({
             }
             }
           }
           }
         });
         });
+      } else {
+        columnsList.value.forEach((item) => {
+          defaultIndexs.push(0);
+          defaultValues.value.push(item[0].value);
+        });
       }
       }
 
 
       return defaultIndexs;
       return defaultIndexs;
-    });
+    };
 
 
     // 平铺展示时,滚动选择
     // 平铺展示时,滚动选择
     const tileChange = ({ detail }) => {
     const tileChange = ({ detail }) => {
-      console.log('选择');
       const prevDefaultValue = defaultIndexes.value;
       const prevDefaultValue = defaultIndexes.value;
       let changeIndex = 0;
       let changeIndex = 0;
       // 判断变化的是第几个
       // 判断变化的是第几个
@@ -289,7 +294,6 @@ export default create({
     // 确定
     // 确定
     const confirmHandler = () => {
     const confirmHandler = () => {
       if (state.picking) {
       if (state.picking) {
-        console.log('滚动中');
         setTimeout(() => {
         setTimeout(() => {
           confirmHandlerAwit();
           confirmHandlerAwit();
         }, 0);
         }, 0);
@@ -305,7 +309,7 @@ export default create({
           selectedOptions.value.push(columns[0]);
           selectedOptions.value.push(columns[0]);
         });
         });
       }
       }
-      console.log('确定', defaultValues.value);
+
       emit('confirm', {
       emit('confirm', {
         selectedValue: defaultValues.value,
         selectedValue: defaultValues.value,
         selectedOptions: selectedOptions.value
         selectedOptions: selectedOptions.value
@@ -317,12 +321,10 @@ export default create({
 
 
     // 开始滚动
     // 开始滚动
     const handlePickstart = () => {
     const handlePickstart = () => {
-      console.log('开始滚动');
       state.picking = true;
       state.picking = true;
     };
     };
     // 开始滚动
     // 开始滚动
     const handlePickend = () => {
     const handlePickend = () => {
-      console.log('滚动结束');
       state.picking = false;
       state.picking = false;
     };
     };
 
 
@@ -330,7 +332,6 @@ export default create({
 
 
     const getReference = async () => {
     const getReference = async () => {
       const refe = await useTaroRect(pickerline, Taro);
       const refe = await useTaroRect(pickerline, Taro);
-      console.log(refe.height);
       state.lineSpacing = refe.height ? refe.height : 36;
       state.lineSpacing = refe.height ? refe.height : 36;
     };
     };
 
 
@@ -341,7 +342,7 @@ export default create({
             getReference();
             getReference();
           }, 200);
           }, 200);
         } else {
         } else {
-          defaultIndexes.value = defaultValuesConvert.value;
+          defaultIndexes.value = defaultValuesConvert();
         }
         }
         state.show = props.visible;
         state.show = props.visible;
       }
       }
@@ -357,7 +358,7 @@ export default create({
         const isSameValue = JSON.stringify(newValues) === JSON.stringify(defaultValues.value);
         const isSameValue = JSON.stringify(newValues) === JSON.stringify(defaultValues.value);
         if (!isSameValue) {
         if (!isSameValue) {
           defaultValues.value = newValues;
           defaultValues.value = newValues;
-          defaultIndexes.value = defaultValuesConvert.value;
+          defaultIndexes.value = defaultValuesConvert();
         }
         }
       },
       },
       { deep: true }
       { deep: true }
@@ -371,7 +372,7 @@ export default create({
           emit('update:modelValue', newValues);
           emit('update:modelValue', newValues);
         }
         }
       },
       },
-      { immediate: true }
+      { deep: true }
     );
     );
 
 
     watch(
     watch(
@@ -387,7 +388,7 @@ export default create({
 
 
             pickerColumn.value = [];
             pickerColumn.value = [];
           } else {
           } else {
-            defaultIndexes.value = defaultValuesConvert.value;
+            defaultIndexes.value = defaultValuesConvert();
           }
           }
         }
         }
       }
       }
@@ -417,7 +418,6 @@ export default create({
       refRandomId,
       refRandomId,
       pickerline,
       pickerline,
       tileChange,
       tileChange,
-      defaultValuesConvert,
       handlePickstart,
       handlePickstart,
       handlePickend
       handlePickend
     };
     };

+ 15 - 5
src/packages/__VUE/picker/index.vue

@@ -33,7 +33,7 @@
             :column="column"
             :column="column"
             :readonly="readonly"
             :readonly="readonly"
             :columnsType="columnsType"
             :columnsType="columnsType"
-            :value="defaultValues[columnIndex]"
+            :value="defaultValues && defaultValues[columnIndex]"
             :threeDimensional="threeDimensional"
             :threeDimensional="threeDimensional"
             :swipeDuration="swipeDuration"
             :swipeDuration="swipeDuration"
             @change="
             @change="
@@ -116,7 +116,9 @@ export default create({
     });
     });
 
 
     // 选中项
     // 选中项
-    let defaultValues = ref<(number | string)[]>(props.modelValue);
+    let defaultValues = ref<(number | string)[]>(
+      Array.isArray(props.modelValue) && props.modelValue.length > 0 ? props.modelValue : []
+    );
 
 
     const pickerColumn = ref<any[]>([]);
     const pickerColumn = ref<any[]>([]);
 
 
@@ -163,7 +165,11 @@ export default create({
           return state.formattedColumns as PickerOption[][];
           return state.formattedColumns as PickerOption[][];
         case 'cascade':
         case 'cascade':
           // 级联数据处理
           // 级联数据处理
-          return formatCascade(state.formattedColumns as PickerOption[], defaultValues.value);
+
+          return formatCascade(
+            state.formattedColumns as PickerOption[],
+            defaultValues.value ? defaultValues.value : []
+          );
         default:
         default:
           return [state.formattedColumns] as PickerOption[][];
           return [state.formattedColumns] as PickerOption[][];
       }
       }
@@ -204,6 +210,8 @@ export default create({
 
 
     const changeHandler = (columnIndex: number, option: PickerOption) => {
     const changeHandler = (columnIndex: number, option: PickerOption) => {
       if (option && Object.keys(option).length) {
       if (option && Object.keys(option).length) {
+        defaultValues.value = defaultValues.value ? defaultValues.value : [];
+
         if (columnsType.value === 'cascade') {
         if (columnsType.value === 'cascade') {
           defaultValues.value[columnIndex] = option.value ? option.value : '';
           defaultValues.value[columnIndex] = option.value ? option.value : '';
           let index = columnIndex;
           let index = columnIndex;
@@ -277,14 +285,16 @@ export default create({
           emit('update:modelValue', newValues);
           emit('update:modelValue', newValues);
         }
         }
       },
       },
-      { immediate: true }
+      { deep: true }
     );
     );
 
 
     watch(
     watch(
       () => props.visible,
       () => props.visible,
       (val) => {
       (val) => {
         state.show = val;
         state.show = val;
-        if (val) pickerColumn.value = [];
+        if (val) {
+          pickerColumn.value = [];
+        }
       }
       }
     );
     );