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