【问题标题】:Nuxt + Vuex + Computed PropertyNuxt + Vuex + 计算属性
【发布时间】:2020-12-29 05:40:50
【问题描述】:

我目前正在尝试使用 Vuex 的 Nuxt.js。我构建了一个简单的表单,其中有一个电子邮件字段、一个密码字段和一个按钮。

我所有的状态、突变和动作都在正常工作。但是当我创建一个计算属性只是为了验证密码时,我总是在使用 if 语句来验证密码长度时出错。

我的 Vuex 状态如下所示:

export default () => ({
// Register Init States
  registerEmail: null,
  registerPassword: null,
})

我的突变:

export default {
  setRegisterEmail(state, registerEmail) {
    state.registerEmail = registerEmail
  },
  setRegisterPassword(state, registerPassword) {
    state.registerPassword = registerPassword
  },
}

我的模板:

            <vs-input
              :value="registerPassword"
              label="Password"
              primary
              type="password"
              :progress="getProgress"
              :visible-password="hasVisiblePassword"
              icon-after
              @input="setRegisterPassword"
              @click-icon="hasVisiblePassword = !hasVisiblePassword"
            >
              <template #icon>
                <i v-if="!hasVisiblePassword" class="bx bx-show-alt"></i>
                <i v-else class="bx bx-hide"></i>
              </template>

              <template v-if="getProgress == 100" #message-success
                >Secure password</template
              >
            </vs-input>

我的计算属性:

getProgress() {
      let progress = 0
      // at least one number
      if (/\d/.test(this.$store.state.auth.registerPassword)) {
        progress += 30
      }
      // at least one capital letter
      if (/(.*[A-Z].*)/.test(this.$store.state.auth.registerPassword)) {
        progress += 20
      }
      // at least a lowercase
      if (/(.*[a-z].*)/.test(this.$store.state.auth.registerPassword)) {
        progress += 25
      }
      // more than 8 digits
      if (this.$store.state.auth.registerPassword === null) {
        progress += 0
      } else if (this.$store.state.auth.registerPassword.length >= 8) {
        progress += 25
      }
      return progress
    },

所以因为密码初始化状态为空,应该没有进度,但是当我输入密码时,它应该到else if并验证字符数。

但是当我输入密码时,输入和我的状态只保留我输入的最后一个字母。

假设我输入了“溢出”,我的状态密码只有“w”。如果我删除密码验证长度,我的状态看起来像这样“溢出”。

我做错了吗?我希望我是清楚的????因为我现在很迷茫。 ????

【问题讨论】:

  • 您不应该检查this.value 的长度吗?那是您之前进行所有检查的密码。
  • 抱歉,我更新了问题。我忘了用 this.$store.state.auth.registerPassword 交换 this.value。
  • 您更新registerPassword 状态值的方式有问题吗?您也可以添加该代码吗?
  • @Dylan。我再次更新并添加了我的 Mutations 代码。
  • 谢谢,最后一件事,你能在你打电话的地方添加代码setRegisterPassword()

标签: javascript vue.js vuex nuxt.js


【解决方案1】:

当您在模板中调用setRegisterPassword 时会导致该问题。该输入事件仅返回最后一个输入字符。您可以添加一个处理程序来正确更新该值。一种选择是将本地数据属性用作v-model 绑定,然后将setRegisterPassword 用于输入处理程序中的该值。

            <vs-input
              v-model="localPassword"
              label="Password"
              primary
              type="password"
              :progress="getProgress"
              :visible-password="hasVisiblePassword"
              icon-after
              @input="handleRegisterPassword"
              @click-icon="hasVisiblePassword = !hasVisiblePassword"
            >

在你的

data(){
 return {
   localPassword:''
 }
},
methods: {
  handleRegisterPassword() {
    this.setRegisterPassword(this.localPassword);
  }
}

注意:我对 vs-input 不熟悉,所以您的 :value 可能与 v-model 的工作方式相同,因此您可以将其保留为值。

【讨论】:

  • 但是如果我在我的模板中使用 v-model 会不会出现问题?我遵循了 Vuex 在这里所说的:vuex.vuejs.org/guide/forms.html.
  • 因为我正在访问我的 vuex 状态、突变和操作。为此,我使用了 mapState、mapMutations 和 mapActions。这就是我使用 :value 而不是 v-model 并使用 @input 进行突变的原因。
  • 是的,registerPassword 状态值不能使用 v-model,这就是为什么我建议您使用与组件的数据属性不同的变量,并在处理程序中设置 vuex 状态
  • 但是如果我使用 handleRegisterPassword 我的 registerPassword 不会是“”(空?)
  • 如果您将输入绑定到localPassword,则不会。
猜你喜欢
  • 2020-08-11
  • 2019-10-19
  • 2018-10-12
  • 2018-11-29
  • 2019-07-13
  • 2019-07-14
  • 2018-07-22
  • 2021-07-19
  • 2018-05-12
相关资源
最近更新 更多