DoubleNumberEdit.vue 2.25 KB
Newer Older
hucy's avatar
hucy committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
<script lang="ts">
import { ref, onMounted, defineComponent, nextTick } from 'vue';
import { isEmpty } from 'src/common/utils';
export default defineComponent({
  setup(props: any) {
    const cellInputRef = ref<any>(null);
    const inputValue = ref<any>(null);
    const value = ref<any>(null);

    onMounted(() => {
      // 编辑开始后
      // 获取输入框焦点
      nextTick(() => {
        value.value = props.params.value;
        inputValue.value = props.params.value;
        cellInputRef.value.focus();
      });
    });

    // 编辑完成后发送到网格的最终值
    const getValue = () => {
      return value.value;
    };

    // 在编辑开始前被调用一次,
    // 以便在编辑开始前给编辑一个取消编辑的机会。
    const isCancelBeforeStart = () => {
      return false;
    };

    // 编辑完成时调用一次(例如,如果按下 Enter)。
    // 如果返回 true,则编辑的结果将被忽略。
    const isCancelAfterEnd = () => {
      // 我们的编辑器将拒绝任何大于 1000 的值
      return inputValue.value > 1000;
    };

    const modelChange = (val: any) => {
      if (!isEmpty(val)) {
        const endStr = val.charAt(val.length - 1);
        if (endStr === '=') {
          const numStr = val.substring(0, val.length - 1);
          if (!isEmpty(numStr)) {
            value.value = Number(numStr) * 2;
          } else {
            value.value = null;
          }
        } else {
          if (Number.isNaN(Number(val))) {
            value.value = null;
          } else {
            value.value = val;
          }
        }
      } else {
        value.value = null;
      }

      if (Number.isNaN(Number(value.value))) {
        value.value = null;
      }
    };

    return {
      cellInputRef,
      inputValue,
      getValue,
      isCancelBeforeStart,
      isCancelAfterEnd,
      modelChange,
    };
  },
});
</script>
<template>
  <div>
    <div class="input-box">
      <q-input
        dense
        square
        filled
        v-model="inputValue"
        ref="cellInputRef"
        @update:model-value="modelChange"
      />
    </div>
  </div>
</template>

<style lang="scss" scoped>
.input-box {
  height: 30px;
  box-sizing: border-box;
  border: 1px solid red;
}
</style>