【问题标题】:Dynamically integrate Vuetify v-stepper with Vue router将 Vuetify v-stepper 与 Vue 路由器动态集成
【发布时间】:2019-01-22 16:13:04
【问题描述】:

我想将 vuetify 的 v-stepper 与 vue 路由器集成。我的要求如下:

  • 每个步骤都有自己的路线(例如/myform/step1/myform/step2/myform/step3 等)
  • 每个步骤都是独立的组件,它是动态加载的(延迟加载)。
  • 每个步骤都是动态创建的(例如通过循环)。

这更像是一个“什么是最好的方法”之类的问题。我尝试了多种解决方案,但没有一个符合我的要求。

  • 我尝试创建嵌套路由并将router-view 放置在v-stepper-content 中。下面的例子。我在这里遇到的问题是无法同步更新position(请参阅 v-stepper 元素)和路线。因此,您将始终在步骤更新之前看到路线更新。
<v-stepper v-model="position" vertical>
  <template v-for="(item, index) in steps">

          <v-stepper-step :complete="position > index + 1" :step="index + 1">
            <h2>
              {{item.title}}
            </h2>
          </v-stepper-step>

          <v-stepper-content :step="index+1">
            <router-view></router-view>
          </v-stepper-content>

  </template>
</v-stepper>
  • 我尝试的另一个解决方案是直接异步/动态加载组件(因此无需路由器)。但是,然后我失去了使用浏览器的后退和下一步按钮浏览我的 v-stepper 的美妙能力。

根据我的经验,最大的缺陷是(与例如 v-tab 相反)是每个步骤都必须有自己的v-stepper-content。如果我要使用选项卡执行此操作,我只需创建一个 tab-item 并更新视图。我不能用v-stepper 做到这一点,因为它不会继续到下一个“步骤”。

有人有创造性的方法吗?

【问题讨论】:

  • 当用户直接进入第二步/第三步时,你打算如何处理?加载哪个组件?数据从何而来?
  • 提交验证需要完成所有步骤。加载哪个组件取决于 route prop。数据在组件中被硬编码。
  • 有什么解决办法吗?
  • 我现在使用&lt;component :is=""&gt; 并手动将带有参数的路由推送到vue 路由器(所以你会得到?step=1?step=2 等)。但这不是真正的解决方案。

标签: javascript vue.js vue-router vuetify.js v-stepper


【解决方案1】:

作为对@tmfmaynard 的补充回答,为了在页面刷新后将正确突出显示的步进器与您当前的路线对齐,这里是代码。

 <v-stepper v-model="e1" alt-labels non-linear>
    <v-stepper-header class="elevation-0">
      <v-stepper-step 
        step="1" 
        class="caption" 
        editable
        @click="$router.push({name: 'name'}).catch(err => {})" 
      >
      </v-stepper-step>
    </v-stepper-header>

    <v-stepper-items>
      <v-stepper-content step="1">
        <router-view />
      </v-stepper-content>
    </v-stepper-items>
  </v-stepper>

<script>
export default {
  data () {
    return {
      e1: 1
    }
  },

  created() {
    this.getStepper()
  },

  methods: {
    getStepper() {
      const path = this.$route.path.split('/')
      if(path[path.length-1].toLowerCase() === 'your-router-path') {
        this.e1 = 1
        // this.e1 = 1 = <v-stepper-step step="1" />
        // this.e1 = 2 = <v-stepper-step step="2" />
        // and so on.
      }
    }
  }
}

【讨论】:

    【解决方案2】:

    我能够通过执行以下操作来实现这一点:

    <v-stepper-step @click="goToRoute('step1')">
    

    goToRoute(name) {
       this.$router.push({'name': name})
    }
    

    你应该可以这样做:

    <v-stepper-step @click="$router.push({'name': name})">
    

    【讨论】:

    • 我试过这个并且它有效,但我注意到当你刷新页面时,步进器将返回到它的默认值(步进器 1),但加载的页面仍然是你点击的最后一个步进器。如果我们刷新页面,我们如何将当前步进器设置为活动?
    • 想通了。我将对此发布一个补充答案。
    猜你喜欢
    • 2020-07-14
    • 2020-07-30
    • 2019-01-26
    • 2021-05-21
    • 2021-11-22
    • 2019-12-05
    • 2020-09-13
    • 2020-05-09
    • 2019-05-24
    相关资源
    最近更新 更多