el-form-item 实现时间选择器添加多个

本文展示了如何在Vue.js项目中,基于ElementUI库实现el-date-picker时间范围选择器的动态添加和删除功能。代码示例详细说明了如何初始化数据,设置必填验证规则,以及监听数据变化来更新表单内容。同时,提供了添加和删除操作的方法,确保至少保留一个时间范围选择器。

1.实现效果

2.代码逻辑

此段代码是建立在Elemet ui 中的el-date-picker时间控件上实现的


<template>
  <div class="back">
    <el-form ref="form" :rules="rules" :model="rules">
      <el-form-item label="请选择时间范围" :required="true" :rules="rules" class="form-y" prop="subscribe_time">
        <div v-for="(item, index) in subscribe_time" :key="index" style="display: flex; align-items: center ;margin-top: 10px;">
          <el-form-item>
            <el-date-picker v-model="item.time" value-format="yyyy-MM-dd" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"> </el-date-picker>
          </el-form-item>
          <i class="el-icon-remove-outline" style="color: red; font-size: 20px; margin: 0 5px" @click="deletes(item, index)"></i>
        </div>
        <span style="color: #3d7fff; cursor: pointer" @click="add" @change="$forceUpdate()">+ 添加预约时间</span>
      </el-form-item>
    </el-form>
  </div>
</template>

由于el-date-picker需要el-form进行包裹所以需要进行ref的绑定

在form中设置一个初始的subscribe_time空数组

这边根据需求来给他进行rules必填判断

还需要给时间选择器一个默认值


data () {
    return {
        // 初始的form
        form: {
            subscribe_time: []
        },
        // 必填判断
        rules: {
            subscribe_time: [
                { required: true, message: '请选择报名时间', trigger: 'change' }
            ]
        },
        // 时间选择默认值
        subscribe_time: [{ time: '' }]
    }
},

初始值设置完成就开始进行逻辑部分

请在methods中添加以下事件

在第一段代码块中的Span中设置的一个点击事件来进行新添加一个el-date-picker组件

在Span行内Css中的cursor属性是改变指针指向状态的

pointer便是把指针换为小手


// 添加预约时间
add () {
    this.subscribe_time.push({
        time: ''
    })
},

以下代码块是删除的逻辑

判断是否是最后一个el-date-picker组件

如果是就给他提示至少保留一个时间段

这边传入的两个形参分别为

_item删除的对象

index被删除的下标是多少

然后用数组方法splice来进行删除操作


deletes (_item, index) {
    if (this.subscribe_time.length <= 1) {
        this.$message({
            message: '至少保留一个时间段',
            type: 'warning'
        })
        /// 如果只有一个框则不可以删除
        return false
    }
    this.subscribe_time.splice(index, 1) // 删除数组中对应的数据也就是将这个位置的框删除
    this.form.subscribe_time.splice(index, 1) // 删除数组中对应的数据也就是将这个位置的框删除
}

以下代码块需要写在watch监听方法中

在监听到subscribe_time数据改变时就会触发里面的代码逻辑


// 监听选择时间
subscribe_time: {
    handler (newVal) {
        // 创建一个新的数组来装循环出来的数组
        let contentItem = []
        // 把默认的from数组变为空来进行下面的操作
        this.form.subscribe_time = []
        // 开始循环时间数组
        newVal.forEach((v) => {
            if (v.time.length > 0) {
                // 把time中的值循环出来
                contentItem = v.time
                // push进新的数组中
                this.form.subscribe_time.push(contentItem)
            }
        })
    },
    immediate: true,
    deep: true
}

以上代码直接复制即可使用

如果需求有出入 自行修改一下即可

完整代码块在以下


<template>
  <div class="back">
    <el-form ref="form" :rules="rules" :model="rules">
      <el-form-item label="请选择时间范围" :required="true" :rules="rules" class="form-y" prop="subscribe_time">
        <div v-for="(item, index) in subscribe_time" :key="index" style="display: flex; align-items: center ;margin-top: 10px;">
          <el-form-item>
            <el-date-picker v-model="item.time" value-format="yyyy-MM-dd" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"> </el-date-picker>
          </el-form-item>
          <i class="el-icon-remove-outline" style="color: red; font-size: 20px; margin: 0 5px" @click="deletes(item, index)"></i>
        </div>
        <span style="color: #3d7fff; cursor: pointer" @click="add" @change="$forceUpdate()">+ 添加预约时间</span>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
export default {
  data () {
    return {
      form: {
        subscribe_time: []
      },
      rules: {
        subscribe_time: [
          { required: true, message: '请选择报名时间', trigger: 'change' }
        ]
      },
      // 时间选择默认值
      subscribe_time: [{ time: '' }]
    }
  },
  methods: {
    // 添加预约时间
    add () {
      this.subscribe_time.push({
        time: ''
      })
    },
    // 删除预约时间
    deletes (_item, index) {
      if (this.subscribe_time.length <= 1) {
        this.$message({
          message: '至少保留一个预约时间段',
          type: 'warning'
        })
        /// 如果只有一个框则不可以删除
        return false
      }
      this.subscribe_time.splice(index, 1) // 删除数组中对应的数据也就是将这个位置的框删除
      this.form.subscribe_time.splice(index, 1) // 删除数组中对应的数据也就是将这个位置的框删除
    }
  },
  watch: {
    subscribe_time: {
            handler (newVal) {
                // 创建一个新的数组来装循环出来的数组
                let contentItem = []
                // 把默认的from数组变为空来进行下面的操作
                this.form.subscribe_time = []
                // 开始循环时间数组
                newVal.forEach((v) => {
                    if (v.time.length > 0) {
                        // 把time中的值循环出来
                        contentItem = v.time
                        // push进新的数组中
                        this.form.subscribe_time.push(contentItem)
                    }
                })
            },
            immediate: true,
            deep: true
        }
    }
}
</script>
<style lang="less" scoped>
/deep/ .el-form-item__label{
  float: none !important;
}
</style>
<think>嗯,用户之前问过如何在Vue中让多个输入框左对齐,现在他们具体问的是关于多个el-form-item的左对齐问题。可能用户正在使用Element UI或者类似的组件库,遇到了表单元素右对齐的情况。需要回忆一下Element UI的默认样式,通常el-form-item的标签和输入框可能默认是右对齐或者有特定的布局方式。 首先,用户的需求是让多个el-form-item左对齐,可能包括标签和输入框的整体对齐方式。之前的回答中已经提到了使用label-position="left"来调整标签的位置,但用户可能还遇到内容部分(比如输入框)没有左对齐的情况。这时候需要考虑el-form-item内部的结构,可能内容区域默认是flex布局,并且使用flex-end对齐,导致输入框右对齐。 需要检查Element UI的文档,确认el-form-item的默认样式。例如,el-form-item__content类可能设置了display: flex和justify-content: flex-end,这样会导致内容右对齐。解决方法可能是覆盖这个样式,设置justify-content: flex-start。但需要注意样式作用域的问题,比如在Vue的单文件组件中使用scoped样式时,可能需要使用深度选择如::v-deep或/deep/来穿透作用域。 另外,用户可能没有正确设置label-width,导致标签和输入框的布局混乱。设置固定的label-width可以让标签和内容区域对齐更一致。同时,如果表单容本身没有足够的宽度,或者父容的布局影响,也可能导致el-form-item内部元素无法左对齐。需要确保表单容的宽度足够,并且没有其他布局干扰。 还可能用户在使用响应式布局时,不同屏幕尺寸下表现不同,需要添加媒体查询来调整样式。此外,如果用户自定义了el-input的样式,比如设置了宽度,可能会影响对齐,需要检查是否有冲突的样式设置。 总结可能的解决方案包括:设置el-form的label-position为left,调整el-form-item__content的justify-content为flex-start,使用深度选择覆盖组件库样式,设置固定的label-width,以及确保父容的布局正确。同时,提供代码示例和注意事项,比如样式优先级和浏览兼容性问题,帮助用户正确实现左对齐效果。</think>以下是针对 Element UI 中多个 `el-form-item` 实现左对齐的完整解决方案: --- ### 一、核心对齐方案 #### 1. 表单容设置 ```vue <template> <el-form :model="formData" label-position="left" <!-- 关键属性1:标签左对齐 --> label-width="80px" <!-- 关键属性2:固定标签宽度 --> class="custom-form" <!-- 自定义样式容 --> > <el-form-item label="用户名"> <el-input v-model="formData.username"></el-input> </el-form-item> <el-form-item label="手机号"> <el-input v-model="formData.phone"></el-input> </el-form-item> </el-form> </template> ``` #### 2. 关键CSS样式 ```css /* 深度覆盖组件库样式 */ .custom-form { width: 500px; /* 固定表单宽度 */ ::v-deep .el-form-item__content { display: flex !important; justify-content: flex-start !important; /* 强制内容左对齐 */ } ::v-deep .el-input__inner { text-align: left !important; /* 输入框文本左对齐 */ width: 220px !important; /* 固定输入框宽度 */ } } ``` --- ### 二、不同场景适配方案 #### 场景1:响应式布局 ```css @media (max-width: 768px) { .custom-form { width: 100% !important; ::v-deep .el-form-item__content { flex-wrap: wrap; } ::v-deep .el-input__inner { width: 100% !important; } } } ``` #### 场景2:多列布局 ```vue <el-form :inline="true" class="multi-col-form"> <el-form-item label="字段1"> <el-input></el-input> </el-form-item> <el-form-item label="字段2"> <el-input></el-input> </el-form-item> </el-form> <style> .multi-col-form { ::v-deep .el-form-item { margin-right: 40px; /* 列间距 */ display: inline-flex !important; align-items: flex-start; /* 顶部对齐 */ } } </style> ``` --- ### 三、高级配置技巧 #### 1. 动态标签宽度 ```vue <el-form :label-width="dynamicWidth + 'px'"> ``` #### 2. 验证状态保持对齐 ```css ::v-deep .el-form-item.is-error .el-input__inner { text-align: left !important; /* 错误状态保持左对齐 */ } ``` #### 3. 复合表单控件对齐 ```css ::v-deep .el-select, ::v-deep .el-date-editor { width: 100%; text-align: left !important; } ``` --- ### 四、完整示例代码 ```vue <template> <div class="form-container"> <el-form ref="form" :model="form" label-width="100px" label-position="left" class="demo-form" > <el-form-item label="姓名" prop="name"> <el-input v-model="form.name"></el-input> </el-form-item> <el-form-item label="地址" prop="address"> <el-input v-model="form.address"></el-input> </el-form-item> <el-form-item label="备注" prop="remark"> <el-input type="textarea" :rows="3" v-model="form.remark" class="left-align-textarea" ></el-input> </el-form-item> </el-form> </div> </template> <script> export default { data() { return { form: { name: '', address: '', remark: '' } } } } </script> <style scoped> .form-container { padding: 20px; background: #f8f9fa; } .demo-form { ::v-deep .el-form-item__content { display: flex !important; justify-content: flex-start !important; } ::v-deep .el-input__inner, ::v-deep .el-textarea__inner { text-align: left !important; width: 300px; } .left-align-textarea { ::v-deep textarea { resize: vertical !important; } } @media (max-width: 600px) { ::v-deep .el-input__inner { width: 100% !important; } } } </style> ``` --- ### 五、常见问题排查 1. **样式覆盖失效** - 检查是否使用 `::v-deep` 或 `/deep/` 穿透作用域 - 确认选择优先级是否高于组件库默认样式 2. **布局错位** ```css /* 添加调试边界线 */ ::v-deep .el-form-item { border: 1px dashed red; } ``` 3. **数字输入框右对齐** ```vue <el-input type="number" style="text-align: left; -moz-appearance: textfield" ></el-input> ``` --- ### 六、最佳实践建议 1. **统一布局方案** ```js // 全局样式配置 (在main.js) import { ElForm } from 'element-plus' app.use(ElForm, { labelPosition: 'left', labelWidth: '80px' }) ``` 2. **设计系统整合** ```scss // SCSS变量覆盖 $--form-label-font-size: 14px; $--input-font-color: #333; ``` 通过以上配置,可确保 `el-form-item` 在不同场景下保持稳定的左对齐效果。建议结合浏览开发者工具实时调试,观察样式计算结果的最终优先级。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值