首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >分享下如何在Vue项目中进行网页布局

分享下如何在Vue项目中进行网页布局

作者头像
前端达人
发布于 2023-10-07 12:07:45
发布于 2023-10-07 12:07:45
86502
代码可运行
举报
文章被收录于专栏:前端达人前端达人
运行总次数:2
代码可运行

布局是减少代码重复并创建易于维护和专业外观的应用程序的重要模式。如果您正在使用Nuxt,它提供了一个优雅的解决方案。但不幸的是,在Vue中,官方文档根本没有提到它们。这经常导致对于应该在多个应用程序中相似的问题而言,采用次优和不太正规的解决方案。

经过多次尝试,我总结出了一种既有效又无需烦恼地扩展的布局方式。让我用一个小的示例演示一下。

要求

首先,让我们确定一些我们的布局结构需要满足的规则:

  • 每个页面都应该声明布局和各个部分的组件
  • 对一个页面的更改不应影响其他页面
  • 如果页面布局的某些部分在多个页面中是相同的,应该只声明一次

设置Vue Router

我们需要在页面之间进行导航,这就是为什么我们要设置vue-router。 Vue-cli 和 vite 脚手架在创建新项目时提供了包含它的选项,但如果你不是从头开始,以下是安装它的步骤。

安装 vue-router 依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm i -D vue-router@4

声明路由

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const routes = [
  { path: "/", component: () => import("./pages/HomePage.vue") },
  { path: "/explore", component: () => import("./pages/ExplorePage.vue") },
];

导入项目

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { createApp } from "vue";
import { createRouter, createWebHashHistory } from "vue-router";
import App from "./App.vue";
import routes from "./routes.ts"

const router = createRouter({
  history: createWebHashHistory(),
  routes,
});

const app = createApp(App);

app.use(router);

app.mount("#app");

最后,更新App.vue文件,只包含一个 router-view 标签。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <router-view />
</template>

我们现在可以在两个页面之间导航了,但这并不令人兴奋,因为它们目前是空的。让我们改变这种情况。

页面

我们将创建以下页面:首页、Explore、文章和404。还有三种布局:三列、两列和空白。

主页是每个流行社交网络都使用的典型三栏布局。第一栏包含应用程序的标志和导航,这在使用此布局的每个页面上都保持不变。底部右侧的页脚也是如此。主要内容和侧边栏小部件在每个页面上都会有所变化。

让我们从 HomePage.vue 组件开始实施。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script setup lang="ts">
import ThreeColumnLayout from "../layouts/ThreeColumnLayout.vue";
import ArticleCard from "../components/ArticleCard.vue";
import WidgetFriendSuggestions from "../components/WidgetFriendSuggestions.vue";
import useArticles from "../composables/useArticles";
const articles = useArticles().getArticles();
</script>

<template>
  <ThreeColumnLayout>
    <h2 class="text-3xl font-bold mb-4">Homepage content</h2>
    <ArticleCard v-for="article in articles" :article="article" />

    <template #aside>
      <WidgetFriendSuggestions />
    </template>
  </ThreeColumnLayout>
</template>

我们将很快实现一个 ThreeColumnLayout 组件。默认插槽包含一个标题和一系列文章,这些文章是页面的主要内容。此外,我们还有一个名为 aside 的具名插槽,用于声明一个小部件。

按照通常的约定, ThreeColumnLayout 组件被放置在 /layouts 文件夹中。它将使用网格容器,并利用 grid-template-areas 来创建一个三列布局。

布局的实现细节应该是该组件的关注点,而不是页面的关注点。可以使用flexbox、网格系统或任何其他技术来实现。如果使用全宽、盒状或流体布局,同样适用。

这个布局有3列

  • 第一列将包含一个标志和导航组件
  • 第二列将只创建默认插槽,并让页面决定将插入什么内容
  • 第三列将包含侧边栏和页脚组件,这是每个页面都共有的。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script setup>
import AppNavigation from "../components/AppNavigation.vue";
import AppFooter from "../components/AppFooter.vue";
import AppLogo from "../components/AppLogo.vue";
</script>

