VUE2项目:尚品汇VUE-CLI脚手架初始化项目以及路由组件分析(一)

news2024/11/23 19:38:21

标题

    • 环境
    • VUE2目录
      • public
      • assets
      • components
      • main.js
      • babel.config.js
      • package.json
      • vue.config.js
    • 项目路由分析
    • Header与Footer非路由组件完成
      • Header示例
    • 路由组件的搭建
      • 声明式导航
      • 编程式导航
    • Footer组件的显示与隐藏
    • 路由传递参数
    • 重写push和replace
    • 三级联动组件拆分
    • 附件

环境

前提要有node.jswebpack环境,同时需要安装VUE-CLI,我的版本是@vue/cli 5.0.8

Vue CLI是一个基于Vue.js的快速开发工具,可以帮助开发者快速创建Vue.js项目。运行Vue CLI项目有以下步骤:

1.安装Vue CLI:使用npm或yarn安装Vue CLI,可以使用以下命令:

npm install -g @vue/cli

2.创建Vue项目:使用Vue CLI创建一个新的Vue项目,可以使用以下命令:

vue create app

其中,app是项目名称。

3.运行Vue项目:进入项目目录,并使用以下命令运行Vue项目:

cd app
npm run serve

4.访问Vue应用程序:在浏览器中访问运行Vue项目的地址,可以在终端中看到。默认情况下,应用程序地址为:http://localhost:8080/。

如果需要打包项目,可以使用以下命令:

npm run build

这将生成一个dist目录,其中包含打包的应用程序,具体的安装步骤可以查看vue-cli

加载出来的目录:
在这里插入图片描述

VUE2目录

public

放置静态资源文件,此文件夹中的静态文件资源在webpack打包的时候,会原封不动的打包到dist文件夹中。

assets

放置各个组件公用的静态资源,打包时,将其视作一个模块,打包到JS文件里面。

components

放置非路由组件,就是全局组件。

main.js

程序入口文件,最先执行。

babel.config.js

babel的配置文件。Babel 是一个 JavaScript 编译器。

package.json

项目引入的依赖信息 vue-cli-service serve --open配置这个可以启动直接打开浏览器。

 "scripts": {
   "serve": "vue-cli-service serve --open",
   "build": "vue-cli-service build",
   "lint": "vue-cli-service lint"
 }

vue.config.js

自动加载的一个可选配置的VUE配置文件,项目启动就加载,使用module.exports暴露所配的配置,例如关闭eslint检测:

module.exports = defineConfig({
  // 关闭eslint检测
  lintOnSave: false
 })

具体可以参照:vue-config-js

项目路由分析

VUE中的路由通过vue-router实现,核心根据路由地址去找路由组件,相当于key-value的操作。此项目使用上中下的结构,上部,底部的样式不变中间改变,中间的搜索部分可以拆出一个公共组件。

上部:

在这里插入图片描述

底部:

在这里插入图片描述
这两部分不变可以做成一个公共的组件。

头部与底部组件:Header与Footer作为非路由组件,Home(主页)与Search(搜索),Login登录作为路由组件。

Header与Footer非路由组件完成

完成一个VUE项目的逻辑,先画页面,拆分组件,数据动态展示,数据动态业务处理。同时创建一个组件,需要找准它的结构,样式,以及静态资源。

Header示例

项目使用less控制css样式需要安装less与less-loader,直接执行命令:npm install --save less less-loader@5或者package.json文件中直接加依赖,然后npm install下:

在这里插入图片描述

components文件夹下新建目录Header:

在这里插入图片描述
注意,识别less样式需要加lang="less"

<style scoped lang="less">
.footer {
    background-color: #eaeaea;

    .footer-container {
        width: 1200px;
        margin: 0 auto;
        padding: 0 15px;

        .footerList {
            padding: 20px;
            border-bottom: 1px solid #e4e1e1;
            border-top: 1px solid #e4e1e1;
            overflow: hidden;
            padding-left: 40px;

            .footerItem {
                width: 16.6666667%;
                float: left;

                h4 {
                    font-size: 14px;
                }

                .footerItemCon {
                    li {
                        line-height: 18px;
                    }
                }

                &:last-child img {
                    width: 121px;
                }
            }
        }

        .copyright {
            padding: 20px;

            .helpLink {
                text-align: center;

                li {
                    display: inline;

                    .space {
                        border-left: 1px solid #666;
                        width: 1px;
                        height: 13px;
                        background: #666;
                        margin: 8px 10px;
                    }
                }
            }

            p {
                margin: 10px 0;
                text-align: center;
            }
        }
    }
}
</style>

