当前位置: 首页 > news >正文

拆解与重构:慕云游首页组件化设计

目录

  • 前言
  • 1 项目准备
      • 1.1 创建项目目录
      • 1.2 搭建项目开发环境
  • 2 项目组件化
      • 2.1 在当前环境启动原有项目
      • 2.2 顶部组件
      • 2.3 幻灯片组件
      • 2.4 机酒自由行组件
      • 2.5 拆分余下的css文件
  • 3 项目完善
      • 3.1 幻灯片组件
        • 3.1.1 结构和样式
        • 3.1.2 功能实现
        • 3.1.3 使用Ajax获取数据
        • 3.1.4 加载中组件
      • 3.2 机酒自由行组件
  • 4 源码

前言

  • 在现代Web开发中,组件化设计是一种常见的开发模式,它有助于提高代码的可维护性、可重用性和可测试性。

  • 通过将一个大型应用程序拆分为多个独立的组件,我们可以更加灵活地开发和维护网站。

  • 本文将以慕云游首页为例,探讨如何通过组件化设计实现它的页面布局与交互功能。

  • 前置知识:
    HTML CSS JavaScript webpack art-template
    慕云游静态项目

1 项目准备

1.1 创建项目目录

在这里插入图片描述

  • 放入提前准备的文件,如封装的ajax

1.2 搭建项目开发环境

  1. 初始化项目
    在项目所在文件夹打开命令行,输入:

    npm init
    
  2. 安装项目所需的包(node模块):

    • webpack
    npm install --save-dev webpack webpack-cli
    
    • art-template
    npm install art-template
    
  3. 配置webpack:
    创建webpack.config.json文件,具体配置内容见Babel编译与Webpack

2 项目组件化

2.1 在当前环境启动原有项目

  1. 将原项目的文件,复制到Mall项目的src/page/index目录下
    在这里插入图片描述

  2. 将原项目中的index.html文件改为index.art,当作模板文件
    在这里插入图片描述

  3. src/pages/index目录下创建入口文件index.js,用于放引入的css文件和js文件,因为webpack无法直接从模板文件中访问他们
    在这里插入图片描述

    //css
    import './css/bundle.css';
    import './css/reset.css';// js
    import './js/backtotop';
    import './js/menu';
    import './js/carousel';
    
  4. 在命令行输入npm start 运行项目,看到完整页面即可

2.2 顶部组件

  1. src/components/topbar目录下创建以下文件
    2.

  2. 在入口文件index.js中引入topbar.js

    //组件
    import 'components/topbar';
    
  3. index.art文件中topbar内容剪切到topbar.art
    在这里插入图片描述

  4. index.art文件中引入topbar.art模板
    在这里插入图片描述

  5. 同样的,相关的css内容剪切到topbar.css文件中,并在同目录下的index.js中引入topbar.css

    //css
    import './topbar.css'
    
  6. 这个时候我们会发现css中图片路径报错了
    在这里插入图片描述

    • icon.png里是精灵图标,很多地方都共用,我们可以将icons.png放在公共资源src/assert/images中,再更改url在这里插入图片描述

      background: url(images/icons.png) 0 -10px;
      
    • webpack.config.json中已配置 imagessrc/assets/images的路径别名在这里插入图片描述

2.3 幻灯片组件

按2.1顶部组件步骤如法炮制

  • src/pages/index/components/carousel目录下,创建以下文件,再将原文件内容拆分搬运到相应文件中
    在这里插入图片描述

  • 注意: 顶部组件在布局组件中src/components/topbar,幻灯片组件在页面组件中src/pages/index/components/carousel,在入口文件中引入js的路径不同

    //组件
    import 'components/topbar';
    import './components/carousel';
    

2.4 机酒自由行组件

同 2.1顶部组件操作一致,但是有个特殊的点类

  • 机酒自由行中的css样式都是公共样式,所以要放在公共资源目录src/asserts/styles
    • 创建layout.css文件,将jjzyx.css中的代码剪切进去,同时删除jjzyx.css文件
      -

    • 在入口文件index.js中引入layout.css

      //公共样式
      import 'styles/layout.css';
      

