pc 移動端 雙端切換

来源:https://www.cnblogs.com/lovejielive/archive/2023/08/07/17610945.html
-Advertisement-
Play Games

實現一個項目匹配多個端,使用vue.config自帶的page 實現多個頁面切換。官網介紹:https://cli.vuejs.org/zh/config/#pages 在創建的vue項目中找到 vue.config.js中 添加page 沒有就在根目錄下創建vue.config.js const ...


實現一個項目匹配多個端,使用vue.config自帶的page 實現多個頁面切換。官網介紹:https://cli.vuejs.org/zh/config/#pages

在創建的vue項目中找到 vue.config.js中 添加page

沒有就在根目錄下創建vue.config.js

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
  //多頁面配置
  pages: {
    // 多個頁面
    mobile: {
      // 模板來源
      template: 'public/mobile.html',
      // page 的入口
      entry: 'src/mobile.main.ts',
      // 在 dist/index.html 的輸出
      filename: 'mobile.html',
      // 頁面標題
      title: '移動適配',
    },
    index: {
      template: 'public/index.html',
      entry: 'src/main.ts',
      filename: 'index.html',
      title: 'pc適配',
    }
  },
})
vue.config.js

分別在 public, router ,views ,src下添加修改文件

public 中複製一個html 修改名字為 mobile(可以更具需求自己修改)。

router 與 view 中創建2套路由文件,分別對應pc 與 mobile

找到src 文件下的 App.vue 與 main.ts 複製一套並改名 為 mobileApp.vue 與 mobile.main.ts

router 多端路由配置

index.ts 代碼

pc與mobile 下的index.ts 內容都一樣,只有component 對應的頁面地址 更具不同的端 ,對應不同的地址。

註:pc 與 mobile 內容,唯一要註意的是頁面地址 分別對應不同的路徑

import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router'

const routes: Array<RouteRecordRaw> = [
  {
    path: "/",
    name: "home",
    //pc 或mobile 路徑
    component: () => import('@/views/PC/HomeView/HomeView.vue'),
    meta: {
      title: "首頁",
      //是否需要登錄
      requireAuth: false
    }
  }
]

const router = createRouter({
  history: createWebHashHistory(process.env.BASE_URL),
  //整合路由
  routes: routes,
})

/*
  前置 路由守衛
*/
/* eslint-disable */
router.beforeEach((to, from, next) => {
  /* -----通過本地緩存進行判斷,獲取指定key本地存儲的值進行判斷----- */
  if (to.meta.requireAuth) {
    // 獲取指定key本地存儲的值
    const token = localStorage.getItem('Authorization')
    if (token === null || token === '') {
      //登錄彈窗
      console.log("去登錄")
    } else {
      next()
    }
  } else {
    next()
  }
})
/* eslint-disable no-new */

/*
  後置 路由守衛
*/
router.afterEach((to: any) => {
  // console.log("後置 路由守衛", to, from)
  //更改每個頁面的標題
  document.title = to.meta.title;
})

export default router
router

Views 文件配置

在views 文件下分別創建 PC 與 Moblie 文件,對應為 pc端與移動端的頁面地址。

複製一套app.vue 與main.ts ,修改複製的名字為 mobileApp.vue 與 mobile.main.ts

app.vue 與 mobileApp.vue
<template>
  <router-view />
</template>

<style lang="scss">
</style>
app.vue
main.ts 與 mobile.main.ts
import { createApp } from 'vue'
import App from './App.vue'
// main 導入 pc 端路由
import router from './router/pc/index'
// mobile.main 導入 mobile 端路由
// import router from './router/mobile/index'
import store from './store'
const app = createApp(App)

// 瀏覽器視口小於900px時,使用mobile路由
// 瀏覽器視口大於900px時,使用pc路由
import '@/utils/convert/autoSwitch'
import '@/utils/convert/rem'

app.use(store).use(router).mount('#app')
main.ts

創建utils文件,在創建convert 文件

在convert文件內部創建:autoSwitch.ts ,functions.ts ,rem.ts

