关键词

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

下面是针对“Vue模仿ElementUI的form表单实例代码”的详细攻略。

1. 概述

在实际的开发中,我们经常需要使用到表单组件。在Vue框架中,我们可以借助ElementUI提供的form表单组件快速开发表单。但是,有时候我们想要自己定制化一些表单组件,或者ElementUI提供的表单组件不够满足我们的需求时,就需要自己动手写表单组件了。

本攻略就是从零开始教你如何使用Vue模仿ElementUI的form表单组件,并且提供两条示例说明。

2. 步骤

2.1 创建表单组件

首先,我们需要创建一个表单组件。在这个组件中,我们需要使用Vue的双向数据绑定实现数据输入输出,并且要使用到ElementUI提供的input、select等常用表单元素。

以下是一个简单的表单组件示例代码:

<template>
  <div>
    <el-form :model="form" :rules="rules" ref="form" label-width="80px" class="demo-ruleForm">
      <el-form-item label="用户名" prop="name">
        <el-input v-model="form.name"></el-input>
      </el-form-item>
      <el-form-item label="密码" prop="password">
        <el-input type="password" v-model="form.password"></el-input>
      </el-form-item>
      <el-form-item label="性别" prop="gender">
        <el-select v-model="form.gender">
          <el-option label="男" value="male"></el-option>
          <el-option label="女" value="female"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="submitForm('form')">提交</el-button>
        <el-button @click="resetForm('form')">重置</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
export default {
  data() {
    return {
      form: {
        name: '',
        password: '',
        gender: ''
      },
      rules: {
        name: [
          { required: true, message: '请输入用户名', trigger: 'blur' },
          { min: 3, max: 5, message: '长度在3到5个字符', trigger: 'blur' }
        ],
        password: [
          { required: true, message: '请输入密码', trigger: 'blur' },
          { min: 6, max: 10, message: '长度在6到10个字符', trigger: 'blur' }
        ],
        gender: [
          { required: true, message: '请选择性别', trigger: 'blur' }
        ]
      }
    };
  },
  methods: {
    submitForm(formName) {
      this.$refs[formName].validate(valid => {
        if (valid) {
          this.$emit('submit', this.form);
        } else {
          console.log('error submit');
          return false;
        }
      });
    },
    resetForm(formName) {
      this.$refs[formName].resetFields();
    }
  }
};
</script>

这个表单组件中包含了三个表单元素:用户名、密码和性别,同时也包含了表单验证的规则和提交函数。

2.2 使用表单组件

使用表单组件的方式非常简单,只需要在需要使用表单的地方注册表单组件并且传递提交函数即可。以下是一个简单的示例:

<template>
  <div>
    <my-form @submit="onSubmit"></my-form>
  </div>
</template>

<script>
import MyForm from './MyForm.vue';

export default {
  components: {
    MyForm
  },
  methods: {
    onSubmit(form) {
      console.log(form);
    }
  }
};
</script>

这个示例中,我们注册了一个名为MyForm的表单组件,并且在组件中传递了一个submit函数。在主组件中,我们只需要使用MyForm组件即可,同时在submit函数中输出表单提交数据。

2.3 定制化

我们已经成功地模仿了ElementUI的form表单组件,并且实现了非常简单的表单功能。但是,这个表单组件还远远不够强大,我们需要继续对其进行定制化。

以下是两个示例,展示了如何对表单组件进行进一步的定制化。

2.3.1 使用插槽自定义表单元素

有时候,我们需要在表单中显示一些特殊的元素,而这些元素并不是普通的表单元素(如input、select等)。此时,我们可以借助Vue提供的插槽功能实现自定义元素的显示。

以下是修改后的表单组件,其中我们添加了一个slot插槽:

