VUE学习:六.页面布局

sadwind2024-02-29笔记210

前言

页面布局决定了一个页面的整体结构,一个好的布局能使整个页面一眼看上去结构清晰,层次分明,可以简单地将组件分为:容器组件与展示组件

  • 适配规则(pc,移动) 分辨率调整

#1.职能划分

Vue 组件按照职能划分,我们可以将其分为两种类型:容器组件和展示组件

  • 容器组件:它是一个容器性质的组件,我们可以把它理解为最外层的父组件,也就是最顶层的组件,一般我们把它放置在 views 文件夹下,其功能主要用于做数据提取与实现公共逻辑,然后渲染对应的子组件。

  • 展示组件:主要用于做展示的组件,其主要功能是负责接收从容器组件传输过来的数据并在页面上渲染,实现其内部独有的功能逻辑。

容器组件就是整个首页最外层的父组件,而展示组件就包含了导航栏、文章列表、底部等子组件,代码层面如下:

<template>
  <div>
    <navigation @count="countFn"></navigation>
    <article :list="articleList"></article>
    <foot></foot>
  </div></template><script>import { mapActions, mapGetters } from 'vuex';export default {
    mounted() {
        this.SET_BLOG_DATA(); // 调用接口获取数据
    },
    computed: {
        ...mapGetters(['articleList']), // 监听 state
    }
    methods: {
        ...mapActions(['SET_BLOG_DATA', 'SET_NAV_COUNT']),
        countFn(item) {
            this.SET_NAV_COUNT({ type: item.type });
            this.$router.push({name: item.route});
        }
    }}</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

以上是首页容器组件中的主要代码,其主要做了两件事情:数据的传递和回调的处理,当然还可以包括处理一些该页面中不属于任何一个展示组件的方法,比如校验登录状态。在一个容器组件中可以包含多个展示组件,下面我们来看一下展示组件 Navigation 中的代码:

刷新
全屏/自适应
  • 首页

  • 文章

  • 关于

<template>
  <ul>
    <li
      v-for="(item, index) in nav"
      :key="index"
      @click="goNav(item)"
      v-text="item.name"
    ></li>
  </ul></template><script>export default {
  data() {
    return {
      nav: [
        {
          name: "首页",
          route: "index",
          type: "index",
        },
        {
          name: "文章",
          route: "article",
          type: "article",
        },
        {
          name: "关于",
          route: "about",
          type: "about",
        },
      ],
    }
  },
  methods: {
    goNav(item) {
      this.$emit("count", item) // 触发回调
    },
  },}</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
复制代码

Navigation 导航组件只负责自己内部的数据渲染和回调逻辑,对于存储每个导航的点击量及跳转逻辑来说,作为展示组件这并不是其所关心的,所以我们需要通过触发容器组件回调的方式来实现。再来看一下展示组件 Article 的代码:

<template>
  <ul>
    <li
      v-for="(item, index) in list"
      :key="index"
      @click="goPage(item.id)"
      v-text="item.title"
    ></li>
  </ul></template><script>export default {
  props: {
    // 接收容器组件数据
    list: {
      default: [],
      type: Array,
    },
  },}</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

展示组件 Article 中动态的数据通过 props 从父组件中获取,其内部只处理文章列表的渲染工作,这样很好的将 UI 层面和应用层面进行了分离,便于今后该组件的复用。

此外 Foot 组件为纯静态组件,其只负责内部数据的渲染,不接收外部的数据和回调方法,这里就不做介绍了。

从以上代码示例中我们不难发现容器组件和展示组件的主要区别和注意点:

类型作用是否使用 Vuex数据来源数据修改
展示组件描述如何展现(骨架、样式)props从 props 调用回调函数
容器组件描述如何运行(数据获取、状态更新)监听 Vuex state向 Vuex 派发 actions

相比较如果上述的博客首页不做组件的划分,全部逻辑都放在一个组件中,那么必然会导致代码的臃肿和难以维护,而一旦划分了容器组件和展示组件,后期如果哪个页面同样需要展示文章列表,我们只需要传递不同的数据直接复用即可。

#2.层次结构

关于组件的层次,一般页面中不宜嵌套超过 3 层的组件,因为超过 3 层后父子组件的通信就会变得相对困难,不利于项目的开发和维护。3 层结构的容器组件与展示组件的数据传递如下:

可见组件的层次越深数据传递的过程就会变得越复杂,当然这取决于你如何划分容器组件和展示组件,比如我们可以将上述博客首页换一种划分方式:

上图我们页面中存在 3 个容器组件,每个容器组件又可以包含各自的展示组件,这样一定程度上可以减少组件的层次嵌套深度。当然展示组件中也可以包含对应的容器组件来解决数据传输的问题:

这样展示组件 B 下面的容器组件 C 便可以不依赖于容器组件 A 的数据,其可以单独的进行数据获取和状态更新。

而对于那些你不知道应该划分为容器组件和展示组件的组件,比如一些耦合度较高的组件,那么你可以暂时归类到其他组件中,混用容器和展示,随着日后功能的逐渐清晰,我们再将其进行划分。

总结

了解 vue 项目创建过程以及其目录结构,在开发中需要注意的地方,能够更好地规范前端开发


relate content

根据id值,自动生成编号、编码等

某项目在新增数据时,需要一个编码如:XXXX0001 格式。设想每次添加时,根据id的最大值加1,然后拼接成此形式的字符。当时这方法不是太好,只是一个思路,因为如果多人同时添加,会造成该字段重复。一,...

VUE学习:十.编码技巧

前言总结一些开发中常见的问题,优化改善编码技巧,提高代码质量#1.条件判断常见条件判断iflet name = "case1"if (nam...

VUE学习:四.环境配置

前言前端项目开发中,一般会有几个环境:dev:是程序员们专门用于开发的服务器,配置可以比较随意, 为了开发调试方便,一般打开全部错误报告sit:dev 环境完成需求开发就可以将代码打包到 sit 环境...

使用字符串匹配 屏蔽一下搜索关键词

总是有些不怀好意的人,使用一些SQL注入词来尝试搜索,真想对这些人说一句,去你妈的。网站会记录搜索词,我不想记录这些数据,同时也想单独对这些人做一个提示页面,就将一些常用SQL注入字符做个数组,然后跳...

新的启程:得想点办法 好点子

因为个人原因,想做个网站,利用空余时间,网上收集整理一些资源,放些广告赚点小钱,目前看来很难实现了。申请了好多次广告联盟,都被拒绝了,大概理由就是网站流量不够,内容不多,原创内容少,仔细一想,这还是很...

VUE学习:十三.代码管理

前言前端开发中对代码的处理:代码的存储、代码的管控、代码的提交与合并#1.代码仓库以gitlab 为例配置 ssh权限#2.代码管理简单项目分支dev:开发分支,直接在 dev 上进行开发,测试环境没...

Post Reply    

◎Welcome to participate in the discussion.