<template>
  <div class="three-column-layout">
    <header>
      <AppLogo />
      <AppNavigation />
    </header>

    <main>
      <slot />
    </main>

    <aside>
      <slot name="aside" />
      <AppFooter />
    </aside>
  </div>
</template>

<style scoped lang="scss">
.three-column-layout {
  display: grid;
  grid-template-areas:
    "header"
    "main"
    "aside";

  header {
    grid-area: header;
    margin-top: 30px;
  }
  main {
    grid-area: main;
    margin-top: 10px;
    padding: 20px;
  }
  aside {
    grid-area: aside;
    margin-top: 10px;
    padding: 20px;
  }

  @media (min-width: 768px) {
    grid-template-columns: 1fr 3fr 1fr;
    grid-template-areas: "header main aside";
  }
}
</style>

创建一个具有相同布局的新页面将展示出这种方法的简洁性。

文章页面还将在默认插槽中包含独特的内容,并在侧边栏上添加一个额外的小部件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script setup>
import ThreeColumnLayout from "../layouts/ThreeColumnLayout.vue";
import WidgetRelatedContent from "../components/WidgetRelatedContent.vue";
import WidgetFriendSuggestions from "../components/WidgetFriendSuggestions.vue";
import { useRoute } from "vue-router";
import useArticles from "../composables/useArticles";
const article = useArticles().getArticle(useRoute().params.id);
</script>

<template>
  <ThreeColumnLayout>
    <h2 class="text-3xl font-bold mb-4">{{ article.title }}</h2>
    <div class="max-w-md" v-html="article.description"></div>

    <template #aside>
      <WidgetFriendSuggestions />
      <WidgetRelatedContent />
    </template>
  </ThreeColumnLayout>
</template>

两栏布局

对于探索页面(Explore),我们将创建一个两列布局。第一列将与三列布局相同,但主要部分将占据屏幕的其余部分,并在底部放置页脚。

这次的实现看起来与之前的并没有太大的区别。但是这次我们使用 flex 和 flex-basis 只是为了展示一种不同的创建CSS布局的方式。在实际情况中,所有的实现都应该使用相同的技术。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script setup>
import AppNavigation from "../components/AppNavigation.vue";
import AppLogo from "../components/AppLogo.vue";
import AppFooter from "../components/AppFooter.vue";
</script>
<template>
  <div class="two-column-layout">
    <header>
      <AppLogo />
      <AppNavigation />
    </header>

    <main>
      <slot />
      <AppFooter />
    </main>
  </div>
</template>

<style scoped>
.two-column-layout {
  display: flex;
  @media (max-width: 768px) {
    flex-direction: column;
  }
}
header {
  flex-basis: 20%;
  margin-top: 30px;
}

main {
  flex-basis: 80%;
  margin-top: 10px;
  padding: 20px;
}
</style>

使用这种布局的探索页面非常简单

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script setup>
import TwoColumnLayout from "../layouts/TwoColumnLayout.vue";
import ExploreItem from "../components/ExploreItem.vue";

import useArticles from "../composables/useArticles";
const articles = useArticles().getExploreArticles();
</script>

<template>
  <TwoColumnLayout>
    <h2 class="text-3xl font-bold mb-12">
      Latest content on <a target="_blank" href="https://dev.to/">Dev.to</a>
    </h2>
    <div class="grid lg:grid-cols-3 gap-6">
      <ExploreItem v-for="article in articles" :article="article" />
    </div>
  </TwoColumnLayout>
</template>

404布局

最后,让我们创建一个可以用于404页面的空白全页布局。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <main class="container my-24 px-6 mx-auto">
    <slot />
  </main>
</template>

即使实现简单,只使用一个居中容器(这次使用tailwind.css),使用布局仍然很重要。

这样我们可以保持页面组件的简洁,并确保使用此布局的多个页面外观和行为一致。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script setup>
import BlankLayout from "../layouts/BlankLayout.vue";
import PageNotFound from "../components/PageNotFound.vue";
</script>

