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

目录

  • 前言
  • 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


未完待续…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/72260.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

0基础学习VR全景平台篇 第81篇:全景相机-临云镜如何直播推流

临云镜全景相机是阿里巴巴定制全景设备,实现空间三维信息的快速采集,与阿里云三维空间重建平台搭配,帮助品牌商与平台以较低的成本完成空间的快速采集,并支持对室内/室外空间的三维全景展示及空间漫游,同时支持VR浏览、…

适配器模式-java实现

意图 复用已经存在的接口,与所需接口不一致的类。即将一个类(通常是旧系统中的功能类),通过适配器转化成另一个接口的实现。(简单来说,就是复用旧系统的功能,去实现新的接口) 我们举…

【MFC】05.MFC六大机制:程序启动机制-笔记

MFC程序开发所谓是非常简单,但是对于我们逆向人员来说,如果想要逆向MFC程序,那么我们就必须了解它背后的机制,这样我们才能够清晰地逆向出MFC程序,今天这篇文章就来带领大家了解MFC的第一大机制:程序启动机…

datax抽取库名带点的表遇到的问题

一、描述任务 使用Datax抽取mysql中的数据到hive的wedw_ods层中,mysql的库名为:b.p.n.p 表名为:bene_group 二、datax.json脚本生成 因为datax的脚本是自动生成的,生成的格式如下: {"core": {},"jo…

链表OJ详解

💕人生不满百,常怀千岁忧💕 作者:Mylvzi 文章主要内容:链表oj详解 题目一:移除元素 题目要求: 画图分析: 代码实现: struct ListNode* removeElements(struct List…

mysql数据库如何转移到oracle

mysql数据库转移到oracle 在研发过程中,可能会用到将表数据库中的表结构及数据迁移到另外一种数据库中, 比如说从mysql中迁移到oracle中, 常用的方法有好些,如下 1、使用powerdesigner,先连接mysql然后生成mysql的p…

【工作中问题解决实践 十一】Kafka消费者消费堆积且频繁rebalance

最近有点不走运,老是遇到基础服务的问题,还是记着点儿解决方法,以后再遇到快速解决吧,今天遇到这个问题倒不算紧急,但也能通过这个问题熟悉一下Kafka的配置。 问题背景 正在开会的时候突然收到一连串的报警&#xff…

Three.js 实现材质边缘通道发光效果

相关API的使用: 1. EffectComposer(渲染后处理的通用框架,用于将多个渲染通道(pass)组合在一起创建特定的视觉效果) 2. RenderPass(是用于渲染场景的通道。它将场景和相机作为输入,使用Three.…

Javascript异步编程的4种方法

你可能知道,Javascript语言的执行环境是"单线程"(single thread)。 所谓"单线程",就是指一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成,再执行后面一…

4.深入对象

4.1创建对象三种方式 1.利用对象字面量创建对象 const obj{ name : 佩奇 }2.利用new 0bject创建对象 const obj new Object({ name: 佩奇 }) console.log(obj) // {name: 佩奇}3.利用构造函数创建对象 4.2构造函数 构造函数:是一种特殊的函数,主要用来初始化…

关于memset的小实验

关于memset的小实验 memset是包含在<string.h>的函数&#xff0c;用来给字符数组赋值。然而人们常常把它拿来给整型变量赋值。 void *MEMSET (void *dstpp, int c, size_t len)memset是一个返回通用指针的函数&#xff0c;返回的地址便是输入的地址 int c表示对这块内…

时序预测 | Matlab实现基于GRNN广义回归神经网络的电力负荷预测模型

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 时序预测 | Matlab实现基于GRNN广义回归神经网络的电力负荷预测模型 1.Matlab实现基于GRNN广义回归神经网络的电力负荷预测模型 2.单变量时间序列预测; 3.多指标评价,评价指标包括:R2、MAE、MBE等,代码质量极高…

Microsoft SQL Server 2008中,语法生成错误“并行数据仓库(PDW)功能未启用“(已解决)

案例&#xff1a; 原表有两列&#xff0c;分别为月份、月份销售额&#xff0c;而需要一条 SQL 语句实现统计出每个月份以及当前月以前月份销售额和 sql 测试数据准备&#xff1a; DECLARE Temp Table ( monthNo INT, --- 月份 MoneyData Float --- 金额 ) insert INTO TEM…

彻底卸载Android Studio

永恒的爱是永远恪守最初的诺言。 在安装Android Studio会有很多问题导致无法正常运行&#xff0c;多次下载AS多次错误后了解到&#xff0c;删除以下四个文件才能彻底卸载Android Studio。 第一个文件&#xff1a;.gradle 路径&#xff1a;C:\Users\yao&#xff08;这里yao是本…

Rx.NET in Action 第一章学习笔记

Part 1 初入反应式扩展 什么是反应式程序&#xff1f;它们有什么用&#xff1f;使用反应式扩展&#xff08;Rx&#xff09;编程&#xff0c;会如何改变你编写代码的方式&#xff1f;在开始使用 Rx 之前应该做些什么&#xff1f;为什么 Rx 比传统的事件驱动编程更好&#xff1f…

运算器组成实验

1.实验目的及要求 实验目的 1、熟悉双端口通用寄存器组的读写操作。 2、熟悉运算器的数据传送通路。 3、验证运算器74LS181的算术逻辑功能。 4、按给定数据&#xff0c;完成指定的算术、逻辑运算。 实验要求 1、做好实验预习。掌握运算器的数据传送通路和ALU的功能特性&…

CAP理论与MongoDB一致性,可用性的一些思考

正文 大约在五六年前&#xff0c;第一次接触到了当时已经是hot topic的NoSql。不过那个时候学的用的都是mysql&#xff0c;Nosql对于我而言还是新事物&#xff0c;并没有真正使用&#xff0c;只是不明觉厉。但是印象深刻的是这么一张图片&#xff08;后来google到图片来自这里&…

工博士与纷享销客达成战略合作,开启人工智能领域合作新篇章

近日&#xff0c;工博士与纷享销客在上海正式签署了战略合作协议&#xff0c;正式拉开了双方在人工智能与数字营销领域的合作序幕。这次合作将为双方带来更多机遇和发展空间&#xff0c;并为全球人工智能领域的客户提供更高效、智能的CRM解决方案。 < 双方项目人员合影 >…

uniapp项目如何运行在微信小程序模拟器上

在HbuilderX中的小程序写完后自己一定要保存&#xff0c;否则会出不来效果 那么怎么让uniapp项目运行在微信小程序开发工具中呢 1 在hbuilderx中点击运行到小程序模拟器 2 然后在项目目录中会生成一个文件夹 在微信小程序开发软件中的工具>安全设置>打开端口 或者在微…

gitee linux免密/SSH 方式连接免登录

目录 账号密码方式免登录&#xff08;不推荐&#xff09;添加git配置新建保存密码文件git clone SSH 方式连接免登录&#xff08;推荐&#xff09;生成SSH公钥通过 ssh-keygen 程序创建找到SSH公钥 在gitee中添加公钥git clone 参考 账号密码方式免登录&#xff08;不推荐&…