使用vue2+element开发,弹窗组件动画失效问题如何解决?
使用vue2+element开发pc端项目时,页面中有新增、详情、修改等逻辑,一般都是把这些封装成子组件,在父组件直接引用。以下是我常用的写法,但是不管子组件是抽屉还是弹窗,在打开或者关闭时动画都会失效,怎么优化呢?
// 父组件<EditInfo
:showDetailDialog="showEditDialog"
@getResult="getResult"
v-if="showEditDialog.visible">
</EditInfo>
<script>
export default {
data() {
return {
showEditDialog: {visible: false}
}
},
methods: {
// 搜索接口
search() {},
// 新增
handleAddClick() {
this.showEditDialog= {
visible: true,
title: "新增"
}
},
// 修改
handleDetailClick(id) {
this.showEditDialog= {
visible: true,
title: “修改”,
id
}
},
// 新增修改回调
getResult(flag) {
flag && this.search();
this.showEditDialog.visible = false;
}
}
}
</script>
// 子组件
<el-dialog title="新增" :visible="showEditDialog.visible">
<!-- 其他逻辑 -->
<el-form></el-form>
<div slot="footer">
<el-button type="reset" @click="handleCancelClick" size="mini">取消</el-button>
<el-button type="primary" @click="handleSureClick" size="mini">确定</el-button>
</div>
</el-dialog>
<script>
export default {
props: {
showEditDialog: {
type: Object,
default: () => {}
}
},
methods: {
handleCancelClick() {
this.$emit("getResult",false)
},
handleSureClick() {
// 调用接口
this.$emit("getResult",true)
}
}
}
</script>
回答:
是这个的原因
你不需要这里加这个v-if, 直接传值到子组件, 子组件做监听就可以了
回答:
不要使用 v-if
来控制子组件是否渲染,而是使用 ref 注册子组件实例,再到子组件内部的 open()
或者 init()
方法中初始化表单数据以及 visible
属性。
具体使用方法可以借鉴以下示例:
// 父级组件<template>
<div class="app-container">
....
<!-- 添加或修改对话框 -->
<MemberEditDialog ref="editDialog" @ok="loadData" />
</div>
</template>
<script>
import MemberEditDialog from './dialog/MemberEditDialog'
export default {
name: 'MemberList',
components: { MemberEditDialog },
methods: {
// 加载列表数据
loadData(reload) { ... },
// 新增记录
handleAdd() {
this.$refs.formDialog.add()
this.$refs.formDialog.title = "新增"
},
// 编辑记录
handleEdit(data) {
this.$refs.formDialog.edit(res.data)
this.$refs.formDialog.title = "编辑"
},
}
}
一般来说 add()
、edit()
、loadData()
等方法我都是提取出来为一个 mixin
文件来混入使用。
// 弹窗组件<template>
<el-dialog :title="title+'用户信息'" width="900px" :visible.sync="dialogVisible" :before-close="onClose">
...
</el-dialog>
</template>
<script>
export default {
name: 'MemberEditDialog',
data() {
return {
title: "",
record: {},
dialogVisible: false
}
},
methods: {
add() {
this.edit({})
},
edit(record = {}) {
this.record = {...record}
this.dialogVisible = true
this.$nextTick(() => {
...
})
},
onClose() {
this.record = {}
this.dialogVisible = false
this.$nextTick(() => {
...
})
},
...
}
}
大体思路可以借鉴这个 ant-design-vue-pro,虽然使用的UI库是AntD Vue,但是思路是一样的。
回答:
个人理解,你会把控制弹框的字段和你详情展示的字段绑定在一起,为什么要绑定在一个对象里,一个是前端定义的固定字段,一个是后台返回的动态数据;
我这边的处理的方式是:
父组件:
子组件
在dialog的open方法中处理逻辑,如果你对于后台返回的数据不确定,那就用object的对象转数组方式处理,然后再dom上循环处理数组展示就行了。
至于页面的关闭也不用在给父组件传递了,直接在子组件的close方法中 this.$emit('input', false) 提交这个就可以关闭dialog了
以上是 使用vue2+element开发,弹窗组件动画失效问题如何解决? 的全部内容, 来源链接: utcz.com/p/934010.html