如何在Vue.js中处理异步数据加载和渲染?
一个select框组件,其中的数据是从后端返回的,打开这个组件时往里传入了value值,但是页面打开时也会显示这个value值,等后端结果返回才能显示对应的label值,如何让组件先不渲染value直接渲染label?
将请求的生命周期放在async created中没用
回答:
我的思路是,子组件内部先根据option的长度判定是否传给Select组件value,当option为空的时候,传给它undefined,然后通过Select的change事件emit数据给父组件,你的单选联动可以在单选改变之后,调子组件的获取options方法
<template>
<el-select :value="selectVal" @change="handleChange">
<el-option v-for="item in selectOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</template>
<script>
export default {
props: ['value'],
emits: ['update:value'],
data() {
return {
selectOptions: [],
}
},
computed: {
selectVal() {
return this.selectOptions.length ? this.value : undefined
}
},
created() {
this.getOptions()
},
methods: {
async getOptions() {
this.selectOptions = []
// 异步请求任务
// awati axios(...)
this.selectOptions = [
{ value: 'Option1', label: 'Option1', },
{ value: 'Option2', label: 'Option2', },
]
},
handleChange(e) {
this.$emit('update:value', e)
}
}
}
</script>
回答:
哎,我研究了好久,最后我的解决方案是父组件监听每个子组件的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()
},
回答:
问题本质是select下拉选择框如何在option里匹配不到value时展示value的label而非value的value
回答:
页面打开和打开组件是同一个操作吗,页面打开时有赋值value吗
回答:
<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
以上是 如何在Vue.js中处理异步数据加载和渲染? 的全部内容, 来源链接: utcz.com/p/935297.html