代码之家  ›  专栏  ›  技术社区  ›  niutech

如何异步验证Vuetify文本字段?

  •  11
  • niutech  · 技术社区  · 6 年前

    Text fields 在Vuetify中有 rules props,它接受一组返回的函数 true 或错误字符串。如何使它们异步,以便可以使用XHR在服务器端进行验证?

    类似于:

    <v-text-field :rules="[v => { axios.get('/check?value=' + val).then(() => { return true }) }]">
    
    2 回复  |  直到 6 年前
        1
  •  22
  •   Salim Djerbouh SeliC    4 年前

    一种解决方案是设置 error-messages 道具:

    <v-text-field v-model="input" :error-messages="errors">

    并使用 watch 选项:

    new Vue({
      data () {
        return {
          input: '',
          errors: []
        }
      },
      watch: {
        input (val) {
            axios.get('/check?value=' + val).then(valid => {
              this.errors = valid ? [] : ['async error']
            })
        }
      }
    });
    
        2
  •  -1
  •   Luca    5 年前

    我必须进行后端验证,以检查输入的用户名是否已经存在。我使用带有JSON open API v3的swagger客户端库来调用检查用户名值的方法。

    所以我就这样解决了。。。

    在我的登录中。js文件我定义了一个字符串属性,其中包含错误消息:

    import swaggerClient from "../remote-client";
    const strict = true;
    const state = {
      hasError: false,
      error: null,
      usernameAlredyExists: ""
    };
    const getters = {
      hasError: state => state.hasError,
      error: state => state.error,
      usernameAlredyExists: state => state.usernameAlredyExists
    };
    const mutations = {
      checkingUsername(state) {
        state.hasError = false;
        state.error = null;
        state.usernameAlredyExists = "";
      },
      usernameCheckedKO(state) {
        state.usernameAlredyExists = "Username already exists";
      },
      usernameCheckedOK(state) {
        state.usernameAlredyExists = "";
      },
      errorCheckingUsername(state, error) {
        state.hasError = true;
        state.error = error;
      },
    };
    const actions = {
      userLogin({ commit }, { username, password }) {
        // not relevant code
      },
      checkUsername({ commit }, { username }) {
        commit("checkingUsername");
        swaggerClient.userSwaggerClient
          .then(
            function(client) {
              return client.apis.UserHealthFacility.getHfUserUsernameWithUsername(
                { username: username },
                {},
                {}
              );
            },
            function(reason) {
              // failed to load the JSON specification
              commit("errorCheckingUsername", reason);
            }
          )
          .then(
            function(callResult) {
              if (callResult.body) {
                commit("usernameCheckedKO");
              } else {
                commit("usernameCheckedOK");
              }
            },
            function(reason) {
              // failed to call the API method
              commit("errorCheckingUsername", reason);
            }
          );
      }
    };
    
    export default {
      namespaced: true,
      strict,
      state,
      getters,
      mutations,
      actions
    };
    

    然后在登录中。vue文件我有以下代码:

    <v-card-text>
      <v-form ref="loginForm" v-model="loginValid" lazy-validation>
        <v-text-field
          v-model="username"
          label="Username"
          :rules="[rules.required]"
          :error-messages="usernameAlredyExists"
          v-on:change="callCheckUsername"
        ></v-text-field>
        <v-text-field
          v-model="password"
          :label="Password"
          :append-icon="showPassword ? 'visibility_off' : 'visibility'"
          :type="showPassword ? 'text' : 'password'"
          :rules="[rules.required, rules.minLength]"
          counter
          @click:append="showPassword = !showPassword"
        ></v-text-field>
      </v-form>
    </v-card-text>
    <v-card-actions>
      <v-spacer></v-spacer>
      <v-btn
        :disabled="!loginValid"
        @click="callUserLogin"
        color="primary"
        round
      >Login</v-btn>
    </v-card-actions>
    
    <script>
    export default {
      data() {
        return {
          username: "",
          password: "",
          showPassword: false,
          loginValid: true,
          rules: {
            required: value => !!value || "Questo campo è obbligatorio",
            minLength: value =>
              value.length >= 8 || "Questo campo deve contenere almeno 8 caratteri"
          }
        };
      },
      computed: {
        usernameAlredyExists() {
          return this.$store.getters["login/usernameAlredyExists"];
        }
      },
      methods: {
        callUserLogin() {
          if (this.$refs.loginForm.validate()) {
            this.$store.dispatch("login/userLogin", {
              username: this.username,
              password: this.password
            });
          }
        },
        callCheckUsername(value) {
          if (value) {
            this.$store.dispatch("login/checkUsername", {
              username: this.username
            });
          }
        }
      }
    };
    </script>
    

    这样看来效果不错