中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Vue如何實現關聯頁面多級跳轉功能

發布時間:2021-03-17 14:16:17 來源:億速云 閱讀:447 作者:小新 欄目:開發技術

小編給大家分享一下Vue如何實現關聯頁面多級跳轉功能,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

背景

在項目開發過程中,經常會遇到從上一個頁面跳轉到下一個頁面的需求,俗稱 下鉆 。比如在概覽頁面的數據,需要查看詳情,點擊某個圖表或按鈕,即可跳轉到詳情頁面查看詳情數據。

目前為止,我們的項目中還沒有一個統一的頁面跳轉方法,實現頁面跳轉的方式也因人而異,并且現有的很多項目只能在兩個頁面之間來回跳轉,基本沒有完整的實現多個頁面互相跳轉的功能。

關聯頁面跳轉做為項目的常用功能,并且執行的都是重復性高的代碼邏輯,非常有必要把相關的邏輯抽出來,封裝成簡單易用的公共方法和公共組件。

目的

統一各個項目的關聯跳轉方法邏輯,封裝成簡單易用的公共組件。

方案設計

首先,分析一下關聯頁面跳轉大概的邏輯步驟:

  1. 進入 頁面 A ;

  2. 從 頁面A 跳轉到 頁面 B ;

  3. 進入 頁面 B ;

  4. 返回 頁面 A ;

  5. 進入 頁面 A ,即重新回到步驟 1 開始。

然后,對以上步驟進行細分:

  1. 假設步驟 1 是正常進入頁面,這時候沒有邏輯需要處理;

  2. 步驟 2 需要從 頁面 A 跳轉到 頁面 B ,要實現這一步,就必需知道 頁面 B 的路由地址,通過 VueRouter 跳轉到 頁面 B 的路由地址。并且如果 頁面 B 需要的一些查詢數據,就要把 頁面 B 的數據保存起來,等到步驟 3 使用;

  3. 進入 頁面B 后,如果要獲取 頁面 A 傳過來的一些查詢數據,就要先判斷是不是從 頁面 A 跳轉過來的,如果是,就從保存數據的地方獲取 頁面 A 傳過來的數據;

  4. 從 頁面 B 返回 頁面 A ,就必需知道 頁面 A 的路由地址,通過 VueRouter 跳轉到 頁面 A 的路由地址。這里的路由地址,需要在步驟 2 跳轉之前進行保存,這里才可以取到;

  5. 可以發現,步驟1和步驟5都是進入 頁面 A ,但是執行的邏輯卻不一樣,所以, 頁面 A 如果要恢復跳轉到 頁面 B 之前的一些數據,就要先判斷是不是從 頁面 B 跳轉回來的,如果是,就從保存數據的地方獲取跳轉之前 頁面 A 的數據;這里的跳轉之前的數據,需要在步驟 2 跳轉之前進行保存,這里才可以取到。

接下來,為了實現上述的邏輯,我們先確定用來保存 頁面 A 和 頁面 B 的數據的方法,這里采用的是 VUEX 。再梳理一下以上邏輯步驟,畫出流程圖。

流程圖

源頁面

Vue如何實現關聯頁面多級跳轉功能

目標頁面

Vue如何實現關聯頁面多級跳轉功能

具體實現

源頁面跳轉到目標頁面

這一步的邏輯寫在 VUEX 中,每次需要進行這一步操作,直接調 VUEX 中對應的方法即可。具體實現邏輯,就是先把源頁面和目標頁面的標識添加到路由參數上(目的是為了區分當前頁面是進行的目標頁面還是返回的源頁面),再保存源頁面和目標頁面的數據,然后進行路由跳轉。

在 store.js 中添加兩個以下兩個變量:

tgtPageParams: {}, // 關聯跳轉的目標頁面數據(只保留一項數據)
srcPageParams: [], // 關聯跳轉的源頁面數據(數組類型,保留多個頁面的數據,可以多層返回,直到返回初始頁面)

然后添加以下方法:

