一个select框组件,其中的数据是从后端返回的,打开这个组件时往里传入了value值,但是页面打开时也会显示这个value值,等后端结果返回才能显示对应的label值,如何让组件先不渲染value直接渲染label?
将请求的生命周期放在async created中没用
一个select框组件,其中的数据是从后端返回的,打开这个组件时往里传入了value值,但是页面打开时也会显示这个value值,等后端结果返回才能显示对应的label值,如何让组件先不渲染value直接渲染label?
将请求的生命周期放在async created中没用
哎,我研究了好久,最后我的解决方案是父组件监听每个子组件的change,子组件获取数据之后再emit值,父组件监听到之后查一下是不是已返回的组件数=所有组件数了
下面是父组件的代码
callback() {
if (!this.searchTpl) return;
if (Object.keys(this.options).length < this.searchTpl.length) return;
const optionMap = new Map()
for (let o in this.options) {
optionMap.set(o, this.options[o])
}
const query = []
for (let item of this.searchTpl) {
item.value = optionMap.get(item.field.toString())
query.push(item)
}
this.$parent.query = query;
this.$parent.getList()
},
<template>
...
<span v-if="loading"> loading</span>
<Select v-else :value="value">
<Option v-for="item in options" :label="item.label" :value="item.value"></Option>
</Select>
...
</template>
<script>
export default {
data() {
return {
options: [],
value: null,
loading: false
}
},
created() {
this.handleGetOptions()
},
methods: {
async handleGetOptions() {
this.options = []
this.loading = true
try {
let res = await this.$api.get('api/v1/options')
this.options = res.data
} catch (error) {
console.log(error)
} finally {
this.loading = false
}
}
}
}
</script>
加个loading遮罩,等请求完了再显示select
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
我的思路是,子组件内部先根据option的长度判定是否传给Select组件value,当option为空的时候,传给它undefined,然后通过Select的change事件emit数据给父组件,你的单选联动可以在单选改变之后,调子组件的获取options方法