前端做收藏时,需要注意的业务逻辑

337 阅读1分钟

主要流程

1.首先本地更新数据,然后请求后台更新数据

先更新数据是为了交互更丝滑,如果等到接口成功再更新,就有点卡顿的感觉。

我这里是更新vuex的数据,所有写了个方法封装。正常的变状态就直接 record.isCollect = !record.isCollect

    handleCollect(record) {
        let dataSource = this.$store.getters.unstructuredData.dataSource
        this.$store.commit('SET_UNSTRUCTURED_DATA_DATA_SOURCE', dataSource.map(item => {
          if (item.id === record.id) {
            item.isCollect = !item.isCollect
          }
          return item
        }))
      },
      //收藏
      collectItem(record) {
        //本地修改值
        this.handleCollect(record)
        collectUnstructuredData(record, this).catch(() => {
          //如果失败,收藏退回原状态
          this.handleCollect(record)
        })
      },

2.后台更新数据前要做防抖处理

如果用户狂点,操作顺序为[未收藏,收藏,未收藏],此时最后一次和第一次状态一样,那么不需要发送更变的请求。这里用一个布尔值来判断是否是偶数次 后台更新完整代码:

export function collectUnstructuredData(record, that) {
  return new Promise((resolve, reject) => {
    // 如果用户狂点,操作顺序为[未收藏,收藏,未收藏],此时最后一次和第一次状态一样,那么不发送更变的请求。
    // 这里用布尔值来判断是否是偶数次
    record.isSend = !record.isSend
    //新增防抖,避免用户狂点
    if (that.checkTimer) {
      clearTimeout(that.checkTimer)
    }
    that.checkTimer = setTimeout(() => {
      //状态和第一次不一样时,才需要请求
      if (record.isSend) {
        collectUnstructuredDataById(record, that).catch(res => {
            reject(res)
          }
        ).finally(() => {
          delete record.isSend
          resolve()
        })
      }
    }, 300)
  })
}
/**
 * 根据id收藏或取消收藏
 * @param itemId
 * @returns {Promise<unknown>}
 */
export function collectUnstructuredDataById(record, that) {
  return new Promise((resolve, reject) => {
    let httpurl = ''
    let method = ''
    let params = {}
    if (!record.isCollect) {
      //删除收藏
      httpurl = `/unstructur/documentdata/usercollectingrecord/delete?documentDataSheetId=${record.id}`
      params = {}
      method = 'delete'
    } else {
      //新增收藏
      httpurl = '/unstructur/documentdata/usercollectingrecord/add'
      params = { unstructurDocumentdataDocumentDataSheetId: record.id }
      method = 'post'
    }
    httpAction(httpurl, params, method).then((res) => {
      if (!res.success) {
        that.$notify['error'].call(that, {
          key: 'ErrorNotificationKey',
          message: '操作信息提示',
          description: res.message
        })
        reject(res)
      }
      resolve(res)
    })

  })
}

3.后台更新数据失败后,要把收藏状态变回来

      //收藏
      collectItem(record) {
        //本地修改值
        record.isCollect = !record.isCollect
        collectUnstructuredData(record, this).catch(() => {
        //如果失败,收藏退回原状态
        record.isCollect = !record.isCollect
        })
      },