Vue + Antd Vue解决扫码枪中文输入法时输入框显示错误问题

1,175 阅读1分钟

扫码枪原理:每次使用扫码枪相当于执行了输入扫码的字符+回车enter事件。

问题:在中文输入法下,输入扫码的字符,相当于在敲拼音,这会导致显示结果和扫码内容不一致的情况。

解决方法:利用输入框type="password"不能输入中文的属性,来解决,为此封装一个专用于扫码枪的输入框,代码如下:

<script>
export default {
  name: "ScanCodeInput",
  props: {
    value: {
      type: String,
      default: () => ""
    }
  },
  data () {
    return {
      inputValue: null
    }
  },
  computed: {
    inputType () {
      // 通过判断输入框内是否有值,来切换输入框类型
      return this.inputValue ? "text" : "password"
    }
  },
  watch: {
    value: {
      handler (val) {
        this.inputValue = val
      },
      deep: true,
      immediate: true
    }
  },
  methods: {
    handleChange (e) {
      this.$emit('input', e.target.value)
    },
    handlePressEnter () {
      this.$emit('pressEnter')
    }
  },
  render () {
    return <a-input
      ref="input"
      vModel={this.inputValue}
      type={this.inputType}
      onChange={this.handleChange}
      onPressEnter={this.handlePressEnter}
      { ...{ props: { ...this.$attrs } } }
    />
  }
}
</script>

备注:原a-input所有的api都可用在此输入框中