但是发现样式错乱了,需要使用reset.css清除之前默认的样式:

在这里插入图片描述
reset.css

@import "./iconfont.css";
 
/* 清除内外边距 */
body, h1, h2, h3, h4, h5, h6, hr, p, blockquote,
dl, dt, dd, ul, ol, li,
pre,
fieldset, lengend, button, input, textarea,
th, td {
    margin: 0;
    padding: 0;
}

/* 设置默认字体 */
body,
button, input, select, textarea { /* for ie */
    /*font: 12px/1 Tahoma, Helvetica, Arial, "宋体", sans-serif;*/
    font: 12px/1.3 "Microsoft YaHei",Tahoma, Helvetica, Arial, "\5b8b\4f53", sans-serif; /* 用 ascii 字符表示,使得在任何编码下都无问题 */
    color: #333;
}


h1 { font-size: 18px; /* 18px / 12px = 1.5 */ }
h2 { font-size: 16px; }
h3 { font-size: 14px; }
h4, h5, h6 { font-size: 100%; }

address, cite, dfn, em, var, i{ font-style: normal; } /* 将斜体扶正 */
b, strong{ font-weight: normal; } /* 将粗体扶细 */
code, kbd, pre, samp, tt { font-family: "Courier New", Courier, monospace; } /* 统一等宽字体 */
small { font-size: 12px; } /* 小于 12px 的中文很难阅读,让 small 正常化 */

/* 重置列表元素 */
ul, ol { list-style: none; }

