需求:在父组件中点击后显示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可能尚未完全渲染和挂载。因此,如果你尝试立即访问子组件的方法,可能会遇到子组件尚未准备好的问题。
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()方法的使用详解(简单明了)
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() 函数重置时,初始化的值是啥就重置成初始的数据。