当前位置: 首页 > 知识库问答 >
问题:

Vue路由器重新加载组件

金高飞
2023-03-14

我有几个路线,每个路线装载3个组件。所有管线上的两个组件都相同。当我在这些路由之间移动时,我希望传递新数据,在组件的某个初始化事件上,我希望填充该组件的数据,以便它反映在UI上。我还想重新触发正在加载的组件的引导动画。我该怎么做呢。因为现在,我不知道在组件的生命周期中,我将在哪里获取数据,并使用这些新数据重新提交组件。具体来说,在myapps/1和/newapp/I中有一个主视图组件和一个侧栏组件。在/newapp/URL中,我希望侧边栏上的所有图标都是红色的(主视图上没有填充任何内容),主视图应该是空的。在myapps/1上,我想将服务器上的数据加载到主视图中,如果所有数据都已填充,我希望侧边栏上的图标为绿色。现在发生的事情我加载myapps/1,单击侧边栏中的第二个项目,主视图将更改为第二个视图。然后我就去了。推送(“/newapp/”),边栏停留在第二个项目和第二个主视图上。因此router.push(“/myapps/”)不会重新加载我的边栏和主视图。

编辑:

在这里,您可以看到我的路线、边栏和默认值是相同的。

const routes = [
  {
    path: "/myapps/newproject",
    components: {
      default: ProjectMain,
      "breadcrumbs": BreadcrumbsNewProject,
      "sidebar": SidebarProject,
     }
  },
  {
    path: "/myapps/:id",
    components: {
      default: ProjectMain,
      "breadcrumbs": BreadcrumbsCurrentProject,
      "sidebar": SidebarProject,
    }
  },
  {
    path: "/myapps/newversion/:id",
    components: {
      default: ProjectMain,
      "breadcrumbs": BreadcrumbsNewVersion,
      "sidebar": SidebarProject,
    }
  }
];

这是我的主要任务。vue

<template>
  <div class="wrapper wrapper-content">
    <component :is="currentProjectMain"></component>
  </div>
</template>

这是我在索引中的路由器视图。html:

<router-view name="sidebar"></router-view>

我在索引中还有一个。html,默认值为:

<router-view></router-view>

当我单击侧边栏上的某个项目时,我会向ProjectMain发出事件以关闭该组件。如下所示:在侧边栏中:

eventBus.$emit("currentProjectMainChanged", "appOverview");

或者

eventBus.$emit("currentProjectMainChanged", "appSettings");

而在ProjectMain中:

eventBus.$on("currentProjectMainChanged", function(data) {
  if(data === "appOverview") {
    self.currentProjectMain = CurrentProjectAppOverview;
  }else if(data === "appSettings") {
    self.currentProjectMain = CurrentProjectSettings;
  }
});

如果我得到了"/myapps/: id"。它加载了侧边栏和ProjectMain,我用这个引导类得到了侧边栏和ProjectMain的一点动画:

默认情况下,侧边栏中选择appOverview,CurentProjectAppOverview.vue作为ProjectMain中的组件加载。比我点击侧边栏中的appSet,类被添加到侧边栏中的项目中,以将其标记为选中,并在ProjectMain MONtProjectS中ettings.vue作为组件加载。

但在面包屑中,我有一个按钮可以转到“/myapps/newversion/:id”,这就是问题所在。当我点击进入“/myapps/newversion/:id”(router.push(“/myapps/newversion/”id)) )侧栏上的第二项保持选中状态(appSettings)并位于ProjectMain CurrentProjectSettings中。vue仍然处于加载状态,我没有获得侧栏和ProjectMain的引导动画,组件也没有经历其生命周期。