<template>
  <BlankLayout>
    <PageNotFound />
  </BlankLayout>
</template>

结束

布局是减少样板代码和保持专业外观的重要工具。结合完善的文件夹结构,可以创建一个让每个人都喜欢使用的代码库。

由于文章内容篇幅有限,今天的内容就分享到这里,文章结尾,我想提醒您,文章的创作不易,如果您喜欢我的分享,请别忘了点赞和转发,让更多有需要的人看到。同时,如果您想获取更多前端技术的知识,欢迎关注我,您的支持将是我分享最大的动力。我会持续输出更多内容,敬请期待。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-10-06 09:00,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端达人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
优雅设计之美:实现Vue应用程序的时尚布局
页面布局是减少代码重复和创建可维护且具有专业外观的应用程序的基本模式。如果使用的是Nuxt,则可以提供开箱即用的优雅解决方案。然而,令人遗憾的是,在Vue中,这些问题并未得到官方文档的解决。
葡萄城控件
2023/11/07
4750
优雅设计之美:实现Vue应用程序的时尚布局
Vue3 结合 TypeScript 项目开发使用指南及组件封装实操方法
这些方法与Vue3+TypeScript项目结合,可以帮助你高效构建高质量的前端应用。
小焱
2025/05/29
2770
Vue3 结合 TypeScript 项目开发使用指南及组件封装实操方法
一次性把所有普通和经典的网页布局讲得通通透透的,多图预警,建议收藏
超干货长文预警。这次把网页布局方案讲得通通透透的,等高布局,水平垂直居中,经典的圣杯布局等等全都有了。建议收藏
夜尽天明
2020/09/17
6.1K0
一次性把所有普通和经典的网页布局讲得通通透透的,多图预警,建议收藏
Nuxt3 项目基础配置超详细 and 项目模板
Nuxt基础配置模板地址 https://github.com/Seven7v/Nuxt3-vue3-project
KID.
2023/10/26
2.4K0
Nuxt3 项目基础配置超详细 and 项目模板
【Vue3】什么是路由?Vue中的路由基本切换~
在介绍本节的内容之前,我们首先还是老样子,准备好需要的代码,准备好必要的html代码,方便后面的操作,这里我们写了三个a标签,学过前端的都知道,我这是要创建链接,这就引出了路由和路径的关联
小馒头学Python
2024/05/07
2420
【Vue3】什么是路由?Vue中的路由基本切换~
如何使用Flexbox和CSS Grid,实现高效布局
CSS 浮动属性一直是网站上排列元素的主要方法之一,但是当实现复杂布局时,这种方法不总是那么理想。幸运的是,在现代网页设计时代,使用 Flexbox 和 CSS Grid 来对齐元素,变得相对容易起来。
葡萄城控件
2022/05/09
4K0
如何使用Flexbox和CSS Grid,实现高效布局
Grid layout + 媒体查询轻易实现常用的响应式布局
最近在整理前端知识体系,怎么可以少了布局这一环呢?先问大家一个问题,如果让css只保留一种布局,留下来解决前端布局问题?你会选择那个布局呢?如果问我,我会选择 网格布局,根据二八原则,网格布局基本上可以帮助我解决 80% 的布局场景,颇有一套布局打遍天下布局的气势,因此非常值得一探究竟。
老码小张
2023/11/28
9730
Grid layout + 媒体查询轻易实现常用的响应式布局
全栈之前端 | 6.CSS3基础知识之网页几种布局方法学习(1)
描述: 前面相信大家已经跟着【WeiyiGeek】作者一起学习了CSS基础知识了,并且了解了盒子模型、以及元素的定位浮动方面的知识。现在我们在此基础上继续深入学习CSS布局,它是学习CSS之路上一个重点,是在进行前端开发时常常使用到的,所以说我们需要认真学习,若有不懂的地方可以在文章末尾,以及作者交流群【在公众号回复微信交流群】进行留言交流。
全栈工程师修炼指南
2023/10/31
1.1K0
全栈之前端 | 6.CSS3基础知识之网页几种布局方法学习(1)
nuxt3目录结构详解
在 Nuxt.js 3 中,一个应用程序的文件夹结构具有一定的规范性。以下是 Nuxt.js 3 的文件夹结构及其用途的详细解释:
小小孩子们
2024/02/03
3.4K0
【Vue H5项目实战】从0到1的自助点餐系统—— 项目页面布局(Vue3.2 + Vite + TS + Vant + Pinia + Nodejs + Mo
今日推荐:机器学习模型从理论到实战|【007-K均值聚类(K-Means)】新闻主题分类
中杯可乐多加冰
2024/12/03
3210
使用网络构建复杂布局超实用的技巧,赶紧收藏吧!
作者:Shadid Haque 译者:前端小智 来源:soshace 点赞再看,微信搜索 【大迁世界】 关注这个没有大厂背景,但有着一股向上积极心态人。本文 GitHub https://github.com/qq44924588... 上已经收录,文章的已分类,也整理了很多我的文档,和教程资料。 1024程序员节,160就能买到400的书,红宝书 5 折 网格布局是现代CSS中最强大的功能之一。使用网格布局可以帮助我们在没有任何外部 UI 框架的情况下构建复杂的、快速响的布局。在这篇文章中,将会介绍所有
前端小智@大迁世界
2020/10/30
1.2K0
使用网络构建复杂布局超实用的技巧,赶紧收藏吧!
Grid布局简介
没错,这其实就是我们小时候写的小格子本本,其实它跟我们今天要讲的主题Grid布局非常类似,其实Grid布局就是它的升级加强版。
桃翁
2018/08/16
7.6K2
Grid布局简介
从零玩转系列之微信支付实战PC端项目构建+页面基础搭建 | 技术创作特训营第一期
欢迎来到本期的博客!在这篇文章中,我们将带您深入了解前端开发领域中的一个热门话题:
杨不易呀
2023/08/09
9435
从零玩转系列之微信支付实战PC端项目构建+页面基础搭建 | 技术创作特训营第一期
【Web前端】项目实训:CSS基本布局理解
对CSS学习已经接近尾声,下面你可以对以下两道“小卡拉米”测试进行测试下CSS理解程度。
一条晒干的咸鱼
2024/11/19
4520
【Web前端】项目实训:CSS基本布局理解
Vue 魔法师 —— 重构“布局”
title: Vue 魔法师 —— layouts date: 2021-03-17 tags:
掘金安东尼
2022/09/22
8070
Vue 魔法师 —— 重构“布局”
tauri2.0-winos基于vite6+tauri2+vue3客户端os系统
经过半个月的高强度研发,原创自研Tauri2.0-Vue3-MacOS客户端OS桌面系统终于宣告完结。
andy2018
2024/12/23
3980
tauri2.0-winos基于vite6+tauri2+vue3客户端os系统
HTML 布局是指使用 HTML 元素和 CSS 样式来组织和排列网页内容的结构方式
HTML 布局是指使用 HTML 元素和 CSS 样式来组织和排列网页内容的结构方式。合理的布局能提升用户体验和页面可读性。
西里网
2025/04/25
1570
CSS 中的 Grid 布局 完全指南
Grid 是一个基于二维网格布局的系统,有了它我们可以非常方便的实现过去很复杂布局,无需再使用float, inline-block, position 这些本质上是 hack 的方法。
羽月
2022/10/08
4.3K0
CSS 中的 Grid 布局 完全指南
48. Vue路由-使用命名视图实现经典布局
在前面的路由篇章中,我在写router-view的时候并没有什么特征标识,也就是所有路由映射的组件都可以显示出来。但是在一些经典后台布局中,一般什么组件在哪里显示是需要固定好的,如下:
Devops海洋的渔夫
2020/07/22
6150
ElementUI 整体页面布局
因为我们的首页是个公共的组件,点击首页,会员管理,都不会变,所以我们可以放在一个单独文件夹里面。
py3study
2021/03/16
4.7K1
推荐阅读
相关推荐
优雅设计之美:实现Vue应用程序的时尚布局
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档