Vue JS - 在触发函数之前检查数组中的所有项目是不是都已加载

Posted

技术标签:

【中文标题】Vue JS - 在触发函数之前检查数组中的所有项目是不是都已加载【英文标题】:Vue JS - Check if all items in an array are loaded before firing a functionVue JS - 在触发函数之前检查数组中的所有项目是否都已加载 【发布时间】:2021-06-19 23:26:57 【问题描述】:

我有一个名为垃圾数据的数组道具,并且该数组中的每个项目都作为地图中的自定义标记加载。我的问题是,大多数时候,标记是在加载“trashData”中的所有数据之前呈现的。因此,如果我在“trashData”中有 100 个项目,则只会出现非常少量的标记,因为“trashData”在创建标记之前无法加载数组中的所有项目。在创建标记之前,我该怎么做才能加载“trashData”中的所有项目?我知道可以使用 setTimeout 之类的东西,但我觉得这不是最佳选择。

TrashData 是该组件中的一个道具,它会调用另一个组件中的 getter。在触发相关函数以创建标记之前,是否可以检查 prop 'trashData' 是否已从 api 加载了它需要的所有项目?

垃圾.vue

props: 
    trashData: 
      type: Array,
      required: true
    
  ,
  watch: 
    trashData: function (newValue) 
      console.log(newValue);
    
  ,
 methods: 
    createCustomOverlay: function (marker) 
      console.log("markers loaded");
      const imageUrl = this.$props.isReportedTrash ? this.getImageUrl(marker.imageUrl) : this.getImageUrl(marker.imageUrlBefore);
      let overlay = createCustomOverlay(
        imageUrl: imageUrl,
        lat: marker.location.lat,
        lng: marker.location.lon,
      );
      overlay.setMap(this.googleMap);
      return overlay;
    ,

   createAndAddMarkers: function () 
      this.googleMapMarkers = this.trashData.map(marker => 
        const overlay = this.createCustomOverlay(marker);
        this.addMarkerClickListener(marker, overlay);
        return overlay;
      );
   

TrashOverview.vue - 这就是 'trashData' 用作 'collectedTrash' 的地方。

computed: 
    collectedTrash: function () 
      return this.$store.getters.getCollectedTrash;
    
  ,
methods: 
    getCollectedTrash: function (page = -1, sort = TYPES_SORTING.DESC_CREATED_AT) 
      this.$store.dispatch(GET_COLLECTED_TRASH, page: page, sort: sort);
    

【问题讨论】:

【参考方案1】:

是否可以检查道具'trashData'是否已加载所有 在触发相关功能之前它需要从 api 获取的项目 创建标记?

您可以使用 Promise.all() :您将所有请求推送到 Promises 数组中的 API,然后使用 Promise.all(). 等待它

const promiseN = new Promise((resolve, reject) => 
  getDataFromApi().then((result) => 
    resolve(result);
);

Promise.all([promise1, ..., promiseN]).then((values) => 
  console.log(values);
);

【讨论】:

以上是关于Vue JS - 在触发函数之前检查数组中的所有项目是不是都已加载的主要内容,如果未能解决你的问题,请参考以下文章

Vue 对象中的计算值函数被触发

如何检查数组的至少一项是不是包含在对象数组中并遍历所有对象(JS)

原始函数之前的 then 子句中的角度触发函数

Vue/JS - 检查两个对象的所有值是不是为空

在JS中数组内部值的变化不触发视图更新的浅谈

用于检查数组中的重复项的通用 Typescript 函数