vue3 在弹窗中使用el-form表单编辑回显问题

问题描述

在使用el-dialog嵌套el-form是,点击添加数据没有问题,点击修改数据时,el-form回显不出来。

html代码

<el-dialog :title="form.id?'修改材料':'新增材料'" v-model="show" width="50%" :before-close="handleClose">
    <el-form ref="form" :model="form" label-width="80px">
      <el-form-item label="材料名称" prop="name">
        <el-input v-model="form.name" placeholder="请输入"></el-input>
      </el-form-item>
       // .... 其它数据
    </el-form>
    <template #footer>
      <span class="dialog-footer">
        <el-button size="mini" type="primary" @click="show = false">确 定</el-button>
      </span>
    </template>
  </el-dialog>

js代码

 export default defineComponent({
  props: {
    visible: {
      type: Boolean,
      default: false,
    },
    dialogData: {
      type: Object,
      default: () => { }
    }
  },
  emits: ['update:visible'],
  setup(props, context) {
    const state = reactive({
      show: false,
      form: {
        name: '',
        // ...
      }
    })
 
   // ...

    watch(() => props.dialogData, val => {
      state.form = { ...val }
      console.log(state.form) // 此处打印显示 form有值 但是无法回显
    }, { deep: true })
    
    // ...
   
    return {
      ...toRefs(state),
    }
  },
})

尝试各种解决办法

1、怀疑是生命周期渲染问题 ,添加nextTick

     nextTick(()=>{
       state.form = { ...val }
       console.log(state.form) // 打印结果没有问题,还是无法回显
     })

2、在el-dialog 的open回调函数中赋值,问题也是一样。
打印结果发现是一个对象 包含了el-form的所有属性,意识是字段名冲突了,检查字段名没有问题。

3、再一次翻了一下vue3官网,发现了以前没有理解的一点。

 // 将响应式对象转换为普通对象,其中结果对象的每个 property 都是指向原始对象相应 property 的ref。
 // 以前只是图方便使用toRefs,将声明的属性转化成类似于vue2的方式。
 
 const state = reactive({
   foo: 1,
   bar: 2
 })

 const stateAsRefs = toRefs(state)
 /*
 Type of stateAsRefs:

 {
   foo: Ref<number>,
   bar: Ref<number>
 }
*/

// ref 和 原始property “链接”
 state.foo++
 console.log(stateAsRefs.foo.value) // 2

 stateAsRefs.foo.value++
 console.log(state.foo) // 3
 

修改

export default defineComponent({
 props: {
   visible: {
     type: Boolean,
     default: false,
   },
   dialogData: {
     type: Object,
     default: () => { }
   }
 },
 emits: ['update:visible'],
 setup(props, context) {
   const state = reactive({
     show: false,
     form: {
       name: '',
       // ...
     }
   })

  // ...

   watch(() => props.dialogData, val => {
     state.form = { ...val }
     console.log(state.form) // 此处打印显示 form有值 但是无法回显
   }, { deep: true })
   
   // ...
  
   return {
     ...toRefs(state), // 相当于显示的声明了 const form = ref()
   // 由于el-form声明了ref="form",导致state中声明的form被覆盖,修改ref="form1",问题解决
   }
 },
})

感受

多看文档!!!

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 要实现el-form表单的数据回显,可以使用v-model指令将表单的与数据对象进行双向绑定。在获取到需要回显的数据后,将数据对象的属性设置为需要回显,表单会自动更新显示。如果遇到无法回显的情况,可能是因为在修改数据后没有正确地重置表单的。可以使用resetFields方法来重置表单的,确保表单重新渲染时使用的是初始。另外,还需要注意在修改数据后,确保DOM更新完成后再进行重置操作,以避免异步更新导致的问题。\[2\]\[3\] #### 引用[.reference_title] - *1* [vue3 在弹窗使用el-form表单编辑回显问题](https://blog.csdn.net/Salange1/article/details/119382911)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [element的el-form表单数据赋回显后无法编辑修改](https://blog.csdn.net/weixin_40765227/article/details/130194556)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [解决elementUIel-formel-dialog、数据回显同时用时,有bug](https://blog.csdn.net/qq_45532769/article/details/127591497)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值