教你用element-ui实现属于自己的表单组件

前言

最近因为新型冠状病毒,我们都只能呆在家不能出门,所以挺无聊的,就写下了这篇用element-ui实现一个属于自己的组件,希望能对大家有帮助!

创建项目

检查node环境配置

Vue CLI 需要 Node.js 8.9 或更高版本 (推荐 8.11.0+)

node -v

Vue版本

可以使用下列任一命令安装这个新的包

npm install -g @vue/cli
# OR
yarn global add @vue/cli

查看vue版本

vue --version

创建项目

vue create hello-world

注意:由于我们是开发一个第三方依赖库,我们选择 Manually select features

选择特性安装到到项目中

 (*) Babel
 ( ) TypeScript
 ( ) Progressive Web App (PWA) Support
 ( ) Router
 ( ) Vuex
 (*) CSS Pre-processors
 (*) Linter / Formatter
 ( ) Unit Testing
 ( ) E2E Testing

安装哪一种 CSS 预处理语言

(*) Sass/SCSS (with dart-sass)
( ) Sass/SCSS (with node-sass)
( ) Less
( ) Stylus

选择代码风格

(*) ESLint with error prevention only
( ) ESLint + Airbnb config
( ) ESLint + Standard config
( ) ESLint + Prettier

哪种方式检测代码格式

(*) Lint on save
( ) Lint and fix on commit

是否保存预配置

Save this as a preset for future projects? (y/N)N

最后系统帮我们生成一个完整的项目。

element集成

在项目里使用

vue add element

首先

需要在element.js里面导入Form、FormItem和Input

element.js最后的代码:

import Vue from 'vue'
import { Button,Form,FormItem,Input } from 'element-ui'

Vue.use(Button)
Vue.use(Form)
Vue.use(FormItem)
Vue.use(Input)

组件使用

创建一个登录表单并可以验证用户输入

  • App.vue
 <div>
        <h3>Element表单</h3>
        <hr>
        <el-form :model="model" :rules="rules" ref="loginForm">
          <el-form-item label="用户名" prop="username">
            <el-input v-model="model.username" autocomplete="off"></el-input>
          </el-form-item>
          <el-form-item label="确认密码" prop="password">
            <el-input type="password" v-model="model.password" autocomplate="off">
            </el-input>
          </el-form-item>
          <el-form-item>
            <el-button type="primary" @click="submitForm('loginForm')">提交</el-button>
          </el-form-item>
        </el-form>
      </div>
      
 data(){
    return{
      value:'',
      model: {username: "ming",password: ""},
      rules: {
        username: [
          {required: true, message: "请输入用户名"},
          {min:6,max:10, message: "请输入6~10的用户名"},
        ],
        password: [
          {required: true, message: "请输入密码"}
        ],
      }
    };
  },
  
   methods: {
    submitForm(form) {
      this.$refs[form].validate(valid=>{
        if(valid){
          alert('请求登录!')
        }else{
          alert('效验失败!')
        }
      })
    }
  }

运行效果:
cmd-markdown-logo
cmd-markdown-logo
cmd-markdown-logo

组件设计

实现Input、Form、FormItem

实现Input

  • App.vue

通过v-model进行双向数据绑定,这里的v-model绑定了value值监听了input事件

<K-input v-model="value"></K-input>

import KInput from './components/input'

export default {
    name: 'app',
    components: {
        KInput
  },
}
  • components/input.vue
<template>
    <div>
        <input :type="type" :value="value" @input="onInput">
    </div>
</template>

<script>
    export default{
        props:{
            value:{
                type:String,
                default: ''
            },
            type:{
                type:String,
                default: 'text'
            }
        },
        methods:{
            onInput(e) {
                let value = e.target.value;
                //input事件触发设置模型的值并通知父组件
                this.$emit('input',value)
            }
        },
    }
</script>

运行效果
cmd-markdown-logo

实现FormItem

  • App.vue
    <!-- 用户名 -->
<K-form-Item label="用户名" prop="username">
  <K-input v-model="model.username"></K-input>
</K-form-Item>
    <!-- 密码 -->
<K-form-Item label="密码" prop="password">
  <K-input v-model="model.password" type=""></K-input>
</K-form-Item>

