实现一个项目匹配多个端,使用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

pc 移动端 双端切换的更多相关文章

  1. 在thinkPHP3.2.3框架下实现手机和PC端浏览器的切换

    查看thinkphp版本号方法 打开文件“根目录\ThinkPHP\ThinkPHP.php”下的文件ThinkPHP.php,在22--23行可以看到版本信息THINK_VERSION,如下图: 说 ...

  2. 10天学会phpWeChat——第七天:创建一个自适应PC网站+H5移动端的模块

    本教程基于phpWeChat核心框架1.1.0+版本.下载地址:http://s.phpwechat.com/app_38026ed22fc1a91d92b5d2ef93540f20 通过前面六讲的系 ...

  3. 在PC上测试移动端网站和模拟手机浏览器的5大方法

    在PC上测试移动端网站和模拟手机浏览器的5大方法 来源:互联网 作者:佚名 时间:03-19 10:14:54 [大 中 小]                最近公司要开发网站的移动版,让我准备准备知 ...

  4. bootstrap导航栏PC端移动端之不同样式

    在此之前,我先说我之所以要改变网站PC移动双端不同样式的原因. 首先我的网站用到了bootstrap响应式布局,这是我网站的PC端导航栏: 这是我网站的移动端导航栏,看着就难受: 我用谷歌浏览器F12 ...

  5. lintcode二叉树的锯齿形层次遍历 (双端队列)

    题目链接: http://www.lintcode.com/zh-cn/problem/binary-tree-zigzag-level-order-traversal/ 二叉树的锯齿形层次遍历 给出 ...

  6. lintcode 滑动窗口的最大值(双端队列)

    题目链接:http://www.lintcode.com/zh-cn/problem/sliding-window-maximum/# 滑动窗口的最大值 给出一个可能包含重复的整数数组,和一个大小为  ...

  7. HTML5移动端图片左右切换动画

    插件描述:HTML5移动端图片左右切换动画 小海今天要给大家分享一款很不错的图片左右切换焦点图动画,并且支持移动端触摸滑动.功能上,这款HTML5图片播放器支持鼠标滑动.手机端触摸滑动以及自动播放.外 ...

  8. Java数据结构——用双端链表实现队列

    //================================================= // File Name : LinkQueue_demo //---------------- ...

  9. STL---deque(双端队列)

    Deque是一种优化了的.对序列两端元素进行添加和删除操作的基本序列容器.它允许较为快速地随机访问,但它不像vector 把所有的对象保存在一块连续的内存块,而是采用多个连续的存储块,并且在一个映射结 ...

  10. hdu-5929 Basic Data Structure(双端队列+模拟)

    题目链接: Basic Data Structure Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 65536/65536 K (Ja ...

随机推荐

  1. 波场(Tron) 网页版钱包开源

    之前做区块链项目太难了,很多组件.工具没有开源项目,需要自己写很麻烦. 我整理了几个自己给公司开发项目的时候,分离出来的几个工具,已经上传到 Gihub 了,感觉浏览量还行,在这里给园子里的朋友分享下 ...

  2. 2022-10-26:以下go语言代码输出什么?A:1 3 2;B:1 2 3;C:3 1 2;D:3 2 1。 package main import “fmt“ type temp struc

    2022-10-26:以下go语言代码输出什么?A:1 3 2:B:1 2 3:C:3 1 2:D:3 2 1. package main import "fmt" type te ...

  3. 2021-11-18:给定一个长度len,表示一共有几位。所有字符都是小写(a~z),可以生成长度为1,长度为2,长度为3...长度为len的所有字符串。如果把所有字符串根据字典序排序,每个字符串都有

    2021-11-18:给定一个长度len,表示一共有几位.所有字符都是小写(a~z),可以生成长度为1,长度为2,长度为3-长度为len的所有字符串.如果把所有字符串根据字典序排序,每个字符串都有所在 ...

  4. Python-3.10手动配置环境变量

  5. 「P4」试下1个半月能不能水出个毕设

    期间的一些感想 对于这个时间的把控,前一个月实际上我什么都没做,现在都堆在最后的半个月了 在做毕业设计的阶段,我总结了一个教训,就是:「慢就是快」,我想这句话可能对我以后的学习都会有比较大的影响.我是 ...

  6. MySQL中字符串查询效率大比拼

    背景 最近有个同事对字符串加索引,加完后,发现多了个奇奇怪怪的数字执行的SQL如下: alter table string_index_test add index `idx_name` (`name ...

  7. 03. 选择器补充及CSS动画

    1.了解frameset 2.iframe html5新特性 iframe 元素会创建包含另外一个文档的内联框架(即行内框架). 提示:您可以把需要的文本放置在 <iframe> 和 &l ...

  8. Linux下程序时间消耗监控与统计

    良好的计时器可帮助程序开发人员确定程序的性能瓶颈,或对不同算法进行性能比较.但要精确测量程序的运行时间并不容易,因为进程切换.中断.共享的多用户.网络流量.高速缓存访问及转移预测等因素都会对程序计时产 ...

  9. Python的Lambda函数: 一把极简编程的瑞士军刀

    Python中的lambda函数,或者叫匿名函数,是一个极其强大的工具.它以简洁.优雅的语法提供了创建函数的快速方式.在本篇文章中,我们将全方位地深入研究lambda函数的用法和特点,通过理论和实例相 ...

  10. CHAT-GPT初使用

    拿chatgpt去试验了一下,一个挺小的需求,但是前后还是更改了三次,体验就是它可以不断改进之前实现的代码,但需要提需求的人比较清楚需求内的细节,差不多类似于,我有想法,它来实现,还是可以提高不少效率 ...