el-dialog中使用el-form子组件传数据问题

发布时间:2024年01月11日

需求:在父组件中点击后显示el-dialog,el-dialog中使用了子组件,并需要向子组件传form数据。

<el-dialog width="50%" title="对象信息" :visible.sync="dialogFormVisible" @close="closedialog">
	<UploadFile ref="child"></UploadFile>
</el-dialog>

方法...
this.dialogFormVisible = true;
this.$refs.child.childFile(obj);
...

如果先传值this.$refs.child.childFile(obj);,再让this.dialogFormVisible = true;,则会出现childFile方法undefined。
但是即使是先this.dialogFormVisible = true;也会是方法undefined。因为
在Vue.js中,视图更新是异步的。当你修改了数据,Vue.js并不会立即更新DOM,而是在下一个事件循环中执行更新。这种异步更新的机制可以提高性能,因为它允许Vue.js在一次事件循环中批量处理多个数据变更。
this.$refs.child.childFile(obj);是同步代码,视图还没更新时,这行代码已经执行了,所以仍然是方法undefined。
当你设置 this.dialogFormVisible = true; 打开对话框时,对话框组件的DOM可能尚未完全渲染和挂载。因此,如果你尝试立即访问子组件的方法,可能会遇到子组件尚未准备好的问题。

解决方案:

1.使用this.$nextTick

this.dialogFormVisible = true;
this.$nextTick(() => {
  this.$refs.child.childFile(obj);
})

先设置为true,然后再调用子组件的方法。

this.$nextTick:在下次 DOM 更新循环结束之后执行延迟回调。所以就衍生出了这个获取更新后的DOM的Vue方法。所以放在Vue.nextTick()回调函数中的执行的应该是会对DOM进行操作的 js代码;
nextTick(),是将回调函数延迟在下一次dom更新数据后调用,简单的理解是:当数据更新了,在dom中渲染后,自动执行该函数。
vue.nextTick()方法的使用详解(简单明了)

2.使用setTimeout

this.dialogFormVisible = true;
setTimeout(() => {
	this.$refs.child.childFile(obj);
});

调用方法变成了异步代码。

拓展

1.父组件用props把参数(id)传递给子组件使用的,但是props传参是异步的

2.el-dialog 组件会监听 visible 的状态,当状态为 true 时,立刻触发 open 事件,但这个时候 el-dialog__body 的内容还没有渲染。因为 Vue 组件通过 $emit 触发的事件并不是异步执行的,而是同步执行。
Element UI Dialog 组件中执行 DOM 操作异常问题的分析与处理

3.resetFields() 函数重置时,初始化的值是啥就重置成初始的数据。

文章来源:https://blog.csdn.net/Zing_ing/article/details/135515588
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。