2.5 拆分余下的css文件

  1. 将公共的基础样式(如下),放入src/asserts/stylesbase.css

    body {color: #1C1F21;
    }
    a {text-decoration: none;color: #1C1F21;
    }
    @font-face {font-family: "PingFangSCRegular";/* IE9 */src: url('../fonts/PingFangSCRegular.ttf?t=1583684254005') format('truetype');
    }
    @font-face {font-family: 'iconfont';src: url('../fonts/iconfont.eot');src: url('../fonts/iconfont.eot?#iefix') format('embedded-opentype'), url('../fonts/iconfont.woff2') format('woff2'), url('../fonts/iconfont.woff') format('woff'), url('../fonts/iconfont.ttf') format('truetype'), url('../fonts/iconfont.svg#iconfont') format('svg');
    }
    .iconfont {font-family: "iconfont" !important;font-size: 16px;font-style: normal;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;
    }
    .center-wrap {width: 1152px;height: 100%;margin: 0 auto;position: relative;
    }
    
    • 把原文件中fonts文件夹中的字体图标都移到公共的fonts
      在这里插入图片描述

    • 在入口文件index.js中引入base.css

      //公共样式
      import './styles/base.css';
      
  2. reset.css也放入公共样式中
    在这里插入图片描述

    • 改变reset.css在入口文件中的路径

      //css
      //import './css/reset.css';
      //公共样式
      import './styles/reset.css';
      
  3. 找到bundle.css中所有的公共样式,都剪切到layout.css中 ,再一步步按功能拆分成更多的css组件,最终将bundle.css中的内容搬空.

3 项目完善

3.1 幻灯片组件

3.1.1 结构和样式

  • src/pages/index/components目录下创建新组件slider,内部创建art、css、js文件,设置幻灯片的结构样式,并将carousel组件下images文件夹复制到slider组件中.
    2.

  • slider应用到index.art中,替换carousel;同样的,入口文件中也要替换

    // {{include './components/carousel/carousel.art'}}{{include './components/slider/slider.art'}}
    
    // import './components/carousel';import './components/slider';
    