/* 重置文本格式元素 */
a { text-decoration: none; color: #666;}


/* 重置表单元素 */
legend { color: #000; } /* for ie6 */
fieldset, img { border: none; }
button, input, select, textarea {
    font-size: 100%; /* 使得表单元素在 ie 下能继承字体大小 */
}

/* 重置表格元素 */
table {
    border-collapse: collapse;
    border-spacing: 0;
}

/* 重置 hr */
hr {
    border: none;
    height: 1px;
}
.clearFix::after{
	content:"";
	display: block;
	clear:both;
}
/* 让非ie浏览器默认也显示垂直滚动条,防止因滚动条引起的闪烁 */
html { overflow-y: scroll; }

a:link:hover{
    color : rgb(79, 76, 212) !important;
    text-decoration: underline;
}

/* 清除浮动 */
.clearfix::after {
    display: block;
    height: 0;
    content: "";
    clear: both;
    visibility: hidden;
}

然后在index.html页面:<link rel="stylesheet" href="./reset.css">

在这里插入图片描述
使用Header组件

App.vue注册这个组件使用:

在这里插入图片描述

App.vue代码:

<template>
  <div>
  	<!--使用组件-->
    <Header></Header>
    <router-view></router-view>
    <Footer v-show="$route.meta.show"></Footer>
  </div>
</template>

<script>
// 导入组件
import Header from './components/Header';
import Footer from './components/Footer';

export default {
  name: 'App',
  components: {
    Header,
    Footer
  },
  mounted(){
    // 只发一次
    this.$store.dispatch('categoryList');
  }
}
</script>
<style>
</style>

操作Footer组件的步骤与Header一致。

路由组件的搭建

项目的路由组件分为四个,Home,Search,Login,Register,需要安装vue-router路由npm install --save vue-router。路由组件一般放在pages或views文件夹下。

在这里插入图片描述
在router中的index.js需要引入这些路由组件,并对外暴露。

// 导入路由组件
import Vue from 'vue';
import VueRouter from 'vue-router';

// 使用插件
Vue.use(VueRouter);
// 引入路由组件
import Home from '@/pages/Home';
import Search from '@/pages/Search';
import Login from '@/pages/Login';
import Register from '@/pages/Register';

// 配置路由
export default new VueRouter({
    // 配置路由 
    routes: [
        {
            path: "/home",
            component: Home,
            meta: {
                show: true
            }
        },
        {
            path: "/search/:keyword?",
            component: Search,
            meta: {
                show: true
            },
            name: 'search'
        },
        {
            path: "/login",
            component: Login,
            meta: {
                show: false
            }
        },
        {
            path: "/register",
            component: Register,
            meta: {
                show: false
            }
        },
        {
            // 页面重定向,访问/重定向到首页
            path: "*",
            redirect: "/home"
        },
    ]
});

上面只是暴露了这些组件,还需将这些组件在main.js中进行注册:

在这里插入图片描述
声明了router之后,只要组件注册了,组件就会有$route属性,主要接收路由所携带的参数信息,对于$router来说,$router是用于进行路跳转并携带参数的。

关于路由的信息可参照vue-router官网。

最后要想路由生效需要在App.vue中加入:<router-view/>

在这里插入图片描述

声明式导航

用图中三个链接来做一下声明式导航的例子,点击对应的链接进入到相应的页面中,如点击图片进入首页。
在这里插入图片描述
具体实现:使用router-link中的to标签进行路由跳转。

在这里插入图片描述

编程式导航

编程式导航主要是用于携带参数跳转的路由。比如关键字搜索

在这里插入图片描述
搜索按钮中定义,goSearch()方法

在这里插入图片描述
实现这个方法:内部实现后面细说。

在这里插入图片描述

Footer组件的显示与隐藏

希望在登录或者注册情况下将底部组件隐藏,可以在 路由配置文件index.js使用路由元信息meta进行配置:

在这里插入图片描述
在应用此Footer组件的地方使用$route.meta.show获取值即可。

在这里插入图片描述

路由传递参数

路由传参主要有两种写法,paramsquery区别官网说的很详细,主要就是params可以占位,query不可占位。

在这里插入图片描述
上面简单说了编程式导航,接下来看看编程式导航如何进行传参。

以关键字查询为例:

字符串传参与模板传参

// 字符串传参
this.$router.push("/search/"+this.keyword+"?k="+this.keyword.toUpperCase())
.catch(err => err)
// 模板传参
this.$router.push(`/search/${this.keyword}?k=${this.keyword.toUpperCase()}`)
.catch(err => err)

对象传参

对象传参的方式最常见。

// 对象传参
this.$router.push({
    name: "search",
    params: {
        keyword: this.keyword
    },
    query: {
        k: this.keyword.toUpperCase()
    }
})

需要在对应的路由中声明参数name: "search",标识这是/search路由,不可使用直接使用path

使用$route.params.keyword$route.query.k获取指定的值。

在这里插入图片描述

重写push和replace

直接使用Vue自带的push或repalce方法,当你多次点击同一个路由时,控制台就会报NavigationDuplicated的错,虽然不影响代码实现的功能,但是忍不了红色的错误。

这里一般是固定的写法,拿来用即可解决上述问题。

// 先把VueRouter原型对象的push,先保存一份
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;
 
// 重写push|replace
// 第一个参数:告诉原来push方法,你往哪里跳转(传递哪些参数)
// 第二个参数:成功的回调
// 第三个参数:失败的回调
//  call || apply区别
//  相同点,都可以调用函数一次,都可以篡改函数的上下文一次
//  不同点:call与apply传递参数:call传递参数用逗号隔开,apply方法执行,传递数组
VueRouter.prototype.push = function (location, resolve, reject) {
  if (resolve && reject) {
    originPush.call(this, location, resolve, reject);
  } else {
    originPush.call(this, location, () => {
    }, () => {
    })
  }
}
 
VueRouter.prototype.replace = function (location, resole, reject) {
  if (resole && reject) {
    originReplace.call(this, location, resole, reject);
  } else {
    originReplace.call(this, location, () => {
    }, () => {
    })
  }
}

三级联动组件拆分

三级联动组件在Home、Search、Detail等组件会用到,可以将其弄成一个公共的全局组件TypeNav

在这里插入图片描述

参考Header组件导入静态资源之后,将其在main.js注册为一个全局的组件,好处就是无需import即可在项目中任意地方使用,Header之前import了因为没有在main.js注册成一个全局的组件。

// 三级联动全局组件
import TypeNav from '@/components/TypeNav';
// 注册为全局组件 arg1: 组件名称 arg2: 当前组件
Vue.component(TypeNav.name,TypeNav)

随后,我们在Home组件的index.vue注册<TypeNav/>即可。

在这里插入图片描述
随后我们可以按照之前的步骤将首页剩下的页面拆成一个个组件进行注册:

在这里插入图片描述

导入这些组件并注册:

在这里插入图片描述

附件

最后展示的截图信息是这样的:

![(https://img-blog.csdnimg.cn/06c32e2630c54795839b225caccf24ae.png)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Scala第四章节

Scala第四章节 scala总目录 章节目标 掌握分支结构的格式和用法掌握for循环和while循环的格式和用法掌握控制跳转语句的用法掌握循环案例理解do.while循环的格式和用法 1. 流程控制结构 1.1 概述 在实际开发中, 我们要编写成千上万行代码, 代码的顺序不同, 执行结果肯定也…

GD32工程创建

1.创建空工程 在任意路径下创建空的test文件夹。打开keil5空工程创建空工程 选择对应的芯片型号&#xff1a; 然后把空工程保存到test文件夹下。会自动生成如下文件。 2. 添加组 下载GD32F10X的固件库&#xff1a;在百度里搜索GD32进入官网。 下载下来对应的文件如下&#xff…

问题记录 springboot 事务方法中使用this调用其它方法

原因: 因为代理对象中调用了原始对象的toString()方法,所以两个不同的对象打印出的引用是相同的

HTML详细基础(三)表单控件

本帖介绍web开发中非常核心的标签——表格标签。 在日常我们使用到的各种需要输入用户信息的场景——如下图&#xff0c;均是通过表格标签table创造出来的&#xff1a; 目录 一.表格标签 二.表格属性 三.合并单元格 四.无序列表 五.有序列表 六.自定义标签 七.表单域 …

Java微信分享接口开发

概述 微信JS-SDK实现自定义分享功能&#xff0c;分享给朋友&#xff0c;分享到朋友圈 详细 概述 概述 微信公众平台开始支持前端网页&#xff0c;大家可能看到很多网页上都有分享到朋友圈&#xff0c;关注微信等按钮&#xff0c;点击它们都会弹出一个窗口让你分享和关注&…

抢先一步感受未来:Raspberry Pi 5正式发布!

在经历了几年全球供应链困境导致 Raspberry Pi 单板计算机的产能降低和零售价格上涨之后&#xff0c;今天终于迎来了更新。Raspberry Pi 4 上市四年后&#xff0c;今天Raspberry Pi 5正式发布&#xff01;新推出的 Raspberry Pi 5 配备了经过大幅改进升级的SoC&#xff0c;带来…

【owt-server】fix : node-gyp configure 报错:Error: read ECONNRESET

npm已经设置了registry 还报错 npm config set registry http://registry.npmmirror.comnode-gyp configure 指令 node-gyp configure 报错 read ECONNRESET root@k8s-master-2K4G:~/p2p/zdsvr-20201229# ./scripts/build.js -t mcu --check /root/p2p/zdsvr-20201229/build/li…

ipaguard界面概览

ipaguard界面概览 ipaguard界面分左右2块&#xff1a;左边菜单导航栏&#xff0c;右边的功能区 左侧菜单&#xff1a;按模块分成启动界面&#xff0c;代码模块&#xff0c;文件模块&#xff0c;重签名与测试模块 右侧主功能区会随着功能变化&#xff0c;但是整体分3块&#xf…

【2023研电赛】华东赛区一等奖:电动叉车永磁同步电机MTPA及弱磁控制研究

本文为2023年第十八届中国研究生电子设计华东赛区一等奖竞赛作品分享&#xff0c;参加极术社区的【有奖活动】分享2023研电赛作品扩大影响力&#xff0c;更有丰富电子礼品等你来领&#xff01;&#xff0c;分享2023研电赛作品扩大影响力&#xff0c;更有丰富电子礼品等你来领&a…

5+SUMO化修饰+分型+实验,经典生信思路

今天给同学们分享一篇5SUMO化修饰分型实验的生信文章“SUMOylation patterns and signature characterize the tumor microenvironment and predict prognosis in lung adenocarcinoma”&#xff0c;这篇文章于2023年4月13日发表在Front Cell Dev Biol 期刊上&#xff0c;影响因…

直击2023中国(天津)国际汽车展览会 感受大运新能源的造车实力

作为汽车行业“新风口”&#xff0c;新能源汽车近年来的热度可谓居高不下。目前&#xff0c;各大车企纷纷抢滩新能源汽车赛道&#xff0c;发挥出各自的看家本领抢占更多市场话语权。相比盲目跟风的车企而言&#xff0c;拥有多年造车经验的大运集团&#xff0c;经过科学严谨的战…

熔断器Hystrix简介

使用熔断器防止服务雪崩-Hystrix 雪崩效应 在微服务架构中&#xff0c;根据业务来拆分成一个个的服务&#xff0c;服务与服务之间可以通过 RPC 相互调用&#xff0c;在 Spring Cloud 中可以用 RestTemplate Ribbon 和 Feign 来调用。为了保证其高可用&#xff0c;单个服务通常…

Sentinel学习——CAP理论,微服务中的雪崩问题,和Hystix的解决方案 Sentinel的相关概念 + 下载运行

前言 Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 本篇博客介绍CAP理论&#xff0c;微…

红黑树是如何实现的?

文章目录 一、红黑树的概念二、红黑树的性质三、红黑树和AVL树对比四、红黑树的插入1. 红黑树的结点定义2. 父亲的颜色3. 叔叔的颜色为红色4. 叔叔不存在5. 叔叔存在且为黑6. 插入的抽象图 五、红黑树的验证1. 检查平衡2. 计算高度与旋转次数3. 验证 六、 红黑树与AVL树的比较 …

QT使用前的知识

QT使用前的知识 常用的快捷键 源文件的内容解释 .pro文件的解释 头文件的解释 构建新的对象—组成对象树 槽函数 自定的信号和槽 槽函数的信号是一个重载函数时 电机按钮触发信号 调用无参数的信号 断开信号

GPT-4科研实践:数据可视化、统计分析、编程、机器学习数据挖掘、数据预处理、代码优化、科研方法论

查看原文>>>GPT4科研实践技术与AI绘图 GPT对于每个科研人员已经成为不可或缺的辅助工具&#xff0c;不同的研究领域和项目具有不同的需求。例如在科研编程、绘图领域&#xff1a;1、编程建议和示例代码: 无论你使用的编程语言是Python、R、MATLAB还是其他语言&#x…

详解C语言—文件操作

目录 1. 为什么使用文件 2. 什么是文件 3. 文件的使用 文件指针 文件的打开和关闭 三个标准的输入/输出流&#xff1a; 4. 文件的顺序读写 对字符操作&#xff1a; fputc&#xff1a; fgetc&#xff1a; 练习复制整个文件&#xff1a; 对字符串操作&#xff1a;…

C++ 并发编程实战 第七章 设计无锁数据结构

目录 7.1 定义和推论 7.1.1 非阻塞型数据结构 7.1.2 无锁数据结构 7.1.3 无需等待的数据结构 7.1.4 无锁数据结构的优点和缺点 7.2 无锁数据结构范例 7.2.1 实现线程安全的无锁栈 7.2.2 制止麻烦的内存泄漏&#xff1a;在无锁数据结构中管理内存 7.2.3 运用风险指针检…

排序:败者树和置换选择排序(解决外部排序中的优化问题)

1.算法目的&#xff08;败者树&#xff09; 解决多路平衡归并带来的问题。 在外部排序中&#xff0c;使用k路平衡归并策略, 选出一个最小元素需要对比关键字(k-1)次&#xff0c; 导致内部归并所需时间增加。&#xff08;可用“败者树”进行优化&#xff09; 2.败者树的定义 …

Spring源码分析(四) Aop全流程

一、Spring AOP基础概念 1、基础概念 连接点(Join point)&#xff1a;能够被拦截的地方&#xff0c;Spring AOP 是基于动态代理的&#xff0c;所以是方法拦截的&#xff0c;每个成员方法都可以称之为连接点&#xff1b;切点(Poincut)&#xff1a;每个方法都可以称之为连接点&…