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

使用vue和vue路由器确保视图顺序的最佳实践

邰胤
2023-03-14

我用Vue创建了一个应用程序,带有一些不同的视图/组件。视图/组件必须按特定顺序运行(Main Page-

在学习Vue的过程中,我使用v-if指令管理导航,该指令运行良好,因为没有URL,因此我能够在每个视图/组件中实现逻辑,如

//pseudocode in each view/component
checkConditionsToMoveOn ? moveToNextPae : showErrorWithModalAndStayOnPage;

越来越专业,我实现了vue路由器,不知何故打破了我的应用程序,因为我现在能够欺骗逻辑通过一个步骤,只需手动更改网址。

我可以考虑实施一些导航保护,但随后我必须将条件移动到我的路由器/索引。js文件,我认为它不是很漂亮。

有没有解决这个问题的最佳实践?

我很感激提示,谢谢。

共有2个答案

江亮
2023-03-14

我也有类似的问题。

我认为最好的解决办法是把步骤放在单一路线上。这很容易处理,也很难欺骗逻辑。

但是,如果出于某些原因必须将步骤分为多个路径(每个步骤都太大,无法放入单个路径或…),您可以将步进计数器用作全局(路由器视图上方)。

我建议两种方法来设置全局值。

  1. 在应用程序中设置值。vue(包含路由器视图)作为数据。为每条路线提供价值道具。每个路由检查步骤是否有效,并使用$router将url更改为有效步骤。更换以防止向后导航。如果步骤对此url有效,请在更改url之前处理逻辑并发出新步骤号

应用程序。vue

<template>
  <router-view :step="fooStep" @changeStep=changStep />
</template>

<script>
export default {
  data () {
    return {
      fooStep: 0
    }
  },
  methods: {
    changeStep (value) {
      this.step = value
    }
  }
}

一些omponent.vue

<script>
export default {
  name: 'Step3', /* optional */
  props: ['step'],
  mounted () {
    /* some logic to check step is valid */
    if (this.step !== 3) {
      this.$router.replace(this.step > 0 ? '/step' + this.step : '/')
    }
  },
  methods: {
    submit () {
      ...
      /* after submit data, send signal to App.vue to change step value */
      this.$emit('changeStep', 4)
      /* change url */
      this.$router.replace('step4')
    }
  }
}
</script>

一些omponent.vue

<script>
export default {
  name: 'Step3', /* optional */
  mounted () {
    /* some logic to check step is valid */
    const step = this.$store.state.step
    if (step !== 3) {
      this.$router.replace(step > 0 ? '/step' + step : '/')
    }
  },
  methods: {
    submit () {
      ...
      /* after submit data, store new step value in vuex */
      /* change the value directly is not good */
      this.$store.state.step = 4 
      /* change url */
      this.$router.replace('step4')
    }
  }
}
</script>

澹台权
2023-03-14

使用Vuex跟踪步骤进度的当前状态:

state: {
  step: 1
}

当用户访问任何步骤时,您将检查此状态。如果请求的步骤路由与此不匹配,您将重定向到它。要实现这一点,请使用route params定义路由:

// import store from '@/store';
{
  path: '/step/:sid',
  name: 'step',
  component: Step,
  ...

现在,您可以将应用程序定向到http://localhost:8080/step/5。变量to。params。sid将匹配该路由中的5。因此,在进入前的保护中,检查参数是否与商店的步骤匹配。

  ...
  beforeEnter: (to, from, next) => {
    const nextStep = parseInt(to.params.sid);   // convert string param to number
    if (nextStep === store.state.step) {        // is this the current allowed step?
      next();                                   // if so, it's ok
    } else {                                    // if not, direct to that step
      next({ name: 'step', params: { sid: store.state.step }})
    }
  }
},

每当一个步骤完成时,您将增加存储步骤,然后将路由器引导到下一个步骤。

额外:

您还可以更改if条件以允许访问前面的步骤:

if (nextStep > 0 && nextStep <= store.state.step) {

 类似资料:
  • 使用vue 2、vue路由器2和vuex 2构建单页应用程序,但不更新 /src/main。js /src/路由器/索引。js /src/路由器/路由。js /src/store/index。js /src/view/index。vue /src/App。vue 我不知道代码有什么问题,

  • 官方路由 对于大多数单页面应用,都推荐使用官方支持的vue-router库。更多细节可以看vue-router文档。 从零开始简单的路由 如果只需要非常简单的路由而不需要引入整个路由库,可以动态渲染一个页面级的组件像这样: const NotFound = { template: '<p>Page not found</p>' } const Home = { template: '<p>home

  • 本文向大家介绍详解vue-router 命名路由和命名视图,包括了详解vue-router 命名路由和命名视图的使用技巧和注意事项,需要的朋友参考一下 说明:vue-router的几个文章中例子是连贯的,因此对哪块有疑问请翻阅按发表时间排序的其他文章。 一、概述 给路由定义不同的名字,根据名字进行匹配 给不同的router-view定义名字,router-link通过名字进行对应组件的渲染。 二、

  • 我正在尝试在我的nginx服务器上设置vue路由器。我遇到的问题是,如果我直接在浏览器中输入url,我的路线就不起作用。 我尝试了vue路由器文档中描述的服务器配置,以及建议的堆栈溢出类似配置。我当前的nginx位置配置如下: 所做的就是将任何路径重定向到我的根组件(path:),而不是。这确实有意义,并且似乎只重定向到索引文件。我如何重定向直接链接的到路由在我的VueJS应用程序? 以下是我的v

  • 我的任务是创建一个支持typescript的vue3应用程序,我还必须使用vuex进行状态管理,使用vue路由器进行基本路由。但我无法在此项目中使用vue cli 我目前的代码: 由于我从未在vue项目中使用过typescript 您能否向我推荐一些博客、教程,其中有人使用这些工具从头开始构建vue3应用程序,但没有vue cli? 全速行驶: 在VueJS 3.0框架上使用TypeScript编

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