背景
- 项目中经常出现三级下拉框组件的要求,这种组件其中一级发生变化,子级的组件就会发生变化
- 如果这一个组件,单独作为搜索条件使用,很好写,同时作为搜索条件和form回写组件,回显就比较困难
子组件代码
- 将与父组件通信的属性定义在props中:

- 定义三个handler处理值的变化 ,同时绑定在对应下拉框

- 对于prop的值,不可以直接在子组件中修改,只能通知父组件修改

- 有时候子组件的根性有延迟,导致出现问题,可以使用父组件传递过来的值,或者使用next函数

<script>
import {getSonMenuList} from "@/api/maintain/classfiy";
export default {
name: "costClassify",
props: {
proProcedureId: Number,
costElementId: Number,
costPartitionId: Number,
},
data() {
return {
proProcedureList: [],
costElementList: [],
costPartitionList: [],
};
},
watch: {},
methods: {
proProcedureIdHandler(value) {
this.$emit('update:proProcedureId', value);
this.costElementList = []
this.costElementIdHandler(null)
if (!value) {
return
}
getSonMenuList(value).then((response) => {
this.costElementList = response.data
})
},
costElementIdHandler(value) {
this.$emit('update:costElementId', value);
this.costPartitionList = []
this.costPartitionIdHandler(null)
if (!value) {
return
}
getSonMenuList(value).then((response) => {
this.costPartitionList = response.data
})
},
costPartitionIdHandler(value) {
this.$emit('update:costPartitionId', value);
if (!value) {
return
}
},
init() {
console.log('costClassify init')
console.log(this)
getSonMenuList(-1).then((response) => {
this.proProcedureList = response.data
})
if (this.proProcedureId) {
this.proProcedureIdHandler(this.proProcedureId)
}
if (this.costElementId) {
this.costElementIdHandler(this.costElementId)
}
if (this.costPartitionId) {
this.costPartitionIdHandler(this.costPartitionId)
}
},
refresh(proProcedureId, costElementId, costPartitionId) {
this.$nextTick(() =>{
console.log('costClassify refresh')
getSonMenuList(-1).then((response) => {
this.proProcedureList = response.data
})
if (proProcedureId) {
getSonMenuList(proProcedureId).then((response) => {
this.costElementList = response.data
})
}
if (costElementId) {
console.log('三级列表执行'+costElementId)
getSonMenuList(costElementId).then((response) => {
this.costPartitionList = response.data
})
console.log('三级列表执行成功')
}
if (costPartitionId) {
}
})
}
},
mounted() {
console.log('costClassify mounted')
this.init()
},
};
</script>
<template>
<span>
<el-form-item label="生产工序" prop="proProcedureId">
<el-select v-model="proProcedureId" placeholder="请输入生产工序" clearable size="mini"
@change="proProcedureIdHandler">
<el-option v-for="proProcedure in proProcedureList" :key="proProcedure.id" :label="proProcedure.name"
:value="proProcedure.id"/>
</el-select>
</el-form-item>
<el-form-item label="成本要素" prop="costElementId">
<el-select v-model="costElementId" placeholder="请输入成本要素" clearable size="mini"
@change="costElementIdHandler">
<el-option v-for="costElement in costElementList" :key="costElement.id" :label="costElement.name"
:value="costElement.id"/>
</el-select>
</el-form-item>
<el-form-item label="费用细分" prop="costPartitionId">
<el-select v-model="costPartitionId" placeholder="请输入费用细分" clearable size="mini"
@change="costPartitionIdHandler">
<el-option v-for="costPartition in costPartitionList" :key="costPartition.id" :label="costPartition.name"
:value="costPartition.id"/>
</el-select>
</el-form-item>
</span>
</template>
<style scoped lang="scss">
</style>
父组件调用
- refs获取子组件的引用
- 第一次的时候子组件没有渲染完毕,找不到refresh函数,要使用nextTick延迟调用
handleUpdate(row) {
this.reset();
const id = row.id || this.ids
this.form = Object.assign({}, row);
this.open = true;
this.editFlag = true;
this.title = "修改月度费用";
console.log(this.form.proProcedureId, this.form.costElementId, this.form.costPartitionId)
this.$nextTick(() => {
this.$refs.costClassifyRef.refresh(this.form.proProcedureId, this.form.costElementId, this.form.costPartitionId);
})
},