asyncComputed 异步计算属性

asyncComputed 异步计算属性

我们项目中最近使用了异步计算属性,个人感觉很好用,特此推荐给大家。

一、案例

假设这样一个场景:

一个列表数据 data 是通过接口返回,请求参数中有一个 id 的数据,这个 id 数据变化的话,需要重新请求接口获取数据。

按照普通方法来的话,需要按以下步骤实现。

  1. data 中定义一个 list 数据
  2. 需要在 methods 中定义一个 request 方法,请求接口赋值 list
  3. 在页面创建时调用 request 方法,获得首次数据
  4. 通过 watch 监听 id 数据,在变化时调用 request 方法(更新 list 数据)

使用异步计算属性的话,只需要以下代码:

  asyncComputed: {
    list () {
      return Vue.http.get('/get-list-by-id/' + this.id)
        .then(response => response.data)
    }
  }

接下来,详细介绍一下异步计算属性。

二、安装与使用
npm install --save vue-async-computed

当使用了 webpack 或者 browserify 等时,需要明确通过 Vue.use 实现安装。

import Vue from 'vue'
import AsyncComputed from 'vue-async-computed'

Vue.use(AsyncComputed)

和同步计算属性类似,异步计算属性有 get 方法,但是没有 set 方法,设置了也会被忽略。

  asyncComputed: {
    blogPostContent: {
      get () {
        return Vue.http.get('/post/' + this.postId)
          .then(response => response.data.postContent)
       }
    }
  }
三、默认值

异步计算属性还可以设置默认值。在首次加载数据之前使用。

  asyncComputed: {
    blogPostContent: {
      get () {
        return Vue.http.get('/post/' + this.postId)
          .then(response => response.data.postContent)
       },
       default: 'Loading...'
       // default 也可以使用函数,设置基于其他数据的默认值
       default () {
        return 'Loading post ' + this.postId
      }
    }
  }

默认值还可以全局设置。

Vue.use(AsyncComputed, {
  default: 'Global default value'
})
四、重新计算

有时候,异步计算属性的依赖项没有变化,但是需要重新计算。

当某个数据变化时的重新计算可以这么写。

new Vue({
  data: {
    postId: 1,
    timesPostHasBeenUpdated: 0
  },
  asyncComputed: {
    blogPostContent: {
      get () {
        return Vue.http.get('/post/' + this.postId)
          .then(response => response.data.postContent)
      },
      // timesPostHasBeenUpdated 变化时重新计算
      watch: ['timesPostHasBeenUpdated']
    }
  }
}

还可以通过点语法监听具体属性值。
watch: [‘a.b.c’, ‘d.e’] 可以监听 this.a.b.c 和 this.d.e.

另外还可以在某些情况下手动触发重新计算。

  asyncComputed: {
    blogPosts: {
      get () {
        return Vue.http.get('/posts')
          .then(response => response.data)
      },
    }
  },
  methods: {
    refresh() {
      // 手动触发
      this.$asyncComputed.blogPosts.update();
    }
  }
五、有条件的重新计算

使用 watch 会重新计算,但是不会考虑监听属性的值得具体情况。

这个时候可以使用 shouldUpdate 实现具体条件下的重新计算。

  asyncComputed: {
    blogPostContent: {
      get () {
        return Vue.http.get('/post/' + this.postId)
          .then(response => response.data.postContent)
      },
      // pageType 或者 postId 改变都会重新计算,但必须同时满足下面条件
      shouldUpdate () {
        return this.pageType !== 'index'
      }
    }
  }
六、lazy 属性

有时候不希望异步计算属性一直重新计算,可以使用 lazy:true 实现只在首次访问时计算。

  asyncComputed: {
    mightNotBeNeeded: {
      // mightNotBeNeeded 的值只会在首次计算
      lazy: true,
      get () {
        return Vue.http.get('/might-not-be-needed/' + this.id)
          .then(response => response.data.value)
      }
    }
  }
七、计算状态

每个异步计算属性,都会向 $asyncComputed 中添加一个对象(包含有关该对象当前计算状态的信息)。

该对象包含以下属性:

{
  // 之一:updating, success, error
  state: 'updating',
  // 布尔值,属性更新时为true
  updating: true,
  // 没有错误发生且当前值可用时,该属性不再更新
  success: false,
  // promise 出现 rejected
  error: false,
  // promise 出现 rejected 时的原始错误信息
  exception: null
}

用于展示更新/错误信息。

  asyncComputed: {
    posts() {
      return Vue.http.get('/posts')
        .then(response => response.data)
      }
    }
  }
  
// 每次 posts 数据更新时,以下信息都会展示
// <div v-if="$asyncComputed.posts.updating"> (Re)loading posts </div>
八、全局错误处理

默认情况下,在异步计算属性中发生 promise 的 reject 的情况下,vue-async-computed 将为你记录错误。

如果你想使用自定义日志记录函数,那么插件将接受 errorHandler 选项,该选项应该是你希望使用错误信息调用的函数。

默认情况下,它将仅以错误的堆栈跟踪作为参数进行调用,但是如果将 errorHandler 与 useRawError 设置为 true,函数将接收原始错误,即抛出错误的Vue实例的引用和错误的堆栈跟踪。

Vue.use(AsyncComputed, {
  errorHandler (stack) {
    console.log('Hey, an error!')
    console.log('---')
    console.log(stack)
  }
)

// useRawError
Vue.use(AsyncComputed, {
  useRawError: true,
  errorHandler (err, vm, stack) {
    console.log('An error occurred!')
    console.log('The error message was: ' + err.msg)
    console.log('And the stack trace was:')
    console.log(stack)
  }
)

git 地址:vue-async-computed

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
vue-async-computed.js是一个用于Vue.js的库,它扩展了Vue中的计算属性功能,使之可以支持异步数据获取和计算。 Vue.js计算属性是在模板中根据数据的变化实时计算出新的结果,并实时更新到视图中。然而,在某些情况下,数据的获取和计算可能会涉及异步操作,如从服务器获取数据或处理复杂的计算逻辑。此时,普通的计算属性就不再适用,需要使用异步计算属性才能处理这样的情况。 异步计算属性提供了一个方便的方式来处理异步数据的获取和计算。它的用法类似于普通的计算属性,但是需要使用一个异步函数来定义计算属性的逻辑。这个异步函数可以返回一个Promise对象,用于表示异步操作的结果。 在异步函数中,我们可以执行异步操作,如发送网络请求、读取本地存储等。当异步操作完成后,我们可以通过Promise的resolve方法返回计算属性的结果。在模板中使用异步计算属性时,Vue会自动等待异步操作完成并获取到计算属性的结果,然后更新视图中相应的内容。 通过使用vue-async-computed.js,我们可以轻松地处理复杂的异步计算逻辑,如缓存异步计算结果、处理异步错误等。它的简单易用和强大的功能使得我们可以更加方便地开发处理异步数据的应用程序。无论是获取远程数据还是处理复杂的计算逻辑,vue-async-computed.js都可以帮助我们减少工作量,提高开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值