实现一个项目匹配多个端,使用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. 2022-01-09:整数转换英文表示。将非负整数 num 转换为其对应的英文表示。 示例 1: 输入:num = 123, 输出:“One Hundred Twenty Three“。 力扣273。

    2022-01-09:整数转换英文表示.将非负整数 num 转换为其对应的英文表示. 示例 1: 输入:num = 123, 输出:"One Hundred Twenty Three&quo ...

  2. 2021-10-30:有效的字母异位词。给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位

    2021-10-30:有效的字母异位词.给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词.注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位 ...

  3. Django 14天从小白到进阶- Day1 Django 初识

    来自作者:金角大王 本节内容 Http原理介绍 自行开发一个Web框架 WSGI介绍 Django介绍 MVC/MTV Django安装 创建项目与APP 开发第一个页面 为什么学Django? Go ...

  4. 回溯理论基础及leetcode例题

    学习参考 回溯 与递归相辅相成;回溯是递归的副产品,只要有递归就会有回溯. 回溯函数也就是递归函数,指的都是一个函数. 回溯搜索法 纯暴力搜索 解决的问题 组合问题:N个数里面按一定规则找出k个数的集 ...

  5. 一天吃透Spring面试八股文

    内容摘自我的学习网站:topjavaer.cn Spring是一个轻量级的开源开发框架,主要用于管理 Java 应用程序中的组件和对象,并提供各种服务,如事务管理.安全控制.面向切面编程和远程访问等. ...

  6. 翻译:REST 和 gRPC 详细比较

    译者注:在微服务架构设计,构建API和服务间通信技术选型时,对 REST 和 gRPC 的理解和应用还存在知识盲区,近期看到国外的这篇文章:A detailed comparison of REST ...

  7. 在Transformers 中使用约束波束搜索引导文本生成

    引言 本文假设读者已经熟悉文本生成领域波束搜索相关的背景知识,具体可参见博文 如何生成文本: 通过 Transformers 用不同的解码方法生成文本. 与普通的波束搜索不同,约束 波束搜索允许我们控 ...

  8. 效率神器,边看网页边问ChatGPT!神级ChatGPT插件(浏览器扩展)推荐!

    如果在看一个网页时,有些词不认识.句子不知道含义,怎么办? 憨憨版:不认识就算了呗,还能咋滴 进阶版:复制到 Google/Baidu 里问一问: AI达人版:复制到 ChatGPT/Claude 里 ...

  9. 云上使用 Stable Diffusion ,模型数据如何共享和存储

    随着人工智能技术的爆发,内容生成式人工智能(AIGC)成为了当下热门领域.除了 ChatGPT 之外,文本生成图像技术更令人惊艳. Stable Diffusion,是一款开源的深度学习模型.与 Mi ...

  10. 用R语言实现并行计算:基于R的数据处理和分析工具

    目录 引言 随着数据量的爆炸式增长,数据处理和分析的需求也越来越大.传统的批处理计算已经无法满足高效的数据处理和分析需求,因此,并行计算成为了一个重要的技术方向.然而,R语言作为一种开源.可视化能力强 ...