Vue3组件(17)给表单控件设置一个插槽

简介: 给表单控件设置一个插槽

image.png


表单的自定义子控件



表单封装之后就会遇到一个古老的问题 —— 需要放进去一个新类型的子控件怎么办?


表单控件又不可能把所有类型的框架都封装进去,这在以前都是很头痛的问题,如果是需要修改封装好的代码才可以实现的话,那就太郁闷了。


但是现在在Vue里面,至少有两种解决方案,还都挺优雅的。


用插槽设置自定义组件



Vue的组件有插槽这个功能,一开始还没想起来,这的多谢好友“@我滴神”的提醒,才想起来可以用插槽。好吧其实是我以前还不会用插槽。。。


研究了一下Vue官网,又结合 el-input 设置的插槽理解了一下,发现还不难,于是给表单控件设置了这样的插槽。


<el-form
      :model="formModel"
      ref="formControl" // 官网把这两个属性设置成一样的,结果被坑了,,,
      :rules="rules"
      :inline="false"
      class="demo-form-inline"
      label-suffix=":"
      label-width="130px"
      size="mini"
    >
      <el-row>
        <!--不循环row,直接循环col,放不下会自动往下换行。-->
        <el-col
          v-for="(ctrId, index) in formColSort"
          :key="'form_'+index"
          :span="formColSpan[ctrId]"
        >
          <el-form-item
            :label="getCtrMeta(ctrId).label"
            :prop="getCtrMeta(ctrId).colName"
          >
            <!--判断要不要加载插槽-->
            <template v-if="getCtrMeta(ctrId).controlType === 1">
              <slot :name="ctrId">父组件没有设置插槽</slot>
            </template>
            <!--表单item组件,采用动态组件的方式-->
            <template v-else>
              <component
                :is="ctlList[getCtrMeta(ctrId).controlType]"
                v-model="formModel[getCtrMeta(ctrId).colName]"
                v-bind="getCtrMeta(ctrId)"
                @myChange="mySubmit">
              </component>
            </template>
          </el-form-item>
        </el-col>
      </el-row>
    </el-form>
复制代码


在原先v-for循环的基础上,加上一个判断,根据meta的controlType 来判断,如果=== 1 好的,那么就是要用插槽,然后把控件ID设置给插槽的name属性,这样就可以按照控件ID来加载外部指定的插槽了。


外部使用方法



父组件首先要设置好插槽,这个就可以很随意了,插槽嘛就是可以各种各样的,我们先来个简单的。


<elForm
    v-model="model"
    v-model:partModel="partModel"
    :meta="meta">
      <template v-slot:102="">
        <h3>这是外面建立的子控件</h3>
        <el-input v-model="model.colName" placeholder="请输入内容"></el-input>
      </template>
      <template v-slot:104="">
        <h3>这是外面建立的另一个子控件</h3>
        <input type="text">
      </template>
  </elForm>
复制代码


用 template 设置好控件ID,这样可以设置多个插槽。


然后再设置一下表单的meta即可


// 设置使用插槽的表单子控件
    meta.itemMeta[102].controlId = 102
    meta.itemMeta[102].colName = '属性名称'
    meta.itemMeta[102].controlType = 1
复制代码


属性的具体内以后在介绍,总之,不用改表单控件的内部代码,就可以实现随意往里加新的子控件的需求了。


支持验证等功能吗?



测试了一下,支持各种功能,表单数据验证、排序、占位等都是支持的,和表单自带的子控件是一样的功能。 只是 v-model 需要外部设置一下。


这些还要感谢 Vue 和 UI库的强大。


$ref怎么处理?



element的官网例子里面,重置表单用的是Vue2的方式,正巧在Vue 官网看到了$ref的用法,于是改成了Vue3的方式实现重置表单的功能。


// Vue2 的方法
methods: {
  resetForm(formName) {
    this.$refs[formName].resetFields();
  }
}
// Vue3的方法
// 获取 $ref
  const formControl = ref(null) // 设置给el-form 的ref属性
  onMounted(() => {
    console.log('表单dom', formControl)
  })
  const resetForm = () => {
    // 清空表单
    formControl.value.resetFields()
  }
复制代码


这样表的控件就更完善了,另外,这不过了几天嘛,结果再看代码,居然看不懂了。。。


源码



github.com/naturefwvue…



相关文章
|
22天前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
126 64
|
22天前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
28 8
|
22天前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
25天前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
27天前
|
JavaScript 前端开发 开发者
vue 数据驱动视图
总之,Vue 数据驱动视图是一种先进的理念和技术,它为前端开发带来了巨大的便利和优势。通过理解和应用这一特性,开发者能够构建出更加动态、高效、用户体验良好的前端应用。在不断发展的前端领域中,数据驱动视图将继续发挥重要作用,推动着应用界面的不断创新和进化。
|
1天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
29天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
32 1
vue学习第一章
|
29天前
|
JavaScript 前端开发 索引
vue学习第三章
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中的v-bind指令,包括基本使用、动态绑定class及style等,希望能为你的前端学习之路提供帮助。持续关注,更多精彩内容即将呈现!🎉🎉🎉
26 1
vue学习第三章
|
29天前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
35 1
vue学习第四章
|
29天前
|
JavaScript 前端开发 算法
vue学习第7章(循环)
欢迎来到瑞雨溪的博客,一名热爱JavaScript和Vue的大一学生。本文介绍了Vue中的v-for指令,包括遍历数组和对象、使用key以及数组的响应式方法等内容,并附有综合练习实例。关注我,将持续更新更多优质文章!🎉🎉🎉
24 1
vue学习第7章(循环)
下一篇
DataWorks