摘要:然后類似一樣我的命名是可以在頁面的任何地方使用,如果你對具體的實現方法有興趣,歡迎點擊本文結尾的鏈接,去我的倉庫上查看。
前言
最近收到一個這樣的需求,要求做一個基于 vue 和 element-ui 的通用后臺框架頁,具體要求如下:
要求通用性高,需要在后期四十多個子項目中使用,所以大部分地方都做成可配置的.
要求做成腳手架的形式.可以 npm 安裝
要求實現多頁簽,并且可以通過瀏覽器 url 回顯多頁簽.而且頁簽內要維護一個歷史記錄,可以后退
組件要求異步加載,減少首屏加載時間.
很明顯,這就是一個 類 ERP 的應用. 做過 JSP 等后臺的同學,對多頁簽應該都很熟悉吧.
那接下來我們就來談談實現.
通用性高這點其實沒啥難點,無非就是麻煩了點,把所有的數據,都提取出來,放在一個 config 文件里面.然后在框架頁里面引入,并且綁定到相應的位置上去. 這邊有個比較難以取舍的問題,就是如果把一溜的數據全部綁定到 vue 的 data 上面,由于數據量比較多,會導致性能問題,如果分開,又會使配置文件看起來相對復雜,增加后期使用人員的學習成本。這塊要看具體的項目需求,由于我這邊暫時對前端的性能要求沒那么高,所以暫時用全部綁定到 data 的方案
做成腳手架形式起初產品對這個的需求使做成組件的形式,然后發布 npm 包,方便后期更新的時候,只需更新一下 npm 就可以了,無需每個項目去復制粘貼替換,但是基于這是一個框架頁,而且可配置項非常多,還要實現 tab 多頁簽等多方面的考慮,最終選擇了腳手架的方案,即便這樣后期升級會稍微麻煩一點(起初的方案是框架頁放在一個文件夾里,到時候直接替換該文件夾),但相對于組件來說,還是更好維護的,況且后期可以再寫一個更新的腳手架,畢竟現在發布一個 npm 工具的成本實在是太低了。
第一次開發腳手架,看了很多社區的帖子,發現目前大部分腳手架,一般都基于2種形式,一種基于文件復制的形式,另一種基于 git-clone 的形式,經過對比,我覺得文件復制的有點復雜了,我其實只是需要一個能一鍵安裝的工具而已,所以 git-clone 的形式還是比較適合我。
以下就是腳手架的代碼,雖然只是簡單的五六十行代碼,不過查資料+趟坑,也花了我一個上午的時間。
#!/usr/bin/env node const shell = require("shelljs"); const program = require("commander"); const inquirer = require("inquirer"); const ora = require("ora"); const fs = require("fs"); const path = require("path"); const spinner = ora(); const gitClone = require("git-clone") const chalk = require("chalk") program .version("1.0.0", "-v, --version") .parse(process.argv); const questions = [{ type: "input", name: "name", message: "請輸入項目名稱", default: "my-project", validate: (name)=>{ if(/^[a-z]+/.test(name)){ return true; }else{ return "項目名稱必須以小寫字母開頭"; } } }] inquirer.prompt(questions).then((dir)=>{ downloadTemplate(dir.name); }) function downloadTemplate(dir){ // 判斷目錄是否已存在 let isHasDir = fs.existsSync(path.resolve(dir)); if(isHasDir){ spinner.fail("當前目錄已存在!"); return false; } spinner.start(`您選擇的目錄是: ${chalk.red(dir)}, 數據加載中,請稍后...`); // 克隆 模板文件 gitClone(`https://github.com/noahlam/vue-multi-tab.git`, dir , null, function(err) { // 移除無用的文件 shell.rm("-rf", `${dir}/.git`) spinner.succeed("項目初始化成功!") // 運行常用命令 shell.cd(dir) spinner.start(`正在幫您安裝依賴...`); shell.exec("npm i") spinner.succeed("依賴安裝成功!") shell.exec("npm run dev") }) }
如果你這個腳手架有疑問或者興趣,可以直接訪問 github 上的代碼 tab-cli
實現多頁簽要想實現多頁簽,那么 vue-router 基本算是廢了,為什么? vue-router 是根據 url 來切換單個組件的,而頁簽則需要再組件內部同時存在多個子組件的,所以路由無法勝任(至少我是這么認為的,如果你有更好的方案,懇請不吝賜教)。
多個頁簽的顯示,其實不難, element 有現成的 tab 組件,于是老夫寫代碼就是一把梭,擼起袖子就是干,噼里啪啦一頓寫,寫完一測,沒有任何問題,實在是不要太簡單,丟給產品預覽:
復制瀏覽器地址到別的地方粘貼,tab 不能正確回顯
tab 內需要實現跳轉,而且要能返回。
第一個問題比較簡單,自己手寫一個基于 hash 的 偽路由 把當前 tab 的 id 放到 url 上去,然后回顯的時候,根據 url 打開對應的 tab.
tip: 關于如何實現路由,請看我另外一篇博客 自己動手實現一個前端路由
第二個問題,大概就是本文的重點了,這里詳細說明一下需求,每個 tab 都可以在 tab 內部 跳轉 ,這里的跳轉,要做的跟 vue-router 的有大體上差不多,要能 push, replace, back,還能帶參數。
那么怎么實現呢? 首先維護一個打開的 tab 列表,然后每個列表里面再維護一個用過的組件列表(包含參數),這樣大概就能實現了嗎?當然不是,組件的跳轉,參數的傳遞,不可能讓使用者自己去實現這些方法吧,我選擇把封裝一個公共對象,然后掛載在 vue.prototype上。然后類似 vue.$router.xxxx 一樣(我的命名是 vue.$tab)可以在頁面的任何地方使用,如果你對具體的實現方法有興趣,歡迎點擊本文結尾的鏈接,去我的Github倉庫上查看。
組件異步加載之前只用過基于 vue-router 的異步加載方法,然而這個項目里面并沒有使用 vue-router,怎么異步呢? 翻了一下 vue 的官方文檔是這么寫的:
Vue.component( "async-webpack-example", // 這個 `import` 函數會返回一個 `Promise` 對象。 () => import("./my-async-component") )
然而我試了一下,發現報錯了,import 不能在這里使用,換了 require 也不行,不知道上我哪里沒弄好,如果你剛好知道又剛好有空,請告訴我,謝謝!后面在 segmentfault 上 看到 這一篇, 使用 webpack 的 require.ensure 可以實現
// 第一個字符串是 組件名,第二個是 組件路徑,第三個是 chunkName (如果不指定則以1.js,2.js....n.js命名) vue.component("home", (resolve) => {require.ensure([], ()=>resolve(require("@/Views/index.vue")), "home")})
順便還要在 webpack 里面的 output 下面配置一下 chunkFilename: "[name].js",, 當然文件名格式可以按你項目的需求來,我這邊就按最簡單的
結束語首先,當然上獻上該項目的 github地址 咯
其次是本文的的地址 個人技術帖合集
以上項目 歡迎隨意 star 和 follow, 和不隨意的 issue
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/52869.html
摘要:然后類似一樣我的命名是可以在頁面的任何地方使用,如果你對具體的實現方法有興趣,歡迎點擊本文結尾的鏈接,去我的倉庫上查看。 前言 最近收到一個這樣的需求,要求做一個基于 vue 和 element-ui 的通用后臺框架頁,具體要求如下: 要求通用性高,需要在后期四十多個子項目中使用,所以大部分地方都做成可配置的. 要求做成腳手架的形式.可以 npm 安裝 要求實現多頁簽,并且可以通過瀏...
摘要:介紹是一套基于和的實現了一個基于的路由的單頁面多頁簽應用程序我之前寫這個項目的時候有寫了一篇記一次基于的多頁簽實踐經驗然后就部分熱心網友就在下面回復了一些其他類似的項目我逐一查看了一下發現基本都是基于和實現的這種實現方法有兩個比 介紹 vue-multi-tab 是一套基于 vue 和 element-ui 的 , 實現了 tab-router (一個基于 tab 的路由) 的 單頁面...
摘要:多個頁簽的顯示,其實不難,有現成的組件,于是老夫寫代碼就是一把梭,擼起袖子就是干,噼里啪啦一頓寫,寫完一測,沒有任何問題,實在是不要太簡單,丟給產品預覽復制瀏覽器地址到別的地方粘貼,不能正確回顯內需要實現跳轉,而且要能返回。 前言 最近收到一個這樣的需求,要求做一個基于 vue 和 element-ui 的通用后臺框架頁,具體要求如下: 要求通用性高,需要在后期四十多個子項目中使用,...
閱讀 2874·2021-11-24 09:38
閱讀 3511·2021-11-23 09:51
閱讀 967·2021-09-09 11:52
閱讀 4032·2021-08-11 11:18
閱讀 1106·2019-08-30 14:05
閱讀 3228·2019-08-30 11:23
閱讀 1760·2019-08-29 17:02
閱讀 1123·2019-08-26 13:49