autoSwitch 根據頁面大小, 切換顯示的埠
import { debounce } from './functions'
window.addEventListener('resize', debounce(() => {
  if (document.documentElement.clientWidth < 900) {
    if (window.location.href === '/mobile.html#/') return
    window.location.href = './mobile.html#/'
  } else {
    if (window.location.href === '/index.html#/') return
    window.location.href = './index.html#/'
  }
}, 100))
autoSwitch.ts
rem 設置預設字體 等元素
import { debounce } from './functions'
function setRem() {
  // 320 預設大小16px; 320px = 20rem ;每個元素px基礎上/16
  const htmlWidth = document.documentElement.clientWidth || document.body.clientWidth
  // 得到html的Dom元素
  const htmlDom = document.getElementsByTagName('html')[0]
  // 設置根元素字體大小
  const clientWidth = document.documentElement.clientWidth
  // 1920設計稿一套樣式,750設計稿一套樣式
  htmlDom.style.fontSize = clientWidth < 900 ? htmlWidth / 46.875 + 'px' : htmlWidth / 120 + 'px'
}
// 初始化
setRem()
window.addEventListener('resize', debounce(setRem, 100))
rem.ts
functions 防抖與節流函數

註:註釋的為js版本使用的 ,沒註釋的為ts版本

// 防抖函數
type CallbackFn = (item?: any) => void
export function debounce(fn: CallbackFn, delay: number) {
  let timer: number | null = null;
  return (...args: any[]) => {
    if (timer) {
      clearTimeout(timer);
    }
    timer = setTimeout(() => {
      fn(...args);
    }, delay);
  }
}

// 節流函數
export function throttle(fn: CallbackFn, delay: number) {
  let timer: number | null = null;
  return (...args: any[]) => {
    if (timer) {
      return;
    }
    timer = setTimeout(() => {
      fn(...args);
      timer = null
    }, delay);
  }
}

/* 
js 原始版本
// 防抖函數
export function debounce(fn, delay) {
  let timer = null
  return function () {
    const _this = this
    const args = arguments
    if (timer) {
      clearTimeout(timer)
    }
    timer = setTimeout(function () {
      fn.apply(_this, args)
    }, delay)
  }
}

// 節流函數
export function throttle(fn, delay) {
  let timer = null
  return function () {
    const _this = this
    const args = arguments
    if (timer) {
      return
    }
    timer = setTimeout(function () {
      fn.apply(_this, args)
      timer = null
    }, delay)
  }
}
*/
functions.ts

 運行路由展示

項目地址:https://github.com/jielov/doubleEnd-switch

 

 

本文來自博客園,作者:虛乄,轉載請註明原文鏈接:https://www.cnblogs.com/lovejielive/p/17610945.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ![](https://img2023.cnblogs.com/blog/3076680/202308/3076680-20230804113710206-1765431897.png) # 1. Any ## 1.1. 任意一個 ## 1.2. 選修了任意一門課程的學生 ### 1.2.1. 找出 ...
  • # mysql備份恢復(mysqldump備份 mysqlbinlog恢復) ## 一、備份的分類 1. 物理備份 ​ 物理備份:對資料庫操作系統的物理文件(如數據文件、日誌文件等) - 冷備份(離線備份) :是在關閉資料庫的時候進行的 - 熱備份(聯機備份) :資料庫處於運行狀態,依賴於資料庫的日 ...
  • 本文分享自華為雲社區《【帶你走進DWS大集群內幕】大集群通信:作業hang、殘留問題定位》,作者: 雨落天穹丶。 前言: 測試過程中,我們會遇到這樣一種情況,我的作業都執行很久了,為啥還不結束,是不是作業hang掉了? 或者說,明明看到CN上的作業都沒了,為什麼通過全局視圖發現DN上還有作業在執行而 ...
  • 基於本次618大促JDV平臺支持大促過程中的表現,共從大促總結、能力沉澱、待提升項3個方向也進行了相應總結和反思。 ...
  • > 問:有一個postgres數據表,表中有update_time, create_time關於時間戳的欄位,選擇某個時間段,計算出update_time減去create_time的值做為耗時時間的欄位duration_time,統計出在這段時間內耗時時間的平均值,中位數值,最大值,和最小值,請問如 ...
  • 我們非常高興的發佈為了一年一度的SIGGRAPH 2023發佈關於為PostGIS支持USD格式的新拓展。 新添加了3個函數 ST_AsUSDA(geom geometry, usd_root_name text, usd_geom_name text, width float) ST_AsUSDC ...
  • 原文地址:https://zhanglei.blog.csdn.net/article/details/121673288 [toc] ## 一、前言 應用中某些模塊需要組件化,組件化後的工程最後會做二進位化處理,打包成`.framework`文件。 今天簡單聊一下在主工程或其他組件中是如何訪問自製 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 1. 場景 前端構建完上線,用戶還停留還在老頁面,用戶不知道網頁重新部署了,跳轉頁面的時候有時候js連接hash變了導致報錯跳不過去,並且用戶體驗不到新功能。 2. 解決方案 每次打包寫入一個json文件,或者對比生成的script的sr ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...