当我点击按钮转到/myapps/newversion/: id时,我想要的是我的引导动画(

侧边栏中的每个项目都有彩色按钮。如果我从“/myapps/:id”转到“/myapps/newversion/:id”,我想将数据从服务器加载到CurrentProjectAppOverview。如果所有数据都已填充,我希望侧边栏上的按钮为绿色,如果没有,则应为红色。

所以简而言之,当在这两条路线之间移动时,我希望能够加载数据并填充我想要的字段,我希望选择并加载引导动画和默认视图,它们应该经历整个生命周期。现在路由器只是重复使用它们。

所以类似于“重新加载组件:true”,或者销毁并重新创建组件。

我可以复制侧边栏项目。vue和ProjectMain。vue并重命名它们,在每个路由中基本上加载一个副本,但这意味着我必须以不同的方式编写相同的代码。vue文件。

之前有一个选项将YouComponent.route.canReuse设置为false,这将做我想要的,我认为,但它在最新版本中被删除。


共有3个答案

益泰平
2023-03-14

看起来你正在使用vue路由器。

我没有你的密码,但我可以告诉你我是如何处理的。请参见命名视图。

这是我的包中的路由器地图。js文件:

const router = new VueRouter({
routes: [
    { path: '/',
      components: {
        default: dashboard,
        altside: altSide,
        toolbar: toolbar
      },
    },
    { path: '/create',
      components: {
        default: create,
        altside: altSide,
        toolbar: toolbar
      },
    },
    { path: '/event/:eventId', 
        name: 'eventDashboard',
        components: { 
            default: eventDashboard,
            altside: altSide,
            toolbar: eventToolbar,
        },
        children: [
            { path: '/', name: 'event', component: event },
            { path: 'tickets', name: 'tickets', component: tickets},
            { path: 'edit', name: 'edit', component: edit },
            { path: 'attendees', name: 'attendees', component: attendees},
            { path: 'orders', name: 'orders', component: orders},
            { path: 'uploadImage', name: 'upload', component: upload},
            { path: 'orderDetail', name: 'orderDetail', component: orderDetail},
            { path: 'checkin', name: 'checkin', component: checkin},
        ],
    }
]
})

我有“默认”、“altside”和“工具栏”的命名视图,我为每个路径分配一个组件到命名视图。

后半部分是在父组件中分配名称

<router-view  name="toolbar"></router-View>   

这是我的父模板:

<template>

    <router-view class="view altside" name="altside"></router-view>
    <router-view class="view toolbar" name="toolbar"></router-view>
    <router-view class="view default"></router-view>
</template>

所以,我所做的是告诉父模板查看路由器视图的命名视图。根据路径,拉出我在路由器地图中指定的组件。

对于我的“/”路径工具栏==工具栏组件,但在“/create”路径工具栏=事件工具栏组件中。

默认组件是动态的,这允许我使用子组件,而无需交换工具栏或altside组件。

阎安邦
2023-03-14

部分原因如下:https://forum.vuejs.org/t/vue-router-reload-component/4429

我想出了一个适合我的解决方案:

首先,我向jQuery添加了一个新函数,用于在加载组件时重新触发引导动画。

$.fn.redraw = function(){
    return $(this).each(function(){
        var redraw = this.offsetHeight;
    });
};

在组件中:

export default{
        created:function(){
            this.onCreated();
        },
        watch: {
            '$route' (to, from) {
                //on route change re run: onCreated
                this.onCreated();

                //and trigger animations again
                $("#breadcrumbsCurrentProject").find(".animated").removeClass("fadeIn").redraw().addClass("fadeIn");
            }
        }
}

我调用onCreated() 方法当组件加载、路由重新加载或相同路由的ID更改但组件保持不变时,我只需再次调用该方法。这将处理新数据。

至于重新触发引导动画,我使用重绘();函数,我添加到jQuery在应用程序的开始。

$("#breadcrumbsCurrentProject").find(".animated").removeClass("fadeIn").redraw().addClass("fadeIn");

逑阳泽
2023-03-14

我也面临同样的问题。我将引用一个找到的答案,这是非常简单和伟大的。最简单的解决方案是将:key属性添加到:

<router-view :key="$route.fullPath"></router-view>

这是因为如果对同一组件进行寻址,Vue路由器不会注意到任何更改。使用该键,对路径的任何更改都将触发使用新数据重新加载组件。

 类似资料:
  • 我有一个关于Vuejs和Vue路由器的项目。当用户登录系统时,服务器返回一个带有令牌、用户名和名字的Json文件,该文件存储在localstorage中,以便在以下请求中使用。第一个名称在布局中用于在导航栏中显示欢迎消息。注销后,localstorage被清除,问题就在这里,当其他用户在消息welcome not reload中使用新的名字付费时。

  • 我在这个拉请求中看到: > 重新加载当前路径并再次调用数据钩子 但是当我尝试从Vue组件发出以下命令时: 我得到这个错误: 我搜索了文档,但没有找到任何相关的内容。vue/vue路由器是否提供类似的功能? 我感兴趣的软件版本有: 另外,我知道是备选方案之一,但我正在寻找本机Vue选项。

  • 我有一个显示多条路线的组件(步骤1、步骤2、步骤3…)一个接一个。我导航并传递属性,如 路线定义为 这很有效,直到我重新加载页面/路由,因为数据丢失。所以我有点想在加载组件后从父级获取数据。 我的一个想法是使用本地存储,但这感觉不对。 我是Vue的新手,我想问一下这里的最佳实践是什么。是否像这里描述的那样使用vue路由器重新加载组件?请给我一个提示。

  • 我有一个问题,看起来很简单,但现在不那么简单了(对我来说): 我已使用Vue cli(路由器、VueX、PWA)设置了一个Vue项目。我一如既往地设置了一些路由(按照文档中的建议)和VueX中的一些状态字段: 在我的视图/组件中,我在实例上使用方法,以编程方式死记硬背,如下所示: ,其中是等待的

  • 我希望使用相同的路由路径,根据用户角色为我的用户加载稍微不同的视图。 以前,我已经加载了基于当前域的不同路由: 这种方法只依赖于子域,子域在创建时可用,因此所有内容都可以是同步的。我必须对用户进行身份验证,根据其角色加载正确的路由,然后导出路由器以初始化vue应用程序。 理想情况下,我可以加载基于用户角色的,,,其中可以包含角色的所有路由定义。 我正在使用Feathers-vuex,但我似乎不能等

  • 我使用的是角度2.0.0-阿尔法.30版本。当重定向到其他路由时,刷新浏览器,其显示无法获取/路由。 你能帮我弄清楚为什么会发生这个错误吗?