当前位置: 首页 > 知识库问答 >
问题:

element-ui - elementUI的验证为什么@click="submitForm(formRef)"可以,而直接使用ref<FormInstance>()就不行?

费星晖
2024-02-22
<template>  <el-form      ref="formRef"      :model="numberValidateForm"      label-width="100px"      class="demo-ruleForm"  >    <el-form-item        label="age"        prop="age"        :rules="[        { required: true, message: 'age is required' },        { type: 'number', message: 'age must be a number' },      ]"    >      <el-input          v-model.number="numberValidateForm.age"          type="text"          autocomplete="off"      />    </el-form-item>    <el-form-item>      <el-button type="primary" @click="submitForm">Submit</el-button>      <el-button @click="resetForm">Reset</el-button>    </el-form-item>  </el-form></template><script lang="ts" setup>import { reactive, ref } from 'vue'import type { FormInstance } from 'element-plus'const formRef = ref<FormInstance>()const numberValidateForm = reactive({  age: '',})const submitForm = () => {  if (!formRef) return  formRef.validate((valid) => {    if (valid) {      console.log('submit!')    } else {      console.log('error submit!')      return false    }  })}const resetForm = (formEl: FormInstance | undefined) => {  if (!formEl) return  formEl.resetFields()}</script>

共有2个答案

沈华皓
2024-02-22

得是 formRef.value.validate() 吧……
script 中使用 ref 的加上 .value

华睿识
2024-02-22

在 Vue 3 的 Composition API 中,ref 是一个响应式引用,它返回一个响应式引用对象,该对象具有一个 value 属性,该属性包含对该引用的实际值的访问。这就是为什么你需要使用 formRef.value 而不是 formRef 来访问表单实例。

在你的代码中,你创建了一个名为 formRef 的响应式引用,并尝试使用它来调用 validate 方法。然而,由于 formRef 是一个响应式引用对象,而不是表单实例,所以不能直接使用它来调用 validate 方法。

如果你想使用 ref 来访问表单实例,你应该在模板中通过 ref 属性直接获取表单实例,然后在方法中使用它。例如:

<template>  <el-form ref="formRef" :model="numberValidateForm" label-width="100px" class="demo-ruleForm">    <!-- ... -->  </el-form></template><script lang="ts" setup>import { ref, onMounted } from 'vue'import { Form, FormInstance } from 'element-plus'const formRef = ref<Form | FormInstance | null>(null)const numberValidateForm = reactive({  age: '',})onMounted(() => {  const formEl = formRef.value  if (formEl) {    formEl.validate((valid) => {      if (valid) {        console.log('submit!')      } else {        console.log('error submit!')        return false      }    })  }})</script>

在上面的代码中,我们在模板中通过 ref 属性获取了表单实例,并在 onMounted 钩子中使用了它来调用 validate 方法。这样就可以使用 ref 来访问表单实例,并在需要的时候进行验证了。

 类似资料:
  • 如题,我百度了下,因为ref是响应式的,当里面的值变更时,页面也会同步更新。但是我也尝试了普通的<input type=checkedbox checked=flag>,当我在methods里切换flag 的true/false状态时,页面控件的勾选状态也就发生改变。既然如此,为什么还要用ref()函数??还是说因为使用了element-plus的组件所以必须用ref?

  • 问题内容: 目前使用jQuery,当我需要在发生点击时做一些事情时,我会像这样… 我正在看别人在项目上有的代码,他们这样做是… 请注意,就我所知,它似乎在做相同的事情,除了它们使用的是live()函数(现在已弃用并且jQuery文档说要使用live()函数),但是无论哪种方式,为什么要使用live / on()而不是我的第一个示例? 问题答案: 因为您可能具有动态生成的元素(例如,来自AJAX调用

  • 我没有在我的中设置,但是我可以使用和! 我的如下所示: 如果我想安装其他版本的JDK,比如11、14、15.…,我该如何使用它呢?我需要设置吗?

  • 关键代码: 在线demo: https://codesandbox.io/s/vue-2-element-ui-forked-ihh33k?file=... 从demo中可以看出,左边的button比右边要高出半个像素,只是因为左边加了一个icon。但button的font-size都是固定的12px,行高为1,这多余的半个像素是怎么出来的呢?

  • 问题内容: 因此,对于Toast类,显然可以这样编写: 为什么完全可以实例化toastMessage并将其用作没有new关键字的对象? 如何通过方法实例化toastMessage? 问题答案: 这里没有什么特别的。您只是在调用创建实例的静态方法(或者可以重用现有实例- 这是实现细节)。例如,这是您会在各处看到的一种模式。有时可以改为调用构造函数,有时 只能 通过静态方法创建实例。 除非幕后功夫,否