vuex异步调用的理解

来源:4-13 阅读器主题设置功能实现

慕斯6088333

2020-06-05

老师的代码如下:

 initTheme() {
        let defaultTheme = getTheme(this.fileName)
        if (!defaultTheme) {
          defaultTheme = this.themeList[0].name
          saveTheme(this.fileName, defaultTheme)
        }
        this.setDefaultTheme(defaultTheme)
        this.themeList.forEach(theme => {
          this.rendition.themes.register(theme.name, theme.style)
        })
        this.rendition.themes.select(defaultTheme)
      },

老师,您课程中的意思是this.setDefaultTheme(defaultTheme) 是vuex异步去存储defaultTTheme. 所以最后一行代码如果写成this.rendition.themes.select(this.defaultTheme) 可能渲染的就是默认的theme而不是从缓存中获取的theme。我这么理解对嘛。(还是会出现程序报错误呢?)

因此我们在 theme component中
使用先设置完theme的改变等有priomise对象返回再去渲染主题。
若不这样做。这里可能会出现一下闪屏的效果(切换颜色有点卡的那种)?

 setTheme (theme) {
      this.setDefaultTheme(theme).then(() => {
        this.currentBook.rendition.themes.select(this.defaultTheme)
      })
      saveTheme(this.fileName, theme)
    }

以及我initTheme是这么实现的, 也可以保证不出问题吧。(即确保rendition相关的操作总是在vuex setter之前完成)。

initTheme (theme) {
      this.themeList.forEach((theme) => {
        this.book.rendition.themes.register(theme.name, theme.style)
      })
      if (!theme) {
        saveTheme(this.fileName, this.defaultTheme)
        this.book.rendition.themes.select(this.defaultTheme)
      } else {
        this.book.rendition.themes.select(theme)
        this.setDefaultTheme(theme)
      }
    },

ps 这里函数的theme定义是 theme.name
谢谢老师。~

写回答

1回答

Sam

2020-06-05

你好,你的理解全部正确,这里的this.setDefaultTheme是异步操作,所以不能直接使用this.defaultTheme,当然你也可以直接使用同步更新方法,类似:this.$store.commit('SET_DEFAULT_THEME',defaultTheme),这样更新后我们就可以立即使用this.defaultTheme了,但在真实项目实践中,推荐在使用异步更新vuex,以避免造成屏幕卡顿

0
1
慕斯6088333
非常感谢!
2020-06-05
共1条回复

Vue 实战商业级读书Web APP完整项目

Vue全家桶+最新前端技术+前后端分离架构,完整项目流程

1624 学习 · 1951 问题

查看课程