如何在Vue.js中处理异步数据加载和渲染?

作者站长头像
站长
· 阅读数 16

一个select框组件,其中的数据是从后端返回的,打开这个组件时往里传入了value值,但是页面打开时也会显示这个value值,等后端结果返回才能显示对应的label值,如何让组件先不渲染value直接渲染label?

将请求的生命周期放在async created中没用

回复
1个回答
avatar
test
2024-06-23

我的思路是,子组件内部先根据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>
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容