【问题标题】:Vuelidate 2 doesn't work properly with NuxtJS 2Vuelidate 2 不能与 NuxtJS 2 一起正常工作
【发布时间】:2021-09-28 16:28:13
【问题描述】:

我已经安装了 vuelidate 2 来验证我的 NuxtJS 项目中的表单。我按照vuelidate documentation的说明一步一步安装和设置。到目前为止,我的设置文件是这样的:
包.json

"dependencies": {
    "@nuxtjs/axios": "^5.13.6",
    "@vue/composition-api": "^1.2.2",
    "@vuelidate/core": "^2.0.0-alpha.26",
    "@vuelidate/validators": "^2.0.0-alpha.22",
    "cookie-universal-nuxt": "^2.1.5",
    "core-js": "^3.15.1",
    "nuxt": "^2.15.7",
    "uikit": "^3.7.1"
  }

插件/composition-api.js

import Vue from 'vue'
import VueCompositionAPI from '@vue/composition-api'

Vue.use(VueCompositionAPI)

和 nuxt.config.js 用于@vue/composition-api

plugins: [
    { src: '~/plugins/composition-api.js' }
]

最后这就是我在组件中使用 vuelidate 的方式:

<script>
import useVuelidate from '@vuelidate/core'
import { required } from '@vuelidate/validators'

export default {
  setup () {
    return { v$: useVuelidate() }
  },
  data () {
    return {
      contact: {
        name: ''
      }
    }
  },
  validations () {
    return {
      contact: {
        name: { required }
      }
    }
  },
  methods: {
    submitForm () {
      this.v$.$validate()
        .then((isFormValid) => {
          if (isFormValid) {
            console.log('valid!!!')
          } else {
            return false
          }
        })
    },
  }
}
</script>
<template>
  <label>
    <input v-model="contact.name">
    <div v-if="v$.contact.name.$error">Name is required.</div>
  </label>
</template>

这些是发生的几个问题:

  1. 当我将v-if="v$.contact.name.$error" 放在模板中时,我收到错误Cannot read property 'name' of undefined
  2. 当我调用 submitForm 方法时,isFormValid 的值始终为 false。即使我填写了contact.name 字段。并且像 $dirty 这样的验证属性不会改变。
    我不知道为什么会发生这些。我做错了什么?

更新:(以防它可能对解决问题有用)我的控制台错误过滤器意外未选中,我没有看到这个 Nuxt 警告:[vue-composition-api] already installed. Vue.use(VueCompositionAPI) should be called only once.。当我搜索这个错误时,我发现 Nuxt 使用了一个名为 Nuxt composition api 的依赖项,它依赖于 @vue/composition-api。但是当我从插件中删除@vue/composition-api 时,即使setup 中的代码也无法正常工作。

【问题讨论】:

    标签: vue.js nuxt.js vuelidate


    【解决方案1】:

    vuelidate 的解决方案:

    创建插件(plugins/vuelidate.js):

    import Vue from 'vue'
    import Vuelidate from 'vuelidate'
    Vue.use(Vuelidate)
    

    nuxt.config:

    plugins: [
        { src: '~/plugins/vuelidate' }
      ],
    

    导入:

    import { required } from 'vuelidate/lib/validators'
    

    方法:

    formSubmit() {
          this.$v.$touch();
          if (!this.$v.$invalid) {
            // if invalid datas
          }
        },
    

    模板:

            <h3
              :class="{
                'is-invalid': $v.contact.name.$error,
              }"
            >
              Something
            </h3>
    

    【讨论】:

    • 谢谢,但问题是关于 vuelidate 2。
    • 您需要 ping @amirify 让他收到您的评论通知。
    • 他用例子试过vuelidate2? @amirify
    • @MárkVarga 不,问题是关于 vuelidate 2,它使用组合 api 插件与 Vue 2 兼容。你的答案不适合那个。我提供了 vuelidate 2 文档的链接。您可以查看入门部分。
    猜你喜欢
    • 2017-01-18
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 2017-02-27
    • 2018-11-10
    • 2014-07-01
    • 1970-01-01
    • 2016-07-19
    相关资源
    最近更新 更多