import { mapState } from 'vuex' import VisitedModelTransform from '@/utils/mixins/tran-visited' class VisitedPathItem { constructor (path, search) { this.path = path this.search = search this.timestamp = Date.now() } } const TranModel = new VisitedModelTransform() export const mixinVisited = { computed: { ...mapState({ visitedList: state => state.user.visitedList }) }, created () { this.$store.commit('user/refreshVisited') }, methods: { createPathItem (path, search) { return TranModel.transformItem(new VisitedPathItem(path, search)) }, // 从判断 path 是否访问过 // 参数path为 VisitedPathItem new 出来的实例 pathVisitedIndex (path) { const list = this.visitedList let sameIndex = -1 if (list) { for (let i = 0; i < list.length; i++) { const same = this.comparePath(list[i], path) if (same) { sameIndex = i break } } } return sameIndex }, comparePath (basePath, newPath) { const pathSame = basePath.type === newPath.type const searchSame = basePath.id === newPath.id return pathSame && searchSame }, pathVisited (path) { return this.pathVisitedIndex(path) !== -1 }, // 保存一条历史 // 参数path为 VisitedPathItem new出来的实例 pathVisiting (path) { if (!path) return // 判断是否重复 const index = this.pathVisitedIndex(path) const visitedList = JSON.parse(JSON.stringify(this.visitedList)) if (index >= 0) { // 已存在 const itemArr = visitedList.splice(index, 1) const item = itemArr[0] item.timestamp = Date.now() visitedList.unshift(item) } else { visitedList.unshift(path) } // 全量替换 this.$store.commit('user/addVisited', visitedList) } } }