vue.js - 使用 v-if (vue.js、vue-router)处理模板中的后退按钮?

标签 vue.js vue-router

我有一个 Vue.js 组件,它显示客户列表。当用户单击其中一个时,它会切换到单个客户的编辑 View 。这是使用 v-if 测试数据字段“editMode”(设置为 true 或 false)来完成的。因此,模板有一个列表和一个编辑表单,显示的内容取决于“editMode”的状态。当用户单击客户时,会调用一个方法,将 editMode 切换为 true(从而隐藏列表并显示表单),当用户保存或取消时,会调用一个方法,将 editMode 切换回来,从而隐藏表单并显示表单。显示列表。

它作为一个系统工作正常,但我需要更好地处理后退按钮。目前,当用户编辑客户时,他们自然会期望单击后退按钮会将他们带回到他们来自的列表,但事实并非如此,目前它会将他们带回到他们来时的任何路线从以前。但客户的编辑环境并不是不同的路线,它只是模板的不同部分,使用 v-if/v-else 显示。如何让后退按钮按预期工作?我需要以某种方式使用history.pushState吗?我知道我可以通过使用导航防护来控制用户的去向,但这对我来说似乎是错误的方法。

后来:为了回应下面 Richard Matsen 的建议,我想到了另一种不需要太多重构的方法。我一直以错误的方式处理这件事。我应该始终考虑路线,如果我希望后退(和前进)按钮按我想要的方式工作,所以如果我希望用户能够返回到列表,我必须插入编辑状态回顾历史,这样他们就可以退出。但不同的路由可以使用相同的组件。当用户选择客户行或完成客户编辑时,我不应该直接更改组件方法中的“editMode”,而是应该使用带有参数的 router.push ,并使用一个监视(或 beforeRouteUpdate 导航守卫)来设置 ' editMode' 响应路由变化,并传递参数。这样,即使使用相同的组件,移动到编辑模式也是一次路由更改(用户可以从中返回)。我认为这应该可行 - 我会玩一玩。

最佳答案

我最近将子组件显示从 v-if 更改为子路由(出于 webpack 延迟加载的目的,但那是另一个故事了)。

以前是

<div>
   <sub-component v-if="showIt"></sub-component>
</div>

现在模板是

<div>
  <router-view></router-view>
</div>

子路由的配置如下

const routes = [
  { 
    path: '/maincomponent', name: 'MainComponent', component: MainComponent,
    children: [{ path: '/subcomponent', name: 'SubComponent', component: SubComponent }] 
  },

子组件路由是通过使用的方法激活的

this.$router.push('subcomponent')

并停用

this.$router.push('maincomponent')

我可以确认浏览器后退按钮可以返回页面,并且子组件已通过 v-if“插入”到页面中。

关于vue.js - 使用 v-if (vue.js、vue-router)处理模板中的后退按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46383960/

相关文章:

symfony - Vuetify 在 symfony 项目中

javascript - 为什么 vue <template> 对 v-bind 无效 :src?

javascript - 在 Vue.Filter 中使用 Vue.Mixin 不起作用

javascript - 路由嵌套数组后Vue js不渲染

vue.js - Vuetify v-tabs v-tab-item 溢出窗口宽度

vue.js - 如何在我的 vue-route 中使用 vue-i18n?

javascript - 如何在 Vue Test Utils/Jest 中模拟 Web API?

javascript - 如何更改照片中文字的颜色?

vue.js - 如何从 Vuex 状态使用 Vue Router?

javascript - Nuxt 打开链接到模态