<template>
  <div>
    <el-form :model="form" :rules="rules" ref="form" label-width="80px" class="demo-ruleForm">
      <el-form-item label="用户名" prop="name">
        <el-input v-model="form.name"></el-input>
      </el-form-item>
      <el-form-item label="密码" prop="password">
        <el-input type="password" v-model="form.password"></el-input>
      </el-form-item>
      <el-form-item label="性别" prop="gender">
        <el-select v-model="form.gender">
          <el-option label="男" value="male"></el-option>
          <el-option label="女" value="female"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="自定义插槽">
        <slot></slot>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="submitForm('form')">提交</el-button>
        <el-button @click="resetForm('form')">重置</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>

修改后的主组件如下所示,我们在使用表单组件时,通过插槽传递了一个自定义的段落元素:

<template>
  <div>
    <my-form @submit="onSubmit">
      <p>这是自定义插槽</p>
    </my-form>
  </div>
</template>

<script>
import MyForm from './MyForm.vue';

export default {
  components: {
    MyForm
  },
  methods: {
    onSubmit(form) {
      console.log(form);
    }
  }
};
</script>

2.3.2 提供不同主题的表单

有时候,我们需要为不同的页面提供不同主题的表单,例如“深色主题”和“浅色主题”。此时,我们需要根据不同的需求为表单组件添加主题选择的功能。

以下是修改后的表单组件,其中我们添加了一个theme属性,用于控制表单的主题:

<template>
  <div :class="[theme]">
    <el-form :model="form" :rules="rules" ref="form" label-width="80px" class="demo-ruleForm">
      <el-form-item label="用户名" prop="name">
        <el-input v-model="form.name"></el-input>
      </el-form-item>
      <el-form-item label="密码" prop="password">
        <el-input type="password" v-model="form.password"></el-input>
      </el-form-item>
      <el-form-item label="性别" prop="gender">
        <el-select v-model="form.gender">
          <el-option label="男" value="male"></el-option>
          <el-option label="女" value="female"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="submitForm('form')">提交</el-button>
        <el-button @click="resetForm('form')">重置</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
export default {
  props: {
    theme: {
      type: String,
      default: 'light'
    }
  },
  data() {
    return {
      form: {
        name: '',
        password: '',
        gender: ''
      },
      rules: {
        name: [
          { required: true, message: '请输入用户名', trigger: 'blur' },
          { min: 3, max: 5, message: '长度在3到5个字符', trigger: 'blur' }
        ],
        password: [
          { required: true, message: '请输入密码', trigger: 'blur' },
          { min: 6, max: 10, message: '长度在6到10个字符', trigger: 'blur' }
        ],
        gender: [
          { required: true, message: '请选择性别', trigger: 'blur' }
        ]
      }
    };
  },
  methods: {
    submitForm(formName) {
      this.$refs[formName].validate(valid => {
        if (valid) {
          this.$emit('submit', this.form);
        } else {
          console.log('error submit');
          return false;
        }
      });
    },
    resetForm(formName) {
      this.$refs[formName].resetFields();
    }
  }
};
</script>

修改后的主组件如下所示,我们为表单组件传递了一个theme属性,用于控制表单的颜色主题。我们在点击按钮时,动态地改变表单组件的主题:

<template>
  <div>
    <my-form :theme="theme" @submit="onSubmit"></my-form>
    <el-button @click="changeTheme">切换主题</el-button>
  </div>
</template>

<script>
import MyForm from './MyForm.vue';

export default {
  components: {
    MyForm
  },
  data() {
    return {
      theme: 'light'
    };
  },
  methods: {
    changeTheme() {
      this.theme = this.theme === 'light' ? 'dark' : 'light';
    },
    onSubmit(form) {
      console.log(form);
    }
  }
};
</script>

<style>
  .dark {
    background-color: #222;
    color: #fff;
  }
</style>

3. 结论

通过以上攻略,我们成功地实现了一个模仿ElementUI的form表单组件,并且实现了对表单组件的定制化。

同时,我们也通过两个示例,展示了如何使用插槽自定义表单元素和提供不同主题的表单。

希望这篇攻略对你有所帮助!

本文链接:http://task.lmcjl.com/news/1263.html

展开阅读全文