Heim > Web-Frontend > js-Tutorial > Hauptteil

Vue-Router, dynamischer Routing-Betrieb, Sub-Routing

php中世界最好的语言
Freigeben: 2018-06-06 11:24:57
Original
3185 Leute haben es durchsucht

Dieses Mal werde ich Ihnen die Vorsichtsmaßnahmen für das dynamische Routing-Vorgangs-Sub-Routing im Vue-Router erläutern. Das Folgende ist ein praktischer Fall, schauen wir uns das an.

Dynamisches Routing des Vue-Routers

vue-router官网上面是这样说的
// 带查询参数,变成 /register?plan=private
router.push({ path: 'register', query: { plan: 'private' }})
然后,我就这样写了:
this.$router.push({path:'manage', query: {id: 'tasklist'}})1
结果很明显,失败了。然后我就默默的再次看了一下官网,结果发现了这句话
// 命名的路由
router.push({ name: 'user', params: { userId: 123 }})
// 带查询参数,变成 /register?plan=private
router.push({ path: 'register', params: { plan: 'private' }})
注意:如果提供了 path,params 会被忽略,上述例子中的 query 并不属于这种情况。取而代之的是下面例子的做法,你需要提供路由的 name 或手写完整的带有参数的 path:
const userId = 123
router.push({ name: 'user', params: { userId }}) // -> /user/123
router.push({ path: `/user/${userId}` }) // -> /user/123
// 这里的 params 不生效
router.push({ path: '/user', params: { userId }}) // -> /user
谨记啊,动态实现二级路由,需要先用变量保存二级路由名称(let router = 'tasklist'),然后调用this.$router.push({path: `/user/${router}`}).
Nach dem Login kopieren

Werfen wir einen Blick auf die Lösung, jede Unterroute zu einer unabhängigen Komponente unter dem dynamischen Routing des Vue-Routers zu machen

Da vue-router eine Komponentenwiederverwendungsstrategie für verschachteltes Routing anwendet, ist dies in den meisten Szenarien tatsächlich ein effizienter Ansatz, aber wenn Sie auf diese Situation stoßen:

besteht darin, die Koexistenz mehrerer Unterrouten zu erfordern. Wenn häufig hin und her gewechselt werden muss, ist es sehr wünschenswert, jede Unterroute zu einer unabhängigen Komponente zu machen, obwohl Sie durch Abhörrouten wechseln können

watch: {
   '$route'(to) {
    if (to.meta.path === '/page/buy-details') {
     this.id = to.params.id;
     this.state()
    }
   }
  },
Nach dem Login kopieren

Die Verarbeitung aktualisierter Daten in Echtzeit, einschließlich der Animationsseite oben, ist jedoch sehr mühsam, damit Benutzer vor dem Wechsel genau zum Anzeigestatus der Seite zurückkehren können Da es zu viele Dinge gab, habe ich eine Lösung gefunden:

Die Sub-Routing-Komponente beinhaltet keinen tatsächlichen Geschäftscode, sondern verwaltet nur eine Liste der geöffneten IDs Hier umgeschaltet, bestimmt es die IDs und diejenigen, die nicht geöffnet wurden. Fügen Sie die tatsächlichen Sub-Routing-Komponenten hinzu, schleifen Sie sie durch diese Liste und zeigen Sie die aktuelle ID an, sodass jede Instanz unabhängig sein kann.
Ich habe ein Mixins geschrieben Basierend auf dieser Idee

details -page.js

export default {
 watch: {
  '$route'(to, from) {
   this.detailsLeave(from);
   this.detailsOpen(to);
  }
 },
 data() {
  return {
   pagePath: '',
   pageId: 0,
   pages: {}
  }
 },
 methods: {
  /**
   * 子页面打开触发
   * @param route
   */
  detailsOpen(route) {
   if (this.detailsPathGet(route.path) === this.pagePath) {
    if (!this.pages[route.params.id]) {
     this.$set(this.pages, route.params.id, {
      id: route.params.id,
      scrollTop: 0
     })
    }
    //路由打开 跳转滚动条
    this.pageId = route.params.id;
    this.$nextTick(()=>{
     this.$parent.$el.firstChild.scrollTop = this.pages[route.params.id].scrollTop;
    });
   }
  },
  /**
   * 路由切换触发
   * 判断离开的路由是否是当前页面,如果是则记录滚动条高度
   * @param route
   */
  detailsLeave(route) {
   if (this.detailsPathGet(route.path) === this.pagePath) {
    if (this.pages[route.params.id]) {
     //记录滚动条高度 此处针对ea-admin后台 不同的框架要记录的滚动条el不同
     this.pages[route.params.id].scrollTop = this.$parent.$el.firstChild.scrollTop ;
    }
   }
  },
  /**
   * 子页面关闭函数
   * @param id
   */
  detailsClose(id) {
   delete this.pages[id]
  },
  /**
   * 取路由不含最后一项参数的地址
   * @param path
   * @returns {string}
   */
  detailsPathGet(path) {
   const i = path.lastIndexOf('/');
   return path.substr(0, i);
  }
 },
 mounted() {
  //通过当前路由地址创建页面识别地址 注:只对path: '/user/:id' 有效 当 path: /user/:id/profile 失效
  this.pagePath = this.detailsPathGet(this.$route.path);
  //执行第一次子页面打开
  this.detailsOpen(this.$route);
  //监听标签关闭消息 此处针对ea-admin后台 不同框架监听关闭方式不同
  this.$tabs.onRemove((page, next) => {
   //收到标签关闭回调,判断关闭的是否是当前页面
   if (page._path === this.pagePath) {
    //触发子页面删除
    this.detailsClose(page.id)
   }
   next()
  })
 }
}
Nach dem Login kopieren

Details.vue

<template>
 <p>
  <your-component
    v-for="item in pages"
    :id="item.id"
    :key="item.id"
    v-show="item.id === pageId">
  </your-component>
 </p>
</template>
<script>
 import YourComponent from '';
 import detailsPage from '../mixins/details-page'
 export default {
  name: 'DetailsPage',
  components: {YourComponent},
  mixins: [detailsPage],
 }
</script>
Nach dem Login kopieren

Ich glaube, Sie haben die Methode gemeistert, nachdem Sie den Fall in diesem Artikel gelesen haben Informationen, bitte beachten Sie andere verwandte Artikel auf der chinesischen PHP-Website!

Empfohlene Lektüre:

Wie man Node verwendet, um einen Roboter für ein persönliches Konto zu erstellen

vue.js steuert die Benutzeranmeldung

Das obige ist der detaillierte Inhalt vonVue-Router, dynamischer Routing-Betrieb, Sub-Routing. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage