原生html + vue3 获取引用元素refs - elementUI如何在setup中进行表单校验设置

背景:

原生Html 引入elementPlust + vue3 ,需要在vue3 setup里做表单校验,通过el-form ref='form' 的refs元素执行校验。

解决方案1:

保存vue挂载之后实例vm为一个常量,由实例来获取:vm.$refs.form.validate()获取校验结果

最终效果:

提交时,检验结果展示

html源码

复制代码
<!DOCTYPE html>
<html>
<!--带搜索输入框下拉弹窗
-->
<head>
  <meta charset="UTF-8">
  <!-- import Vue before Element -->
  <script src="../js/vue3.3.8/vue.global.js"></script>
  <link rel="stylesheet" href="../js/elementPlus/index.css">
  <script src="../js/elementPlus/index.full.js"></script>
  <title></title>

</head>
<body>
<div id="app">
  <!-- 双大括号语法,可以直接拿到下面data中return 里面的数据 -->

  <el-button type="success" @click="onsubmit">保存按钮</el-button>

  <el-form ref="ruleFormRef" :model="formData" :rules="rules" label-width="120px" class="demo-ruleForm"
           status-icon>
    <div class="section-header">
      商品信息
      <el-checkbox label="自动" size="large" checked></el-checkbox>
    </div>
    <el-row>
      <el-col :span="9">
        <el-form-item label="商品名称" prop="name">
          <el-input placeholder="商品名称长度必须小于20" v-model="formData.name"></el-input>
        </el-form-item>
      </el-col>
      <el-col :span="9">
        <el-form-item label="商品编码" prop="code">
          <el-input placeholder="系统自动生成" v-model='formData.code'></el-input>
        </el-form-item>
      </el-col>
    </el-row>
    <el-divider></el-divider>

  </el-form>

</div>
</body>

<script>
  const {createApp, ref, reactive} = Vue
  const {ElMessageBox} = ElementPlus

  const app = createApp({
    setup() {
      const message = ref('Hello vue!')
      const formData = ref({name: '', code: ''})
      const rules = reactive({
        name: [{required: true, trigger: 'blur'}],
        code: [{required: true, trigger: 'blur'}],
      })
      const onsubmit = (e) => {
        console.log(vm.$refs.ruleFormRef)
        vm.$refs.ruleFormRef.validate(valid => {
          if (valid) {
            alert('校验成功')
          } else {
            alert('失败')
          }
        })
      }

      return {
        message, formData, rules, onsubmit,
        change: (e) => {
          console.log('修改值', e)
        }
      }
    },
    created() {
    },
    mounted() {
      console.log('|--mounted', this)
    }
  })
  app.use(ElementPlus)
  const vm = app.mount('#app')
</script>
</html>

这里一开始获取ruleFormRef这个表单对象,用this获取不到

const vm = app.mount('#app')

因为这句话,最后歪打正着,通过vm这个实例,获取:vm.$refs.ruleFormRef.validate()得到检验结果。

解决方案2

挂载完成,将$refs.form对象赋值给一个setup中创建的响应式变量:

复制代码
const ruleFormRefElement = ref('')
mounted() {
  this.ruleFormRefElement = this.$refs.ruleFormRef
}

这样,只要保证,setup中需要用的地方是挂载完成之后的动作去使用:ruleFormRefElement 它即可。

效果:

html源码

复制代码
<!DOCTYPE html>
<html>
<!--带搜索输入框下拉弹窗
-->
<head>
  <meta charset="UTF-8">
  <!-- import Vue before Element -->
  <script src="../js/vue3.3.8/vue.global.js"></script>
  <link rel="stylesheet" href="../js/elementPlus/index.css">
  <script src="../js/elementPlus/index.full.js"></script>
  <title></title>

</head>
<body>
<div id="app">
  <!-- 双大括号语法,可以直接拿到下面data中return 里面的数据 -->

  <el-button type="success" @click="onsubmit">保存按钮</el-button>

  <el-form ref="ruleFormRef" :model="formData" :rules="rules" label-width="120px" class="demo-ruleForm"
           status-icon>
    <div class="section-header">
      商品信息
      <el-checkbox label="自动" size="large" checked></el-checkbox>
    </div>
    <el-row>
      <el-col :span="9">
        <el-form-item label="商品名称" prop="name">
          <el-input placeholder="商品名称长度必须小于20" v-model="formData.name"></el-input>
        </el-form-item>
      </el-col>
      <el-col :span="9">
        <el-form-item label="商品编码" prop="code">
          <el-input placeholder="系统自动生成" v-model='formData.code'></el-input>
        </el-form-item>
      </el-col>
    </el-row>
    <el-divider></el-divider>

  </el-form>

</div>
</body>

<script>
  const {createApp, ref, reactive} = Vue
  const {ElMessageBox} = ElementPlus

  const app = createApp({
    setup() {
      const message = ref('Hello vue!')
      const formData = ref({name: '', code: ''})
      const rules = reactive({
        name: [{required: true, trigger: 'blur'}],
        code: [{required: true, trigger: 'blur'}],
      })

      const ruleFormRefElement = ref('') //用一个变量来保存$refs元素,在挂载完成时赋值(mounted),这样在setup中就可以方便操作表单校验结果检查:ruleFormRef
      const onsubmit = (e) => {
        ruleFormRefElement.value.validate(valid => { //表单验证
          if (valid) {
            alert('提交校验:成功')
          } else {
            alert('提交校验:失败')
          }
        })
      }

      return {
        message, formData, rules, onsubmit,
        change: (e) => {
          console.log('修改值', e)
        }, ruleFormRefElement,
      }
    },
    created() {
    },
    mounted() {
      console.log('|--mounted', this.$refs)
      this.ruleFormRefElement = this.$refs.ruleFormRef
      console.log('|--mounted,this.ruleFormRefElement', this.ruleFormRefElement)
    }
  })
  app.use(ElementPlus)
  const vm = app.mount('#app')
</script>
</html>

相关:

在vue3项目嵌套 导入老项目 jQuery项目,减少重复开发-CSDN博客

相关推荐
gis开发之家6 小时前
《Vue3 从入门到大神37篇》Vue3 源码详解(七):watch 与 watchEffect 源码对比——副作用是如何被追踪的?
javascript·前端框架·vue3·vue3源码
blns_yxl9 小时前
购物车(HTML+JS+CSS)
html
blns_yxl11 小时前
正则驱动实时表单验证(HTML+CSS+JS+正则)
javascript·css·html
大白要努力!12 小时前
纯前端实现 PDF 加水印工具 —— 零后端、支持中文、实时预览
前端·pdf·html
蜡台12 小时前
使用 uni-popup 实现数据选择器Data-Picker
前端·javascript·html·uniapp·uni-popup·data-picker
blns_yxl12 小时前
Promise封装Fetch + 重试机制(HTML+JS)
前端·javascript·html
杨超越luckly1 天前
Agent应用指南:13年与13线——武汉地铁进化史
数据分析·html·agent·可视化·地铁客流
葡萄城技术团队2 天前
HTML元素单元格:用自定义 CellType 扩展 SpreadJS 的显示能力
前端·javascript·html
逝水无殇2 天前
HTML 属性(HTML Attributes)详解
开发语言·前端·html·html5
码农学院2 天前
2026年生成式搜索引擎优化对服务业本地化获客帮助的数字化转型路径
前端·搜索引擎·html