better-scroll与vue生命周期相关问题

来源:17-23 购物车详情页实现(3)

weibo_Gingbery_0

2017-06-02

项目引入了vuex,在商品详情页面中的goods数据都是存放于vuex中,通过actions异步获取。在使用如下方法引入better-scroll的时候,无法正常滚动:

created:function () {
      this.$store.dispatch('getGoods');
      this.$nextTick(function () {
        this._initScroll();
        this._calculateTop();
      });
    },

发现更改js代码时页面滚动会生效一次,但是再次刷新就无效了,请问是跟vue的生命周期有关吗?应该怎么写?

写回答

3回答

ustbhuangyi

2017-06-03

我觉得你的 dispatch 后肯定是异步更新了数据,那么你就 watch 这个数据的更新,然后在更新后再延时去 refresh  scroll 即可。

0
2
weibo_Gingbery_0
非常感谢!
2017-06-03
共2条回复

weibo_Gingbery_0

提问者

2017-06-03

可以通过返回Promise对象解决,参考https://stackoverflow.com/questions/40165766/returning-promises-from-vuex-actions

不过要注意这个例子中在注册actions的时候可能漏掉了提交action,所以需要补上。

本问题具体解决方案如下:

//store.js中注册action:
getGoods:function ({commit}) {
    return new Promise((resolve,reject)=>{
      Vue.http.get('/api/goods').then( (response) =>{
        response=response.body;
        resolve(response);
        commit('loadGoods',response.data);
      },error=>{
        reject(error);
      });
    });
  },
//组件中先分发action,然后再初始化betterScroll
created:function () {
      this.$store.dispatch('getGoods').then(
        response=>{
          this.$nextTick(function () {
            this._initScroll();
            this._calculateTop();
          });
        }
      );
    },


0
0

ustbhuangyi

2017-06-02

建议看这篇文章,了解 better-scroll 的滚动原理。http://www.imooc.com/article/18232

0
1
weibo_Gingbery_0
老师,我看完了您的这篇文章,大概知道原因了,因为this.$store.dispatch('getGoods');是异步操作的,所以初始化 better-scroll应该写在dispatch('getGoods')的回调中,可是并没有类似的写法,所以我该怎么写呢?
2017-06-02
共1条回复

Vue.js2.5+cube-ui重构饿了么App(经典再升级)

掌握Vue1.0到2.0再到2.5最全版本应用与迭代,打造极致流畅的WebApp

9868 学习 · 4162 问题

查看课程