在做项目中再次遇到问题

1.问题环境:vue+iview

2.问题描述:将Modal对话框封装成一个子组件,在父组件引用,当对话框打开然后关闭,再次打开时对话框无法正常打开;

!!!3.解决:

搜索了好多例子,有的说props属性接收的值在子组件是无法改变的,因为v-model是双向绑定当对话框状态发生该变,props的值也会改变,这样会导致报错,但是实测过后发现并无报错。

排查问题后发现原来是在父组件给子组件传值是赋值发生了问题

父组件:

这个是在render函数里面写的,h,和params,用过的应该知道

 on: {
                    click: () => {
                      
                      this.dataList = params.row;
                      this.dataList["type"] = "wm";
                      this.dataList["modal1"] = true;
                      // console.warn(this.dataList);
                    },
                  },
data(){
return{

 dataList: {
        modal1: false,
        type: "",
        id: "",
        phoneNo: "",
        password: "",
        role: "",
        wtype: "",
        typeName: "",
        sysName: "",
        moduleCode: "",
        buttonName: "",
        iconUrl: "",
        linkUrl: "",
        orderNo: "",
        serviceUrl: "",
        fileUrl: "",
        extendsJson: "",
        showFlag: "",
        clientId: "",
        clientCode: "",
        moduleType: "",
      },


}}

这是data里面的dataList,也是将要传给子组件的值,这样的赋值方式是不对的,因为会导致dataList.modal1缺失,虽然后面给dataList添加了一个key:modal1,val:true,但是当对话框关闭后并未触发props,导致对话框状态一直为True,冲突之后肯定就打不开了,最神奇的是控制台console竟然没有报错

 后台使用watch监听才发现,对话框关闭后v-model根本没有触发,错误的缘由就在于赋值,所以想到了用对象合并,因为dataList 和params.row都是对象,只需要合并去重,即可,

 on: {
                    click: () => {
                      Object.assign(this.dataList, params.row);
                      this.dataList.modal1 = true;
                      
                    },
                  },

然后再给modal1赋值即可,问题解决!大佬勿喷

Logo

前往低代码交流专区

更多推荐