【问题标题】:Nuxt / Vue 2 override input value after changeNuxt / Vue 2 更改后覆盖输入值
【发布时间】:2021-09-03 03:38:06
【问题描述】:

我正在尝试创建一个输入,将用户按下的键转换为最后一个大写字符(如果用户键入 'a' -> 'A'、'abc' -> 'C')。

这是我的代码:

<template>
  <b-form-input
    ref="firstNameInitial"
    v-model="firstNameInitial"
  />
</template>

<script>
export default {
  firstNameInitial: {
    get () {
      return this.$store.state.certificateAdd.firstNameInitial
    },
    async set (val) {
      const newValue = StringUtils.convertToNameInitial(val)
      this.$store.commit('certificateAdd/setFirstNameInitial', newValue)

      // Tried this as well
      this.$refs.firstNameInitial.$el.value = newValue
    }
  }
}
</script>

如果我输入不同的字母,这会很好,但如果我输入“aa”,输入将显示“Aa”,因为不会重新计算 getter(vuex 仍然保存相同的数据:“A”)。

即使我通过引用一些在 setter 中递增的虚拟本地数据来欺骗 getter,组件也不会重新渲染,因为 value 属性没有更改;但即使 Vue 没有介入更改,下划线 HTML 输入的值也会始终更新。

我什至尝试过直接操作 DOM,但这也不起作用。

关于如何实现此行为的任何想法。

【问题讨论】:

    标签: html vue.js input nuxt.js


    【解决方案1】:

    您不应该使用突变,因为它是同步的。由于 DOM 处理更新的方式,您应该使用 vuex 操作。如果你把它作为一个动作,我认为它可能会很好。

    如果它不起作用,可以同时尝试:await this.$nextTick()action(按此顺序)。

    【讨论】:

    • 这 2 条建议没有奏效,但它为我指明了正确的方向。在$nextTick 中手动更改this.$refs.firstNameInitial.$el.value = newValue 就可以了。
    • @sheitan 很高兴我的回答对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 2022-06-19
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    相关资源
    最近更新 更多