// 關聯跳轉,跳轉到目標頁面,并保存源頁面和目標頁面的數據到 Vuex
goTargetPage(state, options) {
  // 在源頁面的 query 添加 tgtPageName 標識,記住目標頁面
  options.srcParams.query = Object.assign({}, options.srcParams.query, { tgtPageName: options.tgtParams.name });
  // 在目標頁面的 query 添加 srcPageName 標識,記住源頁面
  options.tgtParams.query = Object.assign({}, options.tgtParams.query, { srcPageName: options.srcParams.name });

  state.srcPageParams.push(options.srcParams); // 保存源頁面數據
  state.tgtPageParams = options.tgtParams; // 保存目標頁面數據

  router.push({ name: options.tgtParams.name, query: options.tgtParams.query }); // 跳轉到目標頁面
},

目標頁面返回源頁面

這一步的邏輯寫在 VUEX 中,每次需要進行這一步操作,直接調 VUEX 中對應的方法即可。具體實現邏輯,就是從 state.srcPageParams 中取到源頁面的數據(包括路由地址和參數),然后進行路由跳轉。

在 VUEX 中添加以下方法:

// 關聯跳轉,跳轉回源頁面
goSourcePage(state, vm) {
  let obj = state.srcPageParams.slice(-1)[0]; // 取數組的最后一項
  // 如果 Vuex 有上一頁的數據,則根據 Vuex 的數據返回上一面
  if (obj && Object.keys(obj).length > 0) {
    router.push({ name: obj.name, query: obj.query }); // 進行跳轉
  }
  // 如果 Vuex 中沒有上一頁的數據,但是路由上有上一頁的標志,則根據路由標志返回上一頁(這是為了防止在詳情頁中刷新時,Vuex 數據丟失,無法返回上一頁的問題)
  else if (vm && vm.$route.query.srcPageName) {
    router.push({ name: vm.$route.query.srcPageName });
  }
},

進入目標頁面使用VUEX數據/返回源頁面恢復VUEX數據

這一步的邏輯是把上面方案設計中的 步驟 3 和 步驟 5 合并起來了,寫在公共函數文件中,每次需要進行這一步操作,直接調 Vue.prototype 中對應的方法即可。具體實現邏輯是:判斷當前頁面是源頁面還是目標頁面,如果是目標頁面,那就使用源頁面傳過來的數據,如果是源頁面,就恢復跳轉之前的數據。

在公共函數文件 utils.js 中添加以下方法,并掛載到 Vue.prototype 上:

/**
 * 關聯跳轉相關的頁面可以使用此方法
 * 1、源頁面:可以把保存到 Vuex 中的數據恢復到 data 中使用
 * 2、目標頁面:可以把源頁面傳遞到 Vuex 中的數據放到 data 中使用
 * 3、源頁面數據恢復后,刪除 Vuex 中對應的備份數據,刪除路由上保存的目標頁標識
 * @param vm {object} 必填 當前 Vue 組件實例
 */
$changeVueData: (vm) => {
  let tgtParams = store.state.tgtPageParams;
  let srcParams = vm.$store.state.srcPageParams.slice(-1)[0] || {}; // 取最后一個元素值
  let name = vm.$route.name;
  let query = vm.$deepCopyJSON(vm.$route.query); // 這里深拷貝是因為 $route.query 需要更新

  // 判斷當前頁是 目標頁面 還是 源頁面
  // 判斷條件是 先判斷路由名是否一致,再判斷指定的 query 的屬性值是否也一致
  let isTgtPage = tgtParams.name === name &&
    (tgtParams.checkKeys ? tgtParams.checkKeys.every(key => tgtParams.query[key] === query[key]) : true);
  let isSrcPage = srcParams.name === name &&
    (srcParams.checkKeys ? srcParams.checkKeys.every(key => srcParams.query[key] === query[key]) : true);

  // 如果當前頁面是目標頁面
  if (isTgtPage) {
    Object.assign(vm.$data, tgtParams.data || {}); // 將 源頁面傳過來的數據 更新到當前頁面的 data(),以便頁面進行查詢
  }
  // 如果當前頁面是源頁面
  if (isSrcPage) {
    Object.assign(vm.$data, srcParams.data || {}); // 跳轉前保存的數據 更新到當前頁面的 data(),以便頁面進行還原
    store.commit('popSourcePage'); // 將 srcPageParams 的最后一項數據刪除
    // 源頁面關聯跳轉邏輯結束后,清除掉當前頁路由上的目標頁標識,防止刷新頁面有問題
    delete query.tgtPageName;
    vm.$router.push({ name, query });
  }
},

返回上一頁按鈕

