Vue中解决路由切换,页面不更新的实用方法

摘要:
路由之间的切换,其实就是组件之间的切换,不是真正的页面切换。在路由中进行切换结果这时候路由就会更新了。如果我从page1跳到page2不同组件的话,我其实是不用担心组件更新问题的。④、点击刷新本身就能触发刷新路由了,是不是很实用。

前言:vue-router的切换不同于传统的页面的切换。路由之间的切换,其实就是组件之间的切换,不是真正的页面切换。这也会导致一个问题,就是引用相同组件的时候,会导致该组件无法更新,也就是我们口中的页面无法更新的问题了。

一、问题呈现

Vue中解决路由切换,页面不更新的实用方法第1张

Vue中解决路由切换,页面不更新的实用方法第2张

Vue中解决路由切换,页面不更新的实用方法第3张

在路由中进行切换结果

Vue中解决路由切换,页面不更新的实用方法第4张

Vue中解决路由切换,页面不更新的实用方法第5张

这时候会发现input标签的value值并没有随着路由的改变而改变。并没有更新

二、解决方案①

给<router-view :key="key"></router-view>增加一个不同:key值,这样vue就会识别这是不同的<router-view>了。

Vue中解决路由切换,页面不更新的实用方法第6张

在路由中进行切换结果

Vue中解决路由切换,页面不更新的实用方法第7张

Vue中解决路由切换,页面不更新的实用方法第8张

这时候路由就会更新了。不过这也就意味着需要把每个<router-view>都绑定一个key值。如果我从page1跳到page2不同组件的话,我其实是不用担心组件更新问题的。

三、解决方案②

给<router-view v-if="routerAlive"></router-view>增加一个不同v-if值,来先摧毁<router-link>,然后再重新创建<router-link>起到刷新页面的效果。

Vue中解决路由切换,页面不更新的实用方法第9张

①因为router-link组件有取消点击事件,这里的.native就是为了触发组件原生标签中的事件。

②this.$nextTick(()=>{}) 的用法是等this.routerAlive = false; 触发后再执行 this.routerAlive = true; 从而起到摧毁再创建的效果。

四、解决方案②的延伸,在路由内部触发路由的刷新。

方案①,方案②都是通过路由的外部来更新路由的,那如果想从路由内部来更新路由呢?

1 <!-- App.vue根组件代码 -->
2 <template>
3   <div class="app">
4       <div class="slide">
5           <ul>
6               <li><router-link to="/page1/freddy" >freddy</router-link></li>    
7               <li><router-link to="/page1/nick" >nick</router-link></li>    
8               <li><router-link to="/page1/mike" >mike</router-link></li>    
9           </ul>    
10       </div>
11       <div class="content">
12              <router-view v-if="routerAlive"></router-view>
13       </div>
14   </div>
15 </template>
16  
17 <script>
18     export default{
19 data(){
20         return{
21         routerAlive:true
22 }
23 },
24     provide(){    //在父组件中创建属性
25             return{
26                 routerRefresh: this.routerRefresh
27 }
28 },
29 methods:{
30 routerRefresh(){
31             this.routerAlive = false;
32         this.$nextTick(()=>{
33             this.routerAlive = true;
34 });
35 }
36 }
37 }
38 </script>
1 <!-- 组件Page1代码 -->
2 <template>
3     <div class="page-1">
4         名字:<input type="text" v-model="value"><br/>
5         <button @click="linkToNick1">跳转到nick,不刷新路由</button>
6         <button @click="linkToNick2">跳转到nick,并刷新路由</button>
7         <br/>
8         <button @click="linkToSelf1">跳转到本身,不刷新路由</button>
9         <button @click="linkToSelf2">刷新本身</button>
10     </div>
11 </template>
12 <script type="text/javascript">
13     export default{
14     name:'page1',
15     inject:['routerRefresh'],   //在子组件中注入在父组件中出创建的属性
16 mounted(){
17         this.value = this.$route.params.name;
18 },
19 data(){
20         return{
21             value:''
22 }
23 },
24 methods:{
25 linkToNick1(){
26         this.$router.push('/page1/nick');
27 },
28 linkToSelf1(){
29         this.$router.push('/page1/freddy');
30 },
31 linkToNick2(){
32         this.$router.push('/page1/nick');
33         this.routerRefresh();
34 },
35 linkToSelf2(){
36         this.routerRefresh();
37 }
38 }
39 }
40 </script>
41  
42 <style type="text/css">
43     button { margin-top:10px;}
44 button:hover { background:#ff9500; }
45 </style>

Vue中解决路由切换,页面不更新的实用方法第10张

①、当我们点击"跳转到nick,不刷新路由" 时,会发现input的value值并没有改变。

Vue中解决路由切换,页面不更新的实用方法第11张

②、当我们点击"跳转到nick,并刷新路由" 时,这时候input的value值就已经改变了。

Vue中解决路由切换,页面不更新的实用方法第12张

③、当我们在input中输入随便输入些数值,然后点击"跳转到本身,不刷新路由",会发现input里面的内容没有刷新。

Vue中解决路由切换,页面不更新的实用方法第13张

④、点击刷新本身就能触发刷新路由了,是不是很实用。

Vue中解决路由切换,页面不更新的实用方法第14张

免责声明:文章转载自《Vue中解决路由切换,页面不更新的实用方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C# 日期格式的处理与数据库表日期类型解决Chrome浏览器访问https提示“您的连接不是私密连接”的问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Flutter实战视频-移动电商-39.路由_Fluro的路由配置和静态化

39.路由_Fluro的路由配置和静态化 handler只是单个路由的配置,这节课我们要学习路由的整体配置 整体配置 新建routers.dart文件来做整体配置 detailsHandler就是我们在router_handler里面定义的detailsHandler 当路由不存在的时候,给用户一个反馈。router.notFoundHandler 这...

vue-cli3 创建项目路由缺失问题

1、在项目中新建一个router.js router.js import Vue from 'vue' import Router from 'vue-router' import Home from './components/home.vue' Vue.use(Router) export default new Router({...

le5le-topology开发纪要

组态开源库  国内的有些新一点的开源项目,都会有部分公开,有部分设置为企业版.开源要生存,自然会采用这种方式.这个开源项目来说 当前通过几天的读资料之后发现,公开的部分svg文件都是基础的那几个, 物联网行业之类的不在开源之中. 继续看看,能否加入自定义的方式使用这个库  关于企业版与公用版: 个人总结:说明文档中企业版是0.2以上版本,从更新的压缩包版本...

11.Vue技术栈开发实战-从SplitPane组件谈Vue中如何“操作”DOM

vue中是数据驱动视图。   创建组件的文件夹叫做split-pane 在路由列表里面注册一下 添加这个vue页面 创建组件的vue文件,设置name为SplitPane 创建index.js.把组件引进来,并导出去 引入这个组件,然后注册这个组件。 容器中分成两个区域,通过拖动来改变两个区域的比例。 还可以上下,嵌套使用。 分为三个部分,左边的区域,...

vue,react项目中使用webpack打包中直接打包成压缩包的方法

这里以react项目为例,(vue项目类似) 为改造的 pageage.json 中 scripts 位置的代码 "scripts": { "start": "node scripts/start.js", "build": "node --max_old_space_size=4096 scripts/build.js", "...

vue 内联样式style中的background

转载:点击查看原文 在我们使用vue开发的时候 有很多时候我们需要用到背景图(特别是这个背景图是变量时) 这个时候会直接使用 内联样式 直接把你拿到的数据拼接上去 注意 在vue中直接使用style时 花括号一定别忘记 还有就是你的url一定要加引号拼接 :style = ' { backgroundImage : " url ( " + item.i...