最近终于忙里抽空,总结项目经验了
index页面包含三个链接导航。page1–>page2–>page3.依次前进,每次前进到一个新页面都需要获取数据,而按下后退键后,从page3返回到page2,page2不再获取新数据,而是使用之前缓g & X存的数据。从page2返回到page1时,page1不再获取新数据,而是使用之前的数据。所以,page1和page2需要缓存,page3J b ?不需要缓存。可以把page1想象成首页,page2想象成详情页,page3想象成订单提交页。这样方便理解。
vue.app页面
钩子函数的执行顺序
不使用keep-aliven $ q :
beforeRouteEnZ u r y t O Jter –> created –> mounted –> destroyed
使用keep-aO x 3 H 9 P 0live
beforeRouteEnter –> created –> mounted –> activated –> deact2 0 yivated
再次进入缓存的页面,只会触发beforeRom T \ g (uteEnter –>activated –> deactivated 。created和mounted不会再u ) B / # = u w执G [ r ( f s行
每次进入页面,我们都需要知晓是从哪个页面进来的,用以判断是否需要获取数据。以这个page1页面为例,当我们知晓是从page2过来的,我们w ~ 5 z , %就可以认为是用户操作了返回键$ M x,这时page1页面就不需要再获取新数据了,使用之T k H e h ~ e m b前缓存的数据就可以了。如果是从别的页面过来的,我们就需要获取数据。
我们可以通过beforeRouteEnter这个钩子函数中的from参数判断是从哪个页面过来的,这个参数执行时,组件实例还没创建,所有不能在data中定义变量。我们可以在路由中定义一个变量,用来判断
beforeRouteEnter中} s | D n G判断是从哪个页面过来的
判断是从哪个路由过来的,如果是page2过来的,表明当前页面不需要刷新获取新数据,直接用之前缓存的数据即可
activated中执行getData这个Y ` H获取数据的方法
因为这个页面需要缓存。只有第一次进入时才会执行cr5 [ ` X k 2 Weated和mounted方法,再次进入就不执行了。而activ? Y C | 0 u x A 9ated每次进入都执行,所以在这个钩5 [ I R H子函数中获取数据。
第一次进入page1,能获取新数据,从page2返回时,不再获取新数据了,而是使用之前缓存的数据。但这样还有一个问题,当用户从page1进入page2后,因为某种原因,手动刷8 6 n N – L b P新了page2的页面。这时再返回到page1,发现之前缓存的数据丢失了,而且也没有K ^ ; G Y再重新获取。所以我们还需要再添P ^ 2 R X ! I加一个判断条件,当用户手动刷新页面后,再返回时就; 2 f需要重新获取数据了。
如何添加这个条件,判断用户是否刷新了页面呢?] A h G ` e 6 H我们知道,当使用keep-alive后,只有第一次进入后: O N R会触发created钩子函数,再次进入就不再执行了。当用户刷新了页面,这个钩子函数就会又执行,所以,我们可以利用这个小技巧来做点文章。
data中定义变量isFirstEnter用来判断是否第= + v –一次进O 5 y h C入,或是否刷新了页面,默认false