element-ui实现一个动态布局的对话框

本文介绍了如何使用Element-UI封装一个动态布局的对话框组件,通过配置JSON实现不同元素的组合,并解决了元素数量多时的布局问题。文章详细讲解了组件的逻辑判断,包括元素数量超过4个时自动调整为两列布局,以及如何处理独占一行的元素,同时提供了代码示例和使用方法。

 我把组件上传到npm了,具体使用方法请看:https://gitee.com/zengyanfang/tablelist-way/blob/master/README.md#%E5%8F%82%E6%95%B0

前言:在工作中有各种各样的对话框,最多就是填写信息这些的,一般这样的内容都是el-input输入框,el-select选择框等等之内的,这时我们就可以封装成一个组件,想要什么内容就传一个json配置,像其他组件那样,这样可以极大的简化开发,不至于每次都要去写el-input这些细微根节的东西,那问题来了

问题:就是布局,元素少还好,要是多的话,比如有几个输入框,几个选择框,又有几个多选框等等,那就是一排排的排下来难看死了,

解决:我自己琢磨了好久,改进了好多遍,终于是搞出来一个这样的,判断当元素也就是输入框选择框这些加起来大于4个的话就改为一行两个,如图 

 当四个的时候

当大于四个的时候

虽然我觉得这样也没有多好看,但比一行一个的好看多了,没办法,封装组件就是这样,细节很难各个把控到位

 有些东西就是那么长,比如这个待缴费金额,光字就五个,如果它所在行搞成两个的话,就太狭小了,所以我除了组件灵活布局外,参数还可以配置是否独占一行,所以当自己可以设置独占一行的时候问题就来了,没有外界的干扰下,我组件布局的逻辑是,元素大于4个时就添加一个class到根元素上,设置下面元素的宽度为50%,display为inline-block,再判断元素个数是否为奇数,为基数最后一个就独占一行,但是我给某个元素设置了独占一行的属性,那它的判断就不准确了,所以最后一个就不会独占一行了,而且设置的独占一行的元素在中间的话还会影响上面的元素,因为如果设置的独占一行的元素是偶数时说明它上面还有一个宽度为50%的元素,所以这个时候又要判断,总之至少要三种判断,话不多说,贴代码

组件代码

<template>
  <div _wid="wdialog">
    <el-dialog :fullscreen="fullscreen || fullscreen1" :class="{mobile:fullscreen,noMobile:!fullscreen}"
      :visible.sync="openSenior1">
      <template slot="title">
        <slot name="title">
        </slot>
        <template v-if="!fullscreen">
          <i v-show="!fullscreen1" class="el-icon-full-screen full" @click="fullscreen1=true"></i>
          <svg-icon icon-class="qxpp" v-show="fullscreen1" class="qxqp full" @click="fullscreen1=false"></svg-icon>
        </template>
      </template>
      <el-form v-if="options1" :validate-on-rule-change="false" :model="content"
        :class="[options1.length<=4?'senior1':'senior2']" :rules="rules" ref="formSenior">
        <el-form-item v-for="(item,index) in options1" :class="{w100:item.yes}" :label="item.label" :prop="item.name">
          <repeat :content="content" v-model="content[item.name]" :item="item"></repeat>
        </el-form-item>
        <el-form-item label="" class="footer">
          <el-button type="primary" @click="submit1('formSenior')">{
  
  {confrimLabel}}</el-button>
        </el-form-item>
      </el-form>
      <slot></slot>
    </el-dialog>
  </div>
</template>

<script>
  import repeat from "@/components/topOperation/components/repeat.vue"
  import {
    deepClone,
    judgeType
  } from "@/utils/deepClone.js"
  export default {
    name: "dialogA",
    props: {
      options: {
        type: Array
      },
      rules: {
        type: Object
      },
      openSenior: {
        type: Boolean,
        default: false
      },
      submit: {
        type: Function
      },
      confrimLabel: {
        type: String
      },
     
### 使用 Vue2 和 Element-UI 创建聊天对话框 为了创建基于 Vue2 和 Element-UI 的聊天对话框,可以遵循以下方法: #### 项目初始化与配置 进入已创建的项目目录并安装 `element-ui` 库。 ```bash cd project_name npm i element-ui -S ``` 随后,在项目的入口文件(通常是 main.js 或 app.js)中引入 Element-UI 及其样式,并注册为全局组件[^1]。 ```javascript // 导入整个组件库及其默认主题样式表 import ElementUI from 'element-ui'; import 'element-ui/lib/theme-chalk/index.css'; Vue.use(ElementUI); ``` #### 构建聊天界面布局 利用 Element-UI 提供的基础组件来构建聊天窗口结构。下面是一个简单的 HTML 结构示例,用于展示消息列表以及输入区域。 ```html <template> <div class="chat-container"> <!-- 消息显示区 --> <el-scrollbar style="height:80%;"> <ul class="message-list"> <li v-for="(msg, index) in messages" :key="index">{{ msg }}</li> </ul> </el-scrollbar> <!-- 输入框和发送按钮 --> <footer class="input-area"> <el-input type="textarea" rows="3" placeholder="请输入内容..." v-model="newMessage"></el-input> <el-button @click="sendMessage">发送</el-button> </footer> </div> </template> ``` 此模板定义了一个包含滚动条的消息列表容器 (`el-scrollbar`) 和底部固定位置的文本域加按钮组合(`el-input`, `el-button`)作为用户的输入工具栏。 #### 添加交互逻辑 通过 Vue 实例中的 data 属性管理状态变量如 `messages`(存储所有历史记录),并通过 methods 定义事件处理器比如点击“发送”时触发的方法 `sendMessage()` 来更新这些数据。 ```javascript export default { name: 'ChatBox', data() { return { newMessage: '', // 用户正在编辑的新消息 messages: [] // 已接收/发出的历史消息数组 } }, methods: { sendMessage() { if (this.newMessage.trim()) { // 非空验证 this.messages.push(this.newMessage); // 将新消息加入到消息队列里 this.newMessage = ''; // 清除当前输入框的内容 } } } } ``` 上述代码片段展示了如何处理用户提交的信息并将它们添加至页面上呈现给其他参与者查看[^2]。 #### 样式美化 最后可以根据实际需求调整 CSS 样式使聊天室更加美观友好。这里仅提供基础样式的建议: ```css .chat-container { display: flex; flex-direction: column; height: 100vh; /* 占满屏幕高度 */ } .message-list li { padding: .5em; border-bottom: solid 1px #ddd; } .input-area { margin-top: auto; /* 紧贴父级底部 */ background-color: white; box-shadow: inset 0 0 5px rgba(0, 0, 0, .1); } ``` 以上就是使用 Vue2 加上 Element-UI 组件快速搭建一个简易聊天系统的指南。当然这只是一个起点,真实的应用可能还需要考虑更多功能特性和服务端支持等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值