• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧
您的位置:首页 > CMS教程 >建站教程 > Vue模仿ElementUI的form表单实例代码

Vue模仿ElementUI的form表单实例代码

作者:站长图库 字体:[增加 减小] 来源:互联网

站长图库向大家介绍了Vue模仿ElementUI,form表单,实例代码等相关知识,希望对您有所帮助

这篇文章主要给大家介绍了关于Vue模仿ElementUI的form表单的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

实现要求

模仿 ElementUI 的表单,分为四层结构:index 组件、Form 表单组件、FormItem 表单项组件、Input 和 CheckBox 组件,具体分工如下:

index 组件:

实现:分别引入 Form 组件、FormItem 组件、Input 组件,实现组装;


Form 表单组件:

实现:预留插槽、管理数据模型 model、自定义校验规则 rules、全局校验方法 validate;


FormItem 表单项组件:

实现:预留插槽、显示 label 标签、执行数据校验、显示校验结果;


Input 和 CheckBox 组件:

实现:绑定数据模型 v-model、通知 FormItem 组件执行校验;

Input 组件

具体实现如下:

1、自定义组件要实现 v-model 必须实现 :value 和 @input。

2、当输入框中的数据发生变化时,通知父组件执行校验。

3、当 Input 组件绑定的 type 类型为 password 时,在组件内部使用 v-bind="$attrs" 获取 props 之外的内容。

4、设置 inheritAttrs 为 false, 从而避免顶层容器继承属性。

Input 组件实现:

<template>    <div>        <input :value="value" @input="onInput" v-bind="$attrs" />    </div></template><script>export default {    inheritAttrs: false, // 避免顶层容器继承属性    props: {        value: {            type: String,            default: ""        }    },    data() {        return {};    },    methods: {        onInput(e) {            // 通知父组件数值发生变化            this.$emit("input", e.target.value);             // 通知 FormItem 执行校验            // 这种写法不健壮,因为 Input 组件和 FormItem 组件之间可能会隔代            this.$parent.$emit("validate");        }    }};</script><style scoped></style>

注意:代码中使用 this.$parent 派发事件,这种写法不健壮,当 Input 组件和 FormItem 组件之间隔代时会出现问题。具体解决方式见文章尾部代码优化部分。

CheckBox 组件

1、自定义实现 checkBox 的双向数据绑定,和 input 大同小异,必须实现 :checked 和 @change。

CheckBox 组件实现:

<template>    <section>        <input type="checkbox" :checked="checked" @change="onChange" />    </section></template><script>export default {    props: {        checked: {            type: Boolean,            default: false        }    },    model: {        prop: "checked",        event: "change"    },    methods: {        onChange(e) {            this.$emit("change", e.target.checked);            this.$parent.$emit("validate");        }    }};</script><style scoped></style>

FormItem 组件

具体实现如下:

1、给 Input 组件或者 CheckBox 组件预留插槽。

2、如果用户在组件上设置 label 属性,要展示 label 标签。

3、监听校验事件,并执行校验(使用 async-validator 插件进行校验)。

4、如果不符合校验规则,需要显示校验结果。

在开发的过程中,我们需要思考几个问题:

1、在组件内部,如何得到需要校验的数据和校验规则?

2、在 Form 表单中会有多个菜单项,如:用户名、密码、邮箱...等等,那么 FormItem 组件是如何得知现在校验的是哪个菜单呢?

FormItem 组件实现:

<template>    <div>        <div>            <label v-if="label" :style="{ width: labelWidth }">{{ label }}:</label>            <slot></slot>        </div>        <p v-if="errorMessage">{{ errorMessage }}</p>    </div></template><script>import Schema from "async-validator";export default {    inject: ["formModel"],    props: {        label: {            type: String,            default: ""        },        prop: String    },    data() {        return {            errorMessage: "",            labelWidth: this.formModel.labelWidth        };    },    mounted() {        // 监听校验事件,并执行校验        this.$on("validate", () => {            this.validate();        });    },    methods: {        validate() {            // 执行组件的校验            // 1、获取数据            const values = this.formModel.model[this.prop];            // 2、获取校验规则            const rules = this.formModel.rules[this.prop];         
  


 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Vue模仿ElementUI的form表单实例代码

相关文章

  • 详解PHP中高精度计时器HRTime扩展
  • 帝国CMS二次开发付款后才能查看内容
  • PHP使用Apache的伪静态功能实现“网页404时跳转指定页面
  • PHP怎么删除最后一个字符
  • 做seo排名时你的侧重点是什么
  • PHPcms远程图片本地化增加图片类型和后缀的方法
  • 京东图床上传接口 PHP源码
  • 织梦DEDECMS扩展插件来防止注册机注册会员和投稿
  • 分享封装的一个PHP微信支付的类库(扫码、H5、小程序)
  • nginx报错502怎么办?解决方案分享

文章分类

  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧

最近更新的内容

    • Photoshop数位板人物设计教程:《主教MM》
    • Photoshop绘制透明效果的五角星
    • 介绍thinkPHP配置虚拟域名简化URL路径
    • laravel-mix怎么自动压缩html模板文件
    • 为WordPress主题文章纯代码添加历史上的今天列表
    • html+css如何实现自定义图片上传按钮
    • Photoshop设计黑色大气的网页模板
    • MYSQL有哪些常用基本SQL语句
    • Centos MySQL 忘记密码怎么办
    • dede 安全设置集合!dede站长必看!

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有