# vue-compent-cache
**Repository Path**: account68/vue-compent-cache
## Basic Information
- **Project Name**: vue-compent-cache
- **Description**: 在路由切换的时候,如果进入某些页面需要缓存当前页面变量,但是进入某些页面不需要缓存当前页面变量的时候,除了使用vue 官方的include和exclude,可以使用vue-compent-cache
- **Primary Language**: JavaScript
- **License**: MulanPSL-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 5
- **Forks**: 1
- **Created**: 2022-02-15
- **Last Updated**: 2023-09-12
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# vue-compent-cache
#### 介绍
在路由切换的时候,如果进入某些页面需要缓存当前页面变量,但是进入某些页面不需要缓存当前页面变量的时候,除了使用vue 官方的include和exclude,可以使用vue-compent-cache
#### vue安装教程
1. npm i vue-compent-cache
2. 在main.js中
```
import pageCahe from 'vue-compent-cache'
Vue.prototype.pageCahe=pageCahe
```
3. 在router.js中
```
router.afterEach((to, from) => {
Observer.dispatchEvent('pageCahe', {to,from})
})
```
#### 函数介绍以及使用说明(2.0版本)(new)(推荐)
1.vueCache(params,initCallBack, cacheCallBack)
vueCache是vueTakeData,vueStoreData以及vueDataCache的进化版,在上述2个场景都可以使用
结合vue内置缓存keepAlive:true,并通过路由判断执行相应的操作
该函数需要在activated函数里面执行 即this.pageCache.vueCache.call(this,noCacheList,initCallBack,cacheCallBack)
参数数据结构
@params noCacheList Array 从那些组件每次进来的时侯需要执行init初始化操作的
就将该组件定义路由时其name属性值作为其中一个数据项
(如果组件是引用到宿主组件里面使用,没有定义路由,则就是其宿主组件的路由name属性值)
@params initCallBack Function 每次从noCacheList里面组件进来需要执行【初始化】操作的时候,可以在该回调函数里面执行
@params cacheCallBack Function 每次从非noCacheList里面组件进来需要执行【某些】操作的时候,可以在该回调函数里面执行
代码案例:
```
activated() {
//因为设置keepAlive:true所以此时默认,从所有组件进来都会缓存之前的变量
//但是通过这个函数可以设置从那些组件进来不需要缓存,每次都执行初始化操作,将data里面的变量置为初始值
//noCacheList 为每次进入该组件时需要初始化操作的组件列表
let noCacheList = ["share", "cp11"];
this.pageCache.vueCache.call(
this,
noCacheList,
() => {
//每次从noCacheList里面的组件进来的时候都会执行初始化操作
console.warn("每次从noCacheList里面的组件进来的时候都会执行初始化操作");
console.warn('this.$data',this.$data)
},
() => {
//每次从非noCacheList里面的组件进来的时候会执行下面操作
console.warn("每次从非noCacheList里面的组件进来的时候会执行下面操作");
console.warn('this.$data',this.$data)
}
);
//每次从【noCacheList里面的组件】 或者 【非noCacheList里面的组件】进来共同需要的操作
console.warn('每次从【noCacheList里面的组件】 或者 【非noCacheList里面的组件】进来共同需要的操作')
}
```
#### 函数介绍以及使用说明(1.0版本)(old)
1. vueDataCache(params)
1)使用场景:
vue中如果不设置keepAlive:true,在路由切换的时候如果需要缓存某些变量
路由激活按钮不在当前需要缓存变量的组件里面
案例:
c组件为容器组件,其页签a和b对应的组件分别为a组件和b组件
a组件和b组件通过组件引用的方式使用或者路由跳转方式使用
第一种情况:跳转按钮在a组件里面,跳转到d组件燃后在回到容器组件c的时候,需要缓存c组件里面的变量
第二种情况:跳转按钮在c组件里面,跳转到d组件燃后在回到容器组件c的时候,需要缓存a/b组件里面的变量
2)使用说明
在使用的组件的created或者mounted函数里面执行一次vueDataCache函数,用于设置当前组件去那个组件在返回的时候需要缓存变量,然后具体缓存那些变量,
参数数据结构:
{
compentName:String //当前组件的路由的name名称,如果是组件引用的方式使用,其没有被定义路由,那么就是其宿主组件的路由name
targetName:Array //进入那个组件,在返回回来的时候需要缓存变量,则该组件路由的path名称为一个数组项
data:Object //进入某个组件后,在返回回来的时候需要缓存的变量,key值需要和缓存的变量名一致
}
注意:
使用该函数的组件需要在定义路由的时候,设置其name属性
如果是组件引用的方式使用,不需要被定义路由,那么就是其宿主组件的路由需要设置其name属性
如跳转按钮在app.vue其内部的子组件Home.vue跳转到about.vue
```
//Home.vue中代码
created(){
let obj = {
compentName: "Home",
targetName: ["about"],
data: {
test1: this.test1, //key值需要和缓存的变量名一致
test2: this.test2, //key值需要和缓存的变量名一致
}
};
this.pageCahe.vueDataCache.call(this, obj);
}
```
后续需要缓存的变量发生变化,还需要更新之前传递的数据,即在调用一次vueDataCache函数,将修改后的变量值传递进去
仅传递data就可以,compentName,targetName一定不可以重复传递
```
//Home.vue中代码
setData(){
//修改data里面的test2变量值
this.test2 = "test222";
let obj = {
data: {
test2: this.test2,
}
};
this.pageCahe.vueDataCache.call(this, obj);
}
```
2. vueStoreData(params)\vueTakeData(params)
1) 使用场景:
vue中如果不设置keepAlive:true,在路由切换的时候如果需要缓存某些变量
路由激活按钮在当前需要缓存变量的组件里面
案例:
在A组件里面有个button按钮可以实现单击跳转到B组件,然后此时需要缓存变量key1,key2时,
回来的时候key1,key2仍需要为离开时的值
2) 使用说明
在单击事件函数里面,执行this.route.push()激活下一个路由之前,调用vueStoreData函数,对storeData赋值
在进入组件的时候在created函数里面,调用vueTakeData函数,对storeData取值
vueStoreData参数数据结构:
[
{
compentName:String //当前组件的路由的name名称,如果是组件引用的方式使用,其没有被定义路由,那么就是其宿主组件的路由name
data:Object //需要缓存的变量
},
...
]
vueDataCache参数数据结构:
String //当前组件的路由的name名称,如果是组件引用的方式使用,其没有被定义路由,那么就是其宿主组件的路由name
注意:
使用该函数的组件需要在定义路由的时候,设置其name属性
如果是组件引用的方式使用,不需要被定义路由,那么就是其宿主组件的路由需要设置其name属性
如about.vue跳转到test.vue
```
//about.vue中代码
toTest() {
//缓存变量
let arr = [
{
compentName: "about",
data: {
name: this.name,
},
},
];
this.pageCahe.vueStoreData(arr);
//路由跳转
this.$router.push({
path: "test",
});
},
```
```
//about.vue中代码
created() {
this.pageCahe.vueTakeData.call(this,'about');
},
```
3. 在vueDataCache(params)以及vueStoreData(params)\vueTakeData(params)中开启滚动定位效果
在有数据列表的时候,每次从详情回来后,如果需要定位到离开时的滚动位置
上述3个函数通过指定参数都可以开启滚动定位
1).页面初始化时在created,mounted里面执行上述函数之前,先执行下面2行代码表示开启滚动定位效果
Observer.srcoll=true
Observer.srcollDom=undefined
如果是html滚动,不需要传递 srcollDom 或者 传srcollDom:undefined
如果是具体某一dom,就传递 srcollDom:该dom的id
即:
created(){
Observer.srcoll=true
Observer.srcollDom=undefined
this.pageCache.vueDataCache.call(this,data)
}
2).切换或者加载新列表的时候需要设置(比如切换筛选条件等)
Observer.srcollTopLength=0
3).离开组件,并且下次再进入时不需要滚动定位的时候
Observer.srcoll=false
Observer.srcollTopLength=0