import KInput from './components/input'
import KFormItem from './components/FormItem'

export default {
  name: 'app',
  components: {
    KInput,
    KFormItem
  },
  • components/FormItem.vue
<template>
    <div>
        <label for="">{{label}}</label>
        <div>
            <slot></slot>
            <p v-if="errStatus">{{errMessage}}</p>
        </div>
    </div>
</template>
<script>
    import Schema from 'async-validator'
    export default{
        inject: ['KForm'],
        props:['label','prop'],
        data(){
            return{
                errMessage: '',
                errStatus: false
            }
        },
        mounted(){
            this.$on('validate',this.validator)
        },
        methods:{
            validator(){
                //有两个Input,一个用户名,一个密码
                const rules = this.KForm.rules[this.prop];
                const value = this.KForm.model[this.prop];

                const descriptor = {[this.prop]:rules};
                const schema = new Schema({descriptor});
                schema.validate({[this.prop]:value},errors =>{
                    if(errors){
                        this.errMessage = errors[0].message;
                        this.errStatus = true;
                    }else{
                        this.errMessage = '';
                        this.errStatus = '';
                    }
                })
            }
        }
    }
</script>

运行结果
cmd-markdown-logo
cmd-markdown-logo

实现Form

  • App.vue
<K-form :model="model" :rules="rules">
<!-- 用户名 -->
<K-form-Item label="用户名" prop="username">
  <K-input v-model="model.username"></K-input>
</K-form-Item>
<!-- 密码 -->
<K-form-Item label="密码" prop="password">
  <K-input v-model="model.password" type=""></K-input>
</K-form-Item>
</K-form>

import KInput from './components/input'
import KFormItem from './components/FormItem'
import KForm from './components/Form'
export default {
  name: 'app',
  components: {
    KInput,
    KFormItem,
    KForm
  },
  • components/Form.vue
<template>
    <div>
        <form>
            <slot>

            </slot>
        </form>
    </div>
</template>
<script>
    export default{
        provide(){
            return {
                KForm: this
            }
        },
        props:{
            model:{
                type: Object,
                required: true
            },
            rules:{
                type: Object
            }
        }
    }
</script>

运行效果
cmd-markdown-logo

代码地址

https://github.com/shifengming/element-form

最后

如果本文对你有帮助得话,给本文点个赞❤️❤️❤️

欢迎大家加入,一起学习前端,共同进步!
cmd-markdown-logo
cmd-markdown-logo

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Element UI ,要实现下拉树组件,可以使用 `el-cascader` 组件和 `el-tree` 组件结合使用。 首先,需要引入 `el-cascader` 和 `el-tree` 组件: ```js import { Cascader, Tree } from 'element-ui'; ``` 然后,在你的 Vue 组件使用 `el-cascader` 组件作为下拉框,同时将 `el-tree` 组件作为 `el-cascader` 的展开内容。例如: ```html <template> <el-cascader v-model="selectedOptions" :options="options" :props="props" @change="handleCascaderChange" > <el-tree :data="treeData" :props="treeProps" node-key="id" accordion show-checkbox @check-change="handleTreeCheckChange" ></el-tree> </el-cascader> </template> ``` 在上述代码,`selectedOptions` 为选的下拉树的值,`options` 是下拉框的选项数据,`props` 定义了下拉框选项的显示方式。 `treeData` 是树形数据,`treeProps` 定义了树节点的属性。 接下来,在你的 Vue 组件的 `data` 定义相应的数据: ```js data() { return { selectedOptions: [], options: [], // 下拉框选项数据 treeData: [], // 树形数据 props: { label: 'label', // 下拉框选项显示的字段名 value: 'value' // 下拉框选项的值字段名 }, treeProps: { label: 'label', // 树节点显示的字段名 children: 'children' // 树节点的子节点字段名 } }; } ``` 最后,根据需求,可以在方法处理下拉框值的变化和树节点的勾选变化。例如: ```js methods: { handleCascaderChange(selectedOptions) { // 处理下拉框值的变化 }, handleTreeCheckChange(checkedNodes) { // 处理树节点的勾选变化 } } ``` 以上是使用 Element UI 实现下拉树组件的基本步骤,你可以根据具体的需求进行进一步的样式和功能定制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值