3.1.2 功能实现

  • slider组件下创建module模块,用于存放各种功能的js文件,实现走马灯效果
    -`

    • base.js
      import { ELEMENT_NODE_TYPE, SLIDER_ANIMATION_CLASS_NAME } from './constants';
      import DEFAULTS from './defaults';
      export default BaseSlider;
      
    • constants.js
      // keyboard
      export const LEFT_KEYCODE = 37;
      export const RIGHT_KEYCODE = 39;// base
      export const ELEMENT_NODE_TYPE = 1;
      export const SLIDER_ANIMATION_CLASS_NAME = 'slider-animation';
      
    • defaults.js
      export default DEFAULTS;
      
    • index.js
      import BaseSlider from './base.js';
      import keyboard from './keyboard.js';
      export default Slider;
      
    • keyboard.js
      import { LEFT_KEYCODE, RIGHT_KEYCODE } from './constants.js';
      export default keyboard;
      
    • slider/index.js
      import Slider from './module';
      
  • silder组件下创建按钮的模板文件btn.art,和样式文件btn.css,对左右按钮定位,并在对应js文件中绑定点击事件
    在这里插入图片描述

    • slider/index.js
      import './btn.css';
      

3.1.3 使用Ajax获取数据

  • src/api目录下新建getData.js文件,封装获取数据的函数getData()

  • getData.js中导入ajax文件中需要用到的方法

    import { getJSON } from './ajax';
    
  • 将源码中的数字,放在新建的config.js文件中,当做配置,方便定位更改
    -

    • config.js

      export const SUCC_CODE = 200;
      export const TIMEOUT = 30000;
      
    • getData.js

      import { SUCC_CODE, TIMEOUT } from './config';
      
    • slider/index.js

      import render from './slider.art';
      import { getData, getDelayedData } from 'api/getData';
      

3.1.4 加载中组件

  • src/components目录下新建加载中组件loading,内部创建模板文件,并进行简单布局,加入所需的资源
    -

  • index.art
    在这里插入图片描述

  • 将接口地址封装起来,新建config.js文件,方便替换.

    • slider/config.js

      export const URL ='https://www.imooc.com/api/mall-PC/index/slider?icode=J6DDC8E3E7A8BF54C';
      
    • slider/index.js

      import { URL } from './config';
      

3.2 机酒自由行组件

4 源码

网盘链接:https://pan.baidu.com/s/1PElIjlZpepRxaY6g8ChsVQ
提取码:dpq1


未完待续…

相关文章:

拆解与重构:慕云游首页组件化设计

目录 前言1 项目准备1.1 创建项目目录1.2 搭建项目开发环境 2 项目组件化2.1 在当前环境启动原有项目2.2 顶部组件2.3 幻灯片组件2.4 机酒自由行组件2.5 拆分余下的css文件 3 项目完善3.1 幻灯片组件3.1.1 结构和样式3.1.2 功能实现3.1.3 使用Ajax获取数据3.1.4 加载中组件 3.2…...

刷了3个月的华为OD算法题,刷出感觉了,如洁柔般丝滑,文末送《漫画算法2:小灰的算法进阶》

目录 一、考研二战,入职华为,反向调剂电子科大深圳下面分享一道2023 B卷 朋友抽中题 简易内存池:二、题目描述三、输入描述四、输出描述样例:输出样例: 五、解题思路六、Java算法源码七、效果展示1、输入2、输出3、说明…...

ip转换器哪个好用 ip地址切换器有哪些

在互联网时代,IP转换器成为了实现高效工作的常见工具。而如今,市面上涌现出了众多的IP转换器软件,使得用户在选择时感到困惑。本文将介绍一种深度IP转换器软件,探讨其特点和优势,以及与其他软件相比的差异,…...

【python】爬取豆瓣电影Top250(附源码)

前言 在网络爬虫的开发过程中,经常会遇到需要处理一些反爬机制的情况。其中之一就是网站对于频繁访问的限制,即IP封禁。为了绕过这种限制,我们可以使用代理IP来动态改变请求的来源IP地址。在本篇博客中,将介绍如何使用代理IP的技术…...

35岁职业危机?不存在!体能断崖?不担心

概述 90年,硕士毕业,干了快8年的Java开发工作。现年33岁,再过2年就要35岁。 工作这些年,断断续续也看过不少35岁找不到工作,转行,降薪入职的传闻、案例。 35岁,甚至30岁之后,体能…...

C语言——指针进阶

本章重点 字符指针数组指针指针数组数组传参和指针传参函数指针函数指针数组指向函数指针数组的指针回调函数指针和数组面试题的解析 1. 字符指针 在指针的类型中我们知道有一种指针类型为字符指针 char* int main() { char ch w; char *pc &ch; *pc w; return 0; }…...

heap pwn 入门大全 - 1:glibc heap机制与源码阅读(上)

本文为笔者学习heap pwn时,学习阅读glibc ptmalloc2源码时的笔记,与各位分享。可能存在思维跳跃或错误之处,敬请见谅,欢迎在评论中指出。本文也借用了部分外网和其他前辈的素材图片,向各位表示诚挚的感谢!如…...

树莓派RP2040 用Arduino IDE安装和编译

目录 1 Arduino IDE 1.1 IDE下载 1.2 安装 arduino mbed os rp2040 boards 2 编程-烧录固件 2.1 打开点灯示例程序 2.2 选择Raspberry Pi Pico开发板 2.3 编译程序 2.4 烧录程序 2.4.1 Raspberry Pi Pico开发板首次烧录提示失败 2.4.2 解决首次下载失败问题 2.4.2.1…...

云安全攻防(八)之 Docker Remote API 未授权访问逃逸

Docker Remote API 未授权访问逃逸 基础知识 Docker Remote API 是一个取代远程命令行界面(rcli)的REST API,其默认绑定2375端口,如管理员对其配置不当可导致未授权访问漏洞。攻击者利用 docker client 或者 http 直接请求就可以…...

2023-08-13 LeetCode每日一题(合并两个有序数组)

2023-08-13每日一题 一、题目编号 88. 合并两个有序数组二、题目链接 点击跳转到题目位置 三、题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 …...

nbcio-boot升级springboot、mybatis-plus和JSQLParser后的LocalDateTime日期json问题

升级后,运行显示项目的时候出现下面错误 2023-08-12 10:57:39.174 [http-nio-8080-exec-3] [1;31mERROR[0;39m [36morg.jeecg.common.aspect.DictAspect:104[0;39m - json解析失败Java 8 date/time type java.time.LocalDateTime not supported by default: add Mo…...

「C/C++」C/C++搭建程序框架

✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C」C/C程序设计「Win」Windows程序设计「DSA」数据结构与算法「File」数据文件格式 目录 1. 分离职…...

Android 内存泄漏

名词解释 内存泄漏:即memory leak。是指内存空间使用完毕后无法被释放的现象,虽然Java有垃圾回收机制(GC),但是对于还保持着引用, 该内存不能再被分配使用,逻辑上却已经不会再用到的对象,垃圾回…...

duckdb 源码分析之select执行流程

...

Android上的基于协程的存储框架

在Android上,经常会需要持久化本地数据,比如我们需要缓存用户的配置信息、用户的数据、缓存数据、离线缓存数据等等。我们通常使用的工具为SharePreference、MMKV、DataStore、Room、文件等等。通过使用现有的存储框架,结合协程,我…...

虚拟现实与增强现实技术的商业应用

章节一:引言 随着科技的不断发展,虚拟现实(Virtual Reality,简称VR)与增强现实(Augmented Reality,简称AR)技术正日益成为商业领域中的重要创新力量。这两种技术为企业带来了前所未…...

每日后端面试5题 第六天

1. Java中有几种类型的流 字符流、字节流 输入流、输出流 节点流、处理流 2 .Spring支持的几种bean的作用域 五种: 1.singleton bean在每个ioc容器中只有一个实例 2.prototype 可以有多个实例 3-5在web环境中才生效 3.request 每次请求才创建bean 4.se…...

LeetCode150道面试经典题-- 两数之和(简单)

1.题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意…...

转义字符\

转移字符,就是通过字符,来转变原来字符的意思 常见的转义字符: 1、 2 注:" 的作用和他是类似的 3 4、 当打印\a时,电脑会出现一个警告,蜂鸣的声音 5、 阿斯克码表...

什么是DNS欺骗及如何进行DNS欺骗

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、什么是 DNS 欺骗?二、开始1.配置2.Ettercap启动3.操作 总结 前言 我已经离开了一段时间,我现在回来了,我终于在做一个教…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...

管理学院权限管理系统开发总结

文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

[拓扑优化] 1.概述

常见的拓扑优化方法有&#xff1a;均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有&#xff1a;有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...

Git 命令全流程总结

以下是从初始化到版本控制、查看记录、撤回操作的 Git 命令全流程总结&#xff0c;按操作场景分类整理&#xff1a; 一、初始化与基础操作 操作命令初始化仓库git init添加所有文件到暂存区git add .提交到本地仓库git commit -m "提交描述"首次提交需配置身份git c…...

ABAP设计模式之---“Tell, Don’t Ask原则”

“Tell, Don’t Ask”是一种重要的面向对象编程设计原则&#xff0c;它强调的是对象之间如何有效地交流和协作。 1. 什么是 Tell, Don’t Ask 原则&#xff1f; 这个原则的核心思想是&#xff1a; “告诉一个对象该做什么&#xff0c;而不是询问一个对象的状态再对它作出决策。…...

迁移科技3D视觉系统:重塑纸箱拆垛场景的智能革命

一、传统拆垛场景的困局与破局之道 在汽车零部件仓库中&#xff0c;每天有超过2万只异形纸箱需要拆垛分拣。传统人工拆垛面临三大挑战&#xff1a; 效率瓶颈&#xff1a;工人每小时仅能处理200-300件&#xff0c;且存在间歇性疲劳安全隐患&#xff1a;20kg以上重箱搬运导致年…...

Prompt工程学习之思维树(TOT)

思维树 定义&#xff1a;思维树&#xff08;Tree of Thoughts, ToT&#xff09; 是一种先进的推理框架&#xff0c;它通过同时探索多条推理路径对思维链&#xff08;Chain of Thought&#xff09;** 进行了扩展。该技术将问题解决视为一个搜索过程 —— 模型生成不同的中间步骤…...