首先我描述一下我的需求:
比如说我有一组和二组。一组的界面和二组的界面一样,就是数据不一样。当我从一组切换成为二组之后,全部的接口需要重新请求接口儿。但是我不想让整个页面刷新请求(window.location.reload()),而是切换组之后直接全部变成新的数据,这个怎么实现?
目前框架用的react,但是这个问题并不会因为使用框架不同,而解决方案不同,所以和框架没有关系。
我举个例子:
首先一个管理系统,我们首先会先登录,登陆之后,这个账号会有一个默认的所属组,然后不管切换那个路由,哪个菜单,请求的这些接口返回的数据都是这个组下面的数据,这个时候,我切换了所属组,比如我切换成了第八组,我需要页面上的数据都变成第八组中的数据,但是我不清楚你可能会在哪个页面中切换,这个页面有多少个组件呢,每个组件又是否嵌套其他组件,但是这些组件中的数据,请求数据的接口都需要重新请求一遍,因为我所属组变了,我要看切换组的数据,但是我不想使用window.location.reload,因为这样体验不好,会使屏幕闪一下,就是会白屏一下。我想切换完之后,数据立马变,就像是只走了axios,将最新的数组请求了过来,这个问题困扰了一晚上,越想越复杂。
解决方案:
于是睡了一觉,今天早上有了思路,针对于这样的问题,首先我们清楚的知道,页面是路由匹配之后产生的,所以在这个路由的时候,我切换了组,并且告诉了后端,我这个用户从这个组切换成了这个组,然后返回结果为成功的时候,我们才能使页面刷新,就是所谓的请求接口,将页面所有的接口从新走一遍。
这个时候,我们已经将问题扩大化,问题有了一个归纳,那就是将问题考虑的面光了,我们升级到了路由级别,这个时候我们会想到路由出口,对于react就是Route,而vue的话就是router-view这个路由总出口,我们需要考虑的变了,变成了再切换组成功之后,怎么使路由出口重新渲染一遍,这个时候我们熟悉react或者vue的话,我们可以很快的考虑到一个属性,那就是key,这就是终极解决方案,key!
因为vue或者react 会根据你当前这个key是否改变来判断是否需要重新渲染这个标签或者组件,key变化 整个路由出口的所有路由都会重新渲染,这也是为什么for中用key的原因了。所以我们切换成功之后,将路由出口的key属性进行替换,就说明,我们告诉框架,我们这个路由出口中的组件需要重新渲染,ok,成功解决问题。