ebook项目
作者:互联网
vuex
<div class="title-wrapper" v-show="menuVisible">
</div>
store文件里面
book.js
const book = {
state: {
fileName: '',
menuVisible: false
},
mutations: {
'SET_FILENAME': (state, fileName) => {
state.fileName = fileName
},
'SET_MENUVISIBLE': (state, menuVisible) => {
state.menuVisible = menuVisible
}
},
actions: {
setFileName: ({ commit }, fileName) => {
return commit('SET_FILENAME', fileName)
},
setMenuVisible: ({ commit }, menuVisible) => {
return commit('SET_MENUVISIBLE', menuVisible)
}
}
}
export default book
getters.js
const book = {
fileName: state => state.book.fileName,
menuVisible: state => state.book.menuVisible
}
export default book
在EbookTitle.vue
通过mapGetters去映射
import {mapGetters} from 'vuex' //引入
export default {
computed: {
...mapGetters(['menuVisible'])
}
}
在EbookReader.vue
三个动作,上一页,下一页,点击事件
让点击:显示和隐藏menuTitle
import { mapGetters } from "vuex";
export default {
computed: {
...mapGetters(["fileName" ,'menuVisible'])
},
methods: {
PrevPage() {
// 先判断this.rendition事件是否存在
if (this.rendition) {
this.rendition.prev();
}
},
nextPage() {
// 先判断this.rendition事件是否存在
if (this.rendition) {
this.rendition.next();
}
},
toggleTitleAndMenu() {
console.log('0000000')
console.log(this.menuVisible)
this.$store.dispatch('setMenuVisible',!this.menuVisible)
},
}
}
…mapGetters([“fileName” ,‘menuVisible’])
注意这里用的是一个数组,注意写法,自己一不小心写成了
…mapGetters([“fileName” ],[‘menuVisible’])。导致menuVisible没有引入成功
过渡动画这边 抽个时间看免费课程 记录一下
把EbookMene.vue 这个组件弄好 并且注册到EbookReader.vue组件中去
把html,js,sass移植过来
同样的把显示很隐藏用menuVisible全局vuex去存储
翻页的时候需要隐藏ebookTitle
写一个隐藏ebookTitle的方法
因为出现了很多重复的代码,举个例子
import { mapGetters } from "vuex";
computed: {
...mapGetters(["fileName" ,'menuVisible'])
},
利用vueX 和mixin 组件间的解耦
在src下新建一个utils文件夹,然后新建一个mixin.js
让所有文件都引入这个mixin.js这个文件,即达到代码的复用简化。
这样有个好处,以后修改只需要在一处修改即可
通过vue里面mixins这样的标签把我们混入的内容放入ebookReader当中
那么vue在实例化的过程中就会把ebookMixin的内容导入到ebookReader当中,从而实现mixin的复用
提问:我们在调用vuex里面的方法的时候全部使用的是dispach方法去触发vueX的Actions。有没有更加简便的方法呢?this.$store.dispatch(‘setMenuVisible’,!this.menuVisible)
当然有啊:运用vuex的一种机制:mapActions
this.setMenuVisible(!this.menuVisible)这样去触发
但是还要给action创建一个映射
import { mapActions } from "vuex";
export default{
methods: {
...mapActions(['setMenuVisible']),
}
}
但是还要给action创建一个映射
在store文件 夹下创建一个actions.js文件
记得把store文件模板下的book.js里面的action内容给删掉
book.js 里面没有了actions
const book = {
state: {
fileName: '',
menuVisible: false
},
mutations: {
'SET_FILENAME': (state, fileName) => {
state.fileName = fileName
},
'SET_MENUVISIBLE': (state, menuVisible) => {
state.menuVisible = menuVisible
}
}
}
export default book
actions.js
const actions = {
setFileName: ({ commit }, fileName) => {
return commit('SET_FILENAME', fileName)
},
setMenuVisible: ({ commit }, menuVisible) => {
return commit('SET_MENUVISIBLE', menuVisible)
}
}
export default actions
并且在store文件下的index.js去引用这个actions.js
让actions传入到vuex的实例化中去
index.js
import Vue from 'vue'
import Vuex from 'vuex'
import book from './modules/book'
import getters from './getters'// 不是modules的就用一个.
import actions from './actions'
Vue.use(Vuex)
export default new Vuex.Store({
modules: {
book
},
getters,
actions
})
这些写好了后就可以直接this.setMenuVisible(false)这样调用
其实 这种 方法 还可以 混入到mixin.js当中,从而实现更高程度的一定复用
这样我们就不需要在ebookReader.vue中去写
import { mapActions } from “vuex”;
export default {
methods: {
…mapActions([‘setMenuVisible’,‘setFileName’]),
}
}
以上写多了也很不优雅
我们在mixin.js中加入methods:{}
import { mapGetters, mapActions } from 'vuex'
export const ebookMixin = {
computed: {
...mapGetters([
'fileName',
'menuVisible'
])
},
methods: {
...mapActions(['setMenuVisible', 'setFileName'])
}
}
从而我们只需要在ebookReader.vue中去写,这样我们就可以优雅的把vuex里面繁琐的代码全部用mixin.js来引入即可
import {ebookMixin} from ‘…/…/utils/mixin’
export default {
mixins: [ ebookMixin ],
}
下面集成web字号的设置
首先在免费课程中把设置字号的代码拷贝过了。这个免费课程很有必要学习一下啊。
然后需要把显示面板的这个变量存储在vuex中去,是通过menubar去显示的。
store文件下的book.js
新增加的settingVisible
state和mutations里面都有新注册内容进去
const book = {
state: {
fileName: '',
menuVisible: false,
settingVisible: -1 // -1表示不显示,0:字号,1:主题设置,2:进度条 3:目录
},
mutations: {
'SET_FILENAME': (state, fileName) => {
state.fileName = fileName
},
'SET_MENUVISIBLE': (state, menuVisible) => {
state.menuVisible = menuVisible
},
'SET_SETTINGVISIBLE': (state, settingVisible) => {
state.settingVisible = settingVisible
}
}
}
export default book
store文件下的actions.js
在actions中新增setSettingVisible函数,供需要的页面调用
const actions = {
setFileName: ({ commit }, fileName) => {
return commit('SET_FILENAME', fileName)
},
setMenuVisible: ({ commit }, menuVisible) => {
return commit('SET_MENUVISIBLE', menuVisible)
},
setSettingVisible: ({ commit }, settingVisible) => {
return commit('SET_SETTINGVISIBLE', settingVisible)
}
}
export default actions
在store文件下的getters.js写入settingVisible
const book = {
fileName: state => state.book.fileName,
menuVisible: state => state.book.menuVisible,
settingVisible: state => state.book.settingVisible
}
export default book
最后再在utils文件下的mixin.js中去导入这个settingVisible这个变量还有setSettingVisible这个函数
import { mapGetters, mapActions } from 'vuex'
export const ebookMixin = {
computed: {
...mapGetters([
'fileName',
'menuVisible',
'settingVisible'
])
},
methods: {
...mapActions(['setMenuVisible', 'setFileName', 'setSettingVisible'])
}
}
最后我们需要到我们的面板页面EbookSettingFont.vue中去引入mixin.js
import {ebookMixin} from '../../utils/mixin'
export default {
mixins: [ ebookMixin ],
}
标签:menuVisible,项目,ebook,fileName,state,book,export,js 来源: https://blog.csdn.net/weixin_40878286/article/details/90398235