為了更方便的使用關聯跳轉功能,把返回上一頁按鈕封裝成了一個組件,具體實現代碼如下:

// back-button.vue
<template>
  <button class="primary-btn return-btn" v-if="showBackBtn" @click="backFn">
    <i class="return-icon"></i>{{ backText }}
  </button>
</template>
<script>
export default {
  name: 'back-button',
  props: {
    // 返回上一頁的文字
    backText: {
      type: String,
      default: () => '上一步'
    },
    // 返回上一頁的函數
    backFn: {
      type: Function,
      default: () => {}
    }
  },
  data() {
    return {
      showBackBtn: false,
    };
  },
  mounted() {
    this.setBackBtnShow();
  },
  activated() {
    this.setBackBtnShow();
  },
  methods: {
    // 更新返回上一頁按鈕的狀態
    setBackBtnShow() {
      this.$nextTick(() => {
        let srcPage = this.$store.state.srcPageParams.slice(-1)[0];
        this.showBackBtn = Boolean(srcPage && Object.keys(srcPage).length > 0);
      });
    },
  },
};
</script>
<style scoped lang="scss">
</style>

容錯部分

考慮到關聯跳轉的過程中,有可能用戶會突然中斷,或者刷新頁面等異常操作,設計了部分容錯機制:

// 根組件 App.vue
/*...省略的代碼...*/
watch: {
  // 監聽,當路由發生變化的時候執行
  $route(to, from) {
    // 如果即不是源頁面,也不是目標頁面,則清空 Vuex 中保存的數據
    // 防止在關聯跳轉的過程中切換菜單或者進行其他操作,導致 Vuex 中有上一次關聯跳轉殘留的數據
    if (!to.query.srcPageName && !to.query.tgtPageName) {
      this.$store.commit('clearTargetPage');
      this.$store.commit('clearSourcePage');
    }
  },
},
/*...省略的代碼...*/

使用示例

根據上述方案設計部分的步驟:

步驟 1 和步驟 5 ,進入 頁面 A ,邏輯在同個頁面,代碼如下:

// 頁面 A.vue
/*...省略的代碼...*/
mounted() {
  vm = this;
  vm.$changeVueData(vm); // 關聯跳轉相關頁面,每次進入頁面,必需執行 $changeVueData 函數,具體用法參考調用方法的注釋

  vm.ready();
},
/*...省略的代碼...*/
步驟 2,從 頁面A 跳轉到 頁面 B ,代碼如下:

// 頁面 A.vue
/*...省略的代碼...*/
methods: {
  // 跳轉到 B 頁面
  goUserSituation: function (name) {
    let srcParams = {
      name: vm.$route.name,
      query: vm.$route.query
    };
    let tgtParams = {
      name: 'user-situation',
      data: {
        checkedSystem: name
      }
    };
    vm.$goTargetPage(srcParams, tgtParams);
  },
},
/*...省略的代碼...*/

步驟 3,進入 頁面 B ,代碼如下:

// 頁面 B.vue
/*...省略的代碼...*/
mounted() {
  vm = this;
  vm.$changeVueData(vm); // 關聯跳轉相關頁面,每次進入頁面,必需執行 $changeVueData 函數,具體用法參考調用方法的注釋

  vm.ready();
},
/*...省略的代碼...*/
步驟 4,返回 頁面 A ,代碼如下:

// 頁面 B.vue
/*...省略的代碼...*/
<template>
  <div>
    <backButton :backFn="$goSourcePage"></backButton>
    /*...省略的代碼...*/
  </div>
</template>
/*...省略的代碼...*/

以上是“Vue如何實現關聯頁面多級跳轉功能”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

vue
AI

开江县| 绩溪县| 漳浦县| 涿鹿县| 武威市| 弋阳县| 扎兰屯市| 岫岩| 旌德县| 元阳县| 舟曲县| 鞍山市| 肇庆市| 砚山县| 资兴市| 邹平县| 兴海县| 淮北市| 柘城县| 襄城县| 偃师市| 塔城市| 新邵县| 清苑县| 龙川县| 海兴县| 贡觉县| 泰州市| 乌恰县| 兰西县| 陆川县| 漠河县| 红原县| 武安市| 民县| 柞水县| 库伦旗| 五莲县| 峨眉山市| 板桥市| 华蓥市|