- 父传子;父组件通过:purchaserIdProps=“SDEditlForm.sellerId”,子组件用props接收
- 子传父: 子组件this.$emit(‘input’, ‘xxx’),父组件用@input接收
- watch监听(用于回显)
- @focus=“clickWarehouseId”;input输入框,主要通过foucs事件触发接口
- if (this.warehouseId) return;判断如果有值,则不触发,防止多次掉接口减少性能消耗
- disabled: Boolean;:disabled=“disabled”
<template>
<div>
<gdb-select v-model="warehouseId" placeholder="请选择主体" :clearable="clearable" :disabled="disabled" @change="changeWarehouseId" @focus="clickWarehouseId">
<gdb-option v-for="item in warehouseList" :value="item.id" :key="item.id" :label="item.caption"></gdb-option>
</gdb-select>
</div>
</template>
<script>
import '/http/axios'
import $http from '/http/http'
import Api from '/config/api'
export default {
props: {
value: {
type: [String, Number],
default: ''
},
purchaserIdProps: {
type: [String, Number],
default: ''
},
disabled: Boolean,
clearable: Boolean
},
data() {
return {
warehouseId: '',
warehouseList: [],
getWarehouseData: {}
}
},
watch: {
value(newVal) {
if (!newVal) {
this.warehouseId = ''
this.$emit('input', '')
this.$emit('select', '')
} else if (newVal && this.purchaserIdProps) {
if (this.warehouseId) return
this.warehouseId = this.value
this.getWarehouseData.companyId = this.purchaserIdProps
this.getWarehouseList()
} else {
if (this.warehouseId) return
this.warehouseId = this.value
this.getWarehouseList()
}
}
},
methods: {
getWarehouseList() {
$http
.get({
url: Api.getWarehouseList,
data: this.getWarehouseData
})
.then(res => {
this.warehouseList = res.data.data
})
},
changeWarehouseId() {
this.$emit('input', this.warehouseId)
this.$emit('select', this.warehouseId)
},
clickWarehouseId() {
if (this.warehouseId) return
this.getWarehouseList()
}
},
created() {}
}
</script>
<style lang='scss' scoped>
</style>
后续问题
- 组件赋值;第一次赋值不触发watch;
解决问题:mounted打印出value,发现有值;而监听打印没有值则问题出在watch
watch: {
value: {
immediate: true,
handler(newVal) {
if (!newVal) {
this.warehouseId = ''
this.$emit('input', '')
this.$emit('select', '')
} else if (newVal && this.purchaserIdProps) {
if (this.warehouseId) return
this.warehouseId = this.value
this.getWarehouseData.companyId = this.purchaserIdProps
this.getWarehouseList()
} else {
if (this.warehouseId) return
this.warehouseId = this.value
this.getWarehouseList()
}
}
}
},