vue 父组件使用ajax异步请求获取数据,由于是异步获取,所以子组件mounted阶段,ajax仍未完成请求,子组件props获取不到数据。

  解决方法:

第一步:子组件中使用watch,监听传参的变化,执行方法逻辑。

第二步:子组件created延时执行方法逻辑。

第三步:父组件中引用子组件使用v-if做判断,有数据时再加载子组件。

第四步:父组件beforeDestroy方法,设置清空数据源。

代码如下:

父组件:

<template>
  <div>
    <Jtopo :fishboneData="dataSource" v-if="dataSource" />
  </div>
</template>

<script>
  import Jtopo from '../../components/Jtopo'
  import {mapActions, mapState, mapMutations} from 'vuex'

  export default {
    data () {
      return {
      }
    },
    name: 'Fishbone',
    components: {Jtopo},

    created() {
      this.getFishBoneDataList();
    },

    computed: {
      ...mapState('taskResourceAllocation', [
        'dataSource',
        'loading',
      ]),
    },

    beforeDestroy() {
      this.setDataSource({
        payload: {
          dataSource: null
        }
      });
    },

    methods: {
      ...mapActions('taskResourceAllocation', [
        'generateFishBoneDataList',
      ]),

      ...mapMutations('taskResourceAllocation', [
        'setDataSource'
      ]),


      //获取鱼骨图数据
      getFishBoneDataList() {
        let data = new FormData();
        data.append('taskId', "TV9939");
        data.append('taskType', "I");
        data.append('taskDay', "2020-01-13");
        this.generateFishBoneDataList(data);
      },
    }
  }
</script>

子组件:

<template>
  <div id="content" style="width:100%">
    <br/>
    <canvas id="canvas" ref="canvas" style="background-color: rgb(238, 238, 238);width:1300px;height:800px"></canvas>
  </div>
</template>

<script>
  export default {
    name: 'Jtopo',
    props: {
      fishboneData: {
        type: Object,
        default () {
          return {
            name: '',
            children: null
          }
        }
      }
    },
    created(){
      setTimeout(() => {
        this.initTopo()
      }, 1000)
    },
    watch: {
      fishboneData (newVal,oldVal) {
        if (newVal.children && newVal.children.length > 0) {
          this.initTopo()
        }
      }
    },
    methods: {
      initTopo () {
        let canvas = this.$refs.canvas
        if (this.fishboneData) {
          let mfb = new MakFishBone(canvas, {data: this.fishboneData})
          mfb.start()
        }
      }
    }
  }
</script>

此文仅作为开发过程中的问题记录。如有错漏请告知。

Logo

前往低代码交流专区

更多推荐