• vue element 弹窗 新增修改 同一个Dialog展示


    1.确定新增以及修改事件

    注意:修改的时候需要把当前这一行的数据传递过去,做回显展示,并需要传递一个action标记,来判断是修改还是新增,默认不传为新增。

    2.新增修改事件激活

    注意:新增对象我们传递的两个参数,第一个是空对象,第二个为新增标记。并去触发修改事件。从图中我们可以看到新增的时候我们传的是空对象和新增标记,修改时我们传的是当前点击的这一条数据和修改标记。

    3.解释修改事件内的this.addOrEditDialog对象

    首先这些数据是我们使用弹窗组件,在data定义的

    其次,弹窗组件的使用

    我们定义一个自定义组件,组件的事件在下面解释。

    把刚刚我们定义的data的数据绑定给自定义组件。

    4.弹窗自定义组件

    首先我们要定义一个props来接受父组件传递过来的数据(如下图所示)

    5.传递数据的使用

    如下图所示,首先我们初始化数据的时候,把上面props中detail中的当前点击的这一行数据拿到,默认赋值都为空,判断

    传递过来的类型action,是新增的话,选用默认值,表单显示为空,如果点击的是修改,将数据赋值过去进行回显。

    6.自定义组件dialog参数解释

    如下图展示,visible是我们props传递过来的,是否展示此弹窗,默认不展示,title是标题,根据action标记来判断

    来展示新增或者修改,@close是弹窗关闭事件,通过this.$emit来向父组件传递事件。

    7.弹窗组件向父组件传递关闭保存事件

    如下图所示,关闭和保存事件都需要把事件名称传递出去,注意,保存的时候,需要把表单内的信息也要传递出去。

    8.接收传递的事件和参数

    如下图所示,弹窗通过save传递的事件绑定新的事件,接收的参数通过param打印出来,以供我们使用。

    通过action来判断点击的是新增的保存,还是修改的保存。

    部分代码

     <!-- 编辑|新增 -->
        <DetailDialog
          v-if="addOrEditDialog.visible"
          :visible="addOrEditDialog.visible"
          :title="addOrEditDialog.title"
          :detail="addOrEditDialog.item"
          :action="addOrEditDialog.action"
          @close="closeAddOrEditDialog"
          @save="saveItem"
        />
    
    
          // 编辑|新增 弹框
          addOrEditDialog: {
            visible: false,
            title: '编辑|新增',
            item: {},
            action: 'add'
          },
    
      addItem() {
          console.log('添加')
          this.showAddOrEditDialog({}, 'add')
        },
         //关闭弹窗
        closeAddOrEditDialog() {
          this.addOrEditDialog.visible = false
        },
        /**
         * # 打开编辑窗口 - 新增活编辑
         */
                //吧当前数据 和action 标记传递过去
            <el-button
                      v-if="scope.row.orderStatus===0||scope.row.orderStatus===1"
                      type="text"
                      @click="showAddOrEditDialog(scope.row, 'edit')"
            >
        showAddOrEditDialog(item, action = 'add') {
          this.addOrEditDialog = {
            action,
            detail: item,
            item,
            visible: true,
            title: action === 'add' ? '创建工单' : '编辑'
          }
        },
        saveItem(param) {
          console.log('add edit', param)
          const {
            action = 'add',
            item
          } = this.addOrEditDialog
          switch (action) {
            case 'add':
              addWorkorder(param).then(res => {
                this.$message.success('添加成功!')
                this.closeAddOrEditDialog()
                this.getList()
              })
              break
            case 'edit':
              changeWorkorder({ orderId: item.orderId, ...param }).then(res => {
                this.$message.success('编辑成功!')
                this.closeAddOrEditDialog()
                this.getList()
              })
              break
            default:
              break
          }
        },
    

    dialog组件

    <template>
      <div class="dialog-page">
        <el-dialog
          :close-on-click-modal="false"
          width="665px"
          :visible="visible"
          :title="title"
          @close="close"
        >
          <el-form ref="editForm" :model="editForm" label-width="80px">
            <el-row>
              <el-col :span="4"><div class="grid-content">  <el-form-item label="申请资源 :" /></div></el-col>
              <el-col
                :span="10"
              ><div class="grid-content">  <el-form-item label="模板" align="right" prop="templateId">
                <SelectPackage v-model="editForm.templateId" :selected-now="selectPackagNow" />
              </el-form-item></div></el-col>
              <el-col
                :span="10"
              ><div class="grid-content">
                <el-form-item label="镜像" prop="imageId">
                  <SelectIso v-model="editForm.imageId" :selected-now="selectIsoNow" />
                </el-form-item></div></el-col>
            </el-row>
            <!--   <el-row>
              <el-col :span="4"><div class="grid-content">
              <el-form-item label="" /></div></el-col>
              <el-col
                :span="10"
              ><div class="grid-content">  <el-form-item label="网络" align="right">
              </el-form-item>
              </div></el-col>
              <el-col
                :span="10"
              ><div class="grid-content">  <el-form-item label="IP" align="right">
                <el-input v-model="editForm.name" clearable placeholder="IP" />
              </el-form-item></div></el-col>
            </el-row> -->
    
            <!-- 工单名称 -->
            <el-form-item label="工单名称" prop="orderName">
              <el-input v-model="editForm.orderName" clearable placeholder="工单名称" />
            </el-form-item>
            <!-- 申请理由 -->
            <el-form-item label="申请理由" prop="orderDescribe">
              <el-input v-model="editForm.orderDescribe" type="textarea" clearable placeholder="申请理由" />
            </el-form-item>
          </el-form>
    
          <div slot="footer" class="dialog-footer">
            <el-button type="info" @click="close">取 消</el-button>
            <el-button type="primary" @click="save">确 认</el-button>
          </div>
        </el-dialog>
      </div>
    </template>
    <script>
    
    import SelectIso from './SelectIso'
    import SelectPackage from './SelectPackage'
    export default {
      components: {
        SelectIso,
        SelectPackage
      },
      props: {
        visible: {
          default: false,
          required: true,
          type: Boolean
        },
        title: {
          default: '创建工单',
          type: String
        },
        detail: {
          type: Object,
          default() {
            return {}
          }
        },
        action: {
          type: String,
          default: 'add'
        }
      },
      data() {
        return {
          rules,
          height: 100,
          editForm: {
            orderDescribe: null,
            orderName: null,
            adUniqueToken: null,
            imageId: null,
            templateId: null
          },
          // 已选中的 镜像
          selectIsoNow: null,
          // 已选中的模板
          selectPackagNow: null
        }
      },
    
      created() {
        this.initData()
      },
      methods: {
        /**
         * @method initData
         * @description 初始化数据
         */
        initData() {
          this.initDict()
          this.initForm()
        },
        /**
         * # 初始化字典
         */
        initDict() {},
        initForm() {
          // 取出这一行的数据里的数据,填入表单中显示
          const {
            orderDescribe = null,
            orderName = null,
            imageId = null,
            image = null,
            templateId = null,
            template = null
          } =
            this.detail || {}
          switch (this.action) {
            case 'add':
              break
            case 'edit':
              this.editForm = {
                orderDescribe,
                orderName,
                imageId,
                templateId
              }
              break
            default:
              break
          }
        },
        close() {
          this.$emit('close')
        },
        save() {
          console.log('save', this.editForm)
          this.$refs['editForm'].validate((valid) => {
            if (valid) {
              this.$emit('save', {
                ...this.editForm
              })
            }
          })
        }
      }
    }
    </script>
    <style lang="scss">
    .dialog-page {
     .el-input--suffix .el-input__inner {
        /* background-color: red; */
       padding-right: 30px;
        100%;
        //  500px;
        height: 36px;
         background: #f7f7fa;
        border: 1px solid #d7d7d9;
        border-radius: 5px;
     }
    
      .el-form-item__label {
        padding: 0 2px;
        text-align: center;
      }
    }
    
    .el-row {
      // margin-bottom: 20px;
      margin-bottom: 10px;
      &:last-child {
        margin-bottom: 0;
      }
    }
    .el-col {
      border-radius: 4px;
    }
    
    .grid-content {
      border-radius: 4px;
      min-height: 36px;
    
    }
    .row-bg {
      padding: 10px 0;
      background-color: #f9fafc;
    }
    </style>
    
    
    
  • 相关阅读:
    Linux/shell: remove adjacent similar patterns
    Calculate difference between consecutive data points in a column from a file
    awk
    自定义Cordova插件(基础篇)
    npm init 命令生成package.json文件
    自定义Cordova插件详解
    Android 回退键监听
    Cordova结合Vue学习Camera
    解决悬浮的<header>、<footer>遮挡内容的处理技巧
    npm 是干什么的
  • 原文地址:https://www.cnblogs.com/loveliang/p/14134913.html
Copyright © 2020-2023  润新知