对el-dialog弹窗组件的优雅封装和传值

这篇文章我要解决两个重点问题:
第一、列表中点击【编辑】弹窗然后进行优雅的传值并且可以修改;
第二、我要用.sync修饰符实现隐藏显示弹窗的属性双向绑定,隐藏(关闭)弹窗的时候并不一定非要在父组件里改变属性,从而在代码实现层面上看更优雅;

先创建组件小区编辑弹窗AreaEditDialog.vue组件,也就是子组件,直接上代码如下:

<template>
  <el-dialog
    title="修改小区信息"
    :visible.sync="dialogVisible"
    width="30%">
    <el-form :model="editArea2" ref="areaForm">
      <el-form-item label="小区名称:">
        <el-input v-model="editArea2.name" class="input-width"></el-input>
      </el-form-item>
    </el-form>
    <span slot="footer" class="dialog-footer">
      <el-button @click="handleCancel">取 消</el-button>
      <el-button type="primary" @click="handleConfirm">确 定</el-button>
    </span>
  </el-dialog>
</template>

<script>

export default {
  props: {
    editArea: {
      type: Object,
      default: () => Object.assign({},{name:'',id:0})
    },
    show: {
      type: Boolean,
      default: false
    }
  },
  data(){
    return {
      editArea2: Object.assign({},this.editArea)
    }
  },
  computed: {
    dialogVisible: {
      get(){
        return this.show
      },
      set(val){
        this.$emit('update:show',val)
      }
    }
  },
  watch: {
    editArea(val){
      let temp = this.$lodash.cloneDeep(val);
      this.editArea2 = temp;
    }
  },
  methods: {
    handleCancel(){
      this.dialogVisible = false
      this.$emit('cancel')
    },
    handleConfirm(){
      this.$emit('confirm',this.editArea2)
    }
  }
}
</script>

<style lang="scss" scoped>
.el-dialog__footer {
  text-align: center !important;
}
</style>

父组件中调用很简单,直接拷贝过来:

<AreaEditDialog
   :show.sync="dialogVisible"
   :editArea="editArea"
   @confirm="handleConfirm">
</AreaEditDialog>

当然了,我定义了还定义了两个属性和一个方法,我也拷贝过来

import AreaEditDialog from './components/AreaEditDialog.vue';
const defaultArea = {
   name:'',
   id:0
};
export default {
    components:{
      AreaEditDialog
    },
    data() {
      return {
        dialogVisible:false,
        editArea:Object.assign({},defaultArea)
      }
    },
    methods:{
      handleUpdate(index, row) {
        this.dialogVisible = true;
        this.editArea = row;
      },
    }
}

为方便以后查看,在此做个记录;也方便他人做参考,有引用三方库或不清晰的地方,可随时与我交流!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容