毕设home系列【1】

article/2025/8/24 0:59:20

1.Home模块组件拆分

  1. 先把静态页面完成
  2. 拆分出静态组件
  3. 获取服务器的数据进行展示
  4. 动态业务

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

导航栏这儿是个二级联动,拆分为全局组件,可以在项目的任意地方使用

import TypeNav from '@/pages/Home/TypeNav';
// 第一个参数:全局组件的名字,第二个参数:哪一个组件
Vue.component(TypeNav.name,TypeNav);

2.axios二次封装

XMLHttpRequest、Fetch、JQ、axios

为什么需要进行二次封装?
请求拦截器:可以在发请求之前处理一些业务
响应拦截器:当服务器数据返回以后,可以处理一些事情

cnpm install --save axios

api文件夹放axios请求

// 对于axios进行二次封装
import axios from 'axios';
// 请求和响应拦截器
// 1:利用axios对象的方法create,去创建一个axios实例
// 2:request就是axios,只不过我们可以自己配置一些属性
const requests = axios.create({// 创建配置对象// baseURL:基础路径,发请求的时候都带上/api,就不用自己手动写了baseURL: "/api",// timeOut:代表请求超时的时间5Stimeout: 5000,
})
// 拦截器(interceptors)
// 请求拦截器:在发请求之前可以监测到,可以做一些事情
requests.interceptors.request.use((config) => {// config:配置对象,对象里面有一个属性很重要,是headers请求头return config;
});
// 响应拦截器:成功的回调,会返回服务器带来的数据;失败的回调,终止promise链
requests.interceptors.response.use((res) => {return res.data;
}, (error) => {return Promise.reject(new Error('fail'));
});// 对外暴露
export default requests;

3.接口统一管理

  1. 项目很小:完全可以组件的生命周期函数中发请求,在mounted或者created中发请求,获取到服务器的数据,存储到data中。

3.1跨域问题

跨域:协议、域名、端口号不同请求,称之为跨域

办法:JSONP、CROS、代理

4.nprogress进度条插件的使用

cnpm i --save nprogress

5.vuex状态管理库

state
mutations
actions
getters
modules

import Vue from 'vue';
import Vuex from 'vuex';
// 需要使用插件一次
Vue.use(Vuex);
// state:仓库存储数据的地方
const state = {};
// mutations:修改state的唯一手段
const mutations = {};
// actions:处理actions,可以书写自己的业务逻辑,处理异步任务
const actions = {};
// getters:理解为计算属性,用于简化仓库数据,让组件获取仓库的数据更加方便
const getters = {};// 对外暴露store类的一个实例
export default new Vuex.Store({// Vuex的配置对象,key值不能瞎写state,mutations,actions,getters
});

注意vuex是3版本

5.1vuex实现模块式开发

如果项目过大,组件过多,接口也很多,数据也很多,如果有100个模块,state数据太多
模拟state数据

{count:1,search:{a:1},detail:{xxx},pay:{xxx}}

大仓库拆分出许多小仓库

返回的数据是数组形式

// 引入请求
import { reqNavList } from '@/api'
// home模块的小仓库
// state:仓库存储数据的地方
const state = {// state的初始值:根据接口的返回值写,是数组,还是对象navList: [],
};
// mutations:修改state的唯一手段
const mutations = {NAVLIST(state, navList) {// 修改state中navList的数据state.navList = navList;}
};
// actions:处理actions,可以书写自己的业务逻辑,处理异步任务
const actions = {// 通过API里面的接口函数,向服务器发请求,获取服务器的数据// 解构commit,提交mutationasync navList({commit}) {// 调用reqNavList函数let result = await reqNavList();if (result.code == 200) {// 提交的数据是result.datacommit("NAVLIST", result.data);}}
};
// getters:理解为计算属性,用于简化仓库数据,让组件获取仓库的数据更加方便
const getters = {};
export default {// Vuex的配置对象,key值不能瞎写state,mutations,actions,getters
}

在这里插入图片描述
三级分类

      <div class="sort"><div class="all-sort-list2"><!-- 一级分类【替换】 --><!-- c1是一级分类的对象,index是索引值,navList是计算属性的属性,key值是找id--><div class="item" v-for="(c1,index) in navList" :key="index"><h3><a href="">{{ c1.categoryName }}</a></h3><div class="item-list clearfix"><!-- 二级分类 --><div class="subitem" v-for="(c2,index) in c1.categoryChild" :key="index"><dl class="fore"><dt><a href="">{{c2.categoryName}}</a></dt><dd ><em v-for="(c3,index) in c2.categoryChild" :key="index"><a href="">{{c3.categoryName}}</a></em></dd></dl></div></div></div></div></div>

6.完成一级分类动态添加背景颜色

给父盒子添加离开函数,事件委派
事件委派:指将事件统一绑定给元素的共同的祖先元素,这样当后代元素上的事件触发时,会一直冒泡到祖先元素,从而通过祖先元素的响应函数来处理事件

<template><!-- 商品分类导航 --><div class="type-nav"><div class="container"><div @mouseleave="leaveIndex"><h2 class="all">全部信息分类</h2><div class="sort"><div class="all-sort-list2"><!-- 一级分类【替换】 --><!-- c1是一级分类的对象,index是索引值,navList是计算属性的属性,key值是找id--><divclass="item"v-for="(c1, index) in navList":key="index":class="{ cur: currentIndex == index }"><h3 @mouseenter="changeIndex(index)"><a href="">{{ c1.categoryName }}</a></h3><div class="item-list"><!-- 二级分类 --><divclass="subitem"v-for="(c2, index) in c1.categoryChild":key="index"><dl class="fore"><dt><a href="">{{ c2.categoryName }}</a></dt><!-- 三级分类 --><dd><em v-for="(c3, index) in c2.categoryChild" :key="index"><a href="">{{ c3.categoryName }}</a></em></dd></dl></div></div></div></div></div></div><!-- 导航栏 --><nav class="nav"><a href="###">紧急寻亲</a><a href="###">寻亲登记</a><a href="###">寻亲专区</a><a href="###">公益捐助</a><a href="###">互助社区</a><a href="###">焦点摄影</a><a href="###">援助驿站</a><!-- <a href="###">我们的行动</a> --></nav></div></div>
</template><script>
// 开始从仓库中捞数据
// mapState辅助函数
import { mapState } from "vuex";
export default {name: "TypeNav",data() {return {currentIndex: -1,};},mounted() {// 通知Vuex发请求,获取数据,存储于仓库当中// 派发actionthis.$store.dispatch("navList");},// 映射为组件身上的一个实例对象,计算属性computed: {...mapState({// 属性名:属性值(是一个函数)// 右侧为啥是一个函数呢?当使用这个计算属性的时候,右侧的函数会立即执行一次,会注入一个参数state,state即为大仓库中的数据// 箭头函数的简写形式,去掉return,去掉花括号navList: (state) => state.home.navList,}),},methods: {// 鼠标进入修改响应式数据currentIndexchangeIndex(index) {// index:鼠标移上某一级分类的元素的索引值this.currentIndex = index;},leaveIndex() {// index:鼠标移出的时候currentIndex,变为-1this.currentIndex = -1;},},
};
</script>

7.通过js控制二三级商品分类的显示与隐藏

v-show=“currentIndex == index”
去掉css的display:none

8.完成三级联动节流的操作

依赖lodash插件

// 默认暴露的,不用加小括号{throttle}
import throttle from “lodash/throttle”;
changeIndex: throttle(function (index) {
// index:鼠标移上某一级分类的元素的索引值
this.currentIndex = index;
}, 50),

<script>
// 开始从仓库中捞数据
// mapState辅助函数
import { mapState } from "vuex";
// 引入lodash:是把lodash全部功能函数引入
// 最好的引入方式:按需加载
// 默认暴露的,不用加小括号{throttle}
import throttle from "lodash/throttle";
export default {name: "TypeNav",data() {return {currentIndex: -1,};},mounted() {// 通知Vuex发请求,获取数据,存储于仓库当中// 派发actionthis.$store.dispatch("navList");},// 映射为组件身上的一个实例对象,计算属性computed: {...mapState({// 属性名:属性值(是一个函数)// 右侧为啥是一个函数呢?当使用这个计算属性的时候,右侧的函数会立即执行一次,会注入一个参数state,state即为大仓库中的数据// 箭头函数的简写形式,去掉return,去掉花括号navList: (state) => state.home.navList,}),},methods: {// es5的写法,kv形式changeIndex: throttle(function (index) {// index:鼠标移上某一级分类的元素的索引值this.currentIndex = index;}, 50),leaveIndex() {// index:鼠标移出的时候currentIndex,变为-1this.currentIndex = -1;},},
};
</script>

9.三级联动组件的路由跳转与传递参数

Home模块跳转到seekfamily模块:

  1. 一级会把用户选择的名字在路由跳转的时候进行传递
  2. path: “/SeekFamily/:keyword?“加问号,三级联动就可以直接跳转
    < router-link to=”/SeekFamily”>{{ c1.categoryName }}< /router-link >

  3. 但是容易出现卡顿的现象

利用事件委派存在一些问题:
4. 怎么确定点击一定是a标签
5. 路由跳转需要参数,如何获取

事件委派+编程式导航
利用自定义属性
如果a标签有data-categoryName一定就是a标签,其余子节点是没有的
HTML允许自定义属性以data-开头即为自定义属性

          <div class="all-sort-list2" @click="goSeek"><!-- 一级分类【替换】 --><!-- c1是一级分类的对象,index是索引值,navList是计算属性的属性,key值是找id--><divclass="item"v-for="(c1, index) in navList":key="index":class="{ cur: currentIndex == index }"><h3 @mouseenter="changeIndex(index)"><a:data-categoryName="c1.categoryName":data-category1Id="c1.categoryId">{{ c1.categoryName }}</a></h3><!-- 二、三级分类 --><div class="item-list" v-show="currentIndex == index"><!-- 二级分类 --><divclass="subitem"v-for="(c2, index) in c1.categoryChild":key="index"><dl class="fore"><dt><a:data-categoryName="c2.categoryName":data-category2Id="c2.categoryId">{{ c2.categoryName }}</a></dt><!-- 三级分类 --><dd><em v-for="(c3, index) in c2.categoryChild" :key="index"><a:data-categoryName="c3.categoryName":data-category3Id="c3.categoryId">{{ c3.categoryName }}</a></em></dd></dl></div></div></div></div>
goSeek(event) {// 最优解:编程式导航+事件委派let element = event.target;// 节点有一个属性dataset,可以获取节点的自定义属性和属性值// 浏览器自动识别data-xxx,注意获取到的xxx都是小写let { categoryname, category1id, category2id, category3id } =element.dataset;if (categoryname) {// 一级分类、二级分类、三级分类的判断// 整理路由跳转的参数let location = { name: "SeekFamily" };// query参数需要动态添加,没办法区分一级、二级、三级let query = { categoryName: categoryname };if (category1id) {query.category1Id = category1id;} else if (category2id) {query.category2Id = category2id;} else {query.category3Id = category3id;}console.log(location,query);// 整理完参数location.query = query;// 路由跳转this.$router.push(location);}},

10.合并params和query参数


http://chatgpt.dhexx.cn/article/292XWXDg.shtml

相关文章

通过免费API, 按照日期, 生成假日表

需求产生&#xff1a;需要根据每日的节假日状态&#xff0c;来进行一些自动化作业&#xff0c;例如&#xff1a;休假日闹钟不响&#xff0c;工作日早晨自动打开收音机等等…… 在网上找到了这样一个API ↑ 先在浏览器里试了一下&#xff0c;确认可以获得数据&#xff0c;于是…

Python网络爬虫(八)根据api判断法定节假日

判断当前日期是否是节假日 1、api接口地址1&#xff1a;http://api.goseek.cn/Tools/holiday?date20190225 (以今日20190225为例) api接口地址2&#xff1a;http://www.easybots.cn/api/holiday.php?d20190225 用法举例 检查一个日期是否为节假日 http://www.easybots.cn…

java获取工作日 日历接口_节假日api接口之获取指定日期的节假日信息

获取指定日期的节假日信息 1、接口地址:http://api.goseek.cn/Tools/holiday?date=数字日期 2、返回数据: 3、节假日数据说明:本接口包含2017年起的中国法定节假日数据,数据来源国务院发布的公告,每年更新1次,确保数据最新 4、示例: 返回数据: {"code":1000…

MQ-2型烟雾传感器

烟雾检测报警器是能够检测环境中的烟雾浓度&#xff0c;并具有报警功能的仪器&#xff0c;仪器的最基本组成部分应包括&#xff1a;烟雾信号采集电路、模数转换电路、单片机控制电路。 反烟雾信号采集电路一般由烟雾传感器和模拟放大电路组成&#xff0c;将烟雾信 号转化为模拟…

MQ-2烟雾传感器检测

MQ-2烟雾传感器检测 作为一个新手&#xff0c;第一次自己独立写了一个MQ-2烟雾传感器检测小项目。在这过程中出现很多错误&#xff0c;弄得我头大&#xff0c;通过自己在网上不断地查找资料&#xff0c;最终得以解决。主要问题有以下两个&#xff1a; 1.在编译时出错。显示…\…

基于MQ-135传感器和Arduino开发板的烟雾探测器

在本篇文章中&#xff0c;我们主要介绍如何使用MQ-135传感器和Arduino开发板制作一款烟雾探测器&#xff0c;用于测量环境中的烟雾等级。只需将MQ-135气体传感器模块与Arduino和1602 LCD模块连接即可显示。我们使用的烟雾传感器是MQ-135传感器。烟雾探测器在检测建筑物以及一些…

51单片机烟雾报警器mq2烟雾报警ADC0832采集实践制作DIY- GC0026-烟雾报警器

一、功能说明&#xff1a; 基于51单片机设计-烟雾报警器 功能介绍&#xff1a; STC89C52单片机&#xff08;AT89C51/52&#xff09;lcd1602adc0832mq2烟雾传感器蜂鸣器2个按键设定报警阈值 1.通过ADC0832采集MQ2烟雾输出的电压换算位烟雾浓度0~100 2.如果烟雾浓度超过设定…

基于51单片机烟雾报警器mq2烟雾报警ADC0832采集

实践制作DIY- GC0026-烟雾报警器 一、功能说明&#xff1a; 基于51单片机设计-烟雾报警器 功能介绍&#xff1a; STC89C52单片机&#xff08;AT89C51/52&#xff09;lcd1602adc0832mq2烟雾传感器蜂鸣器2个按键设定报警阈值 1.通过ADC0832采集MQ2烟雾输出的电压换算位烟雾…

arduino 读取模拟电压_MQ2气体/烟雾传感器如何工作及其与Arduino接口

arduino 读取模拟电压_MQ2气体/烟雾传感器如何工作及其与Arduino接口 使用MQ2气体传感器模块&#xff0c;为您的下一个Arduino项目带来一个人工鼻子。这是一个强大的气体传感器适用于感测LPG&#xff0c;烟雾&#xff0c;酒精&#xff0c;丙烷&#xff0c;氢气&#xff0c;甲烷…

MP-2平面烟雾气体传感器介绍

MP-2平面烟雾气体传感器简介 MP-2烟雾检测气体传感器采用多层厚膜制造工艺&#xff0c;在微型Al2O3陶瓷基片的两面分别制作加热器和金属氧化物半导体气敏层&#xff0c;封装在金属壳体内。当环境空气中有被检测气体存在时传感器电导率发生变化&#xff0c;该气体的浓度越高&…

Arduino提高篇11—烟雾传感器MQ-2

MQ系列传感器是使用非常广泛的低成本传感器&#xff0c;广泛应用于家庭或工厂的气体泄漏监测装置。本篇介绍MQ家族中的MQ-2烟雾传感器的使用&#xff0c;其他MQ传感器使用都是相类似的。 1. MQ系列传感器工作原理 MQ系列传感器使用的敏感材料是活性很高的金属氧化物半导体&am…

CC2530—MQ-2气敏式烟雾传感器

电路图 连接引脚&#xff1a;P07 寄存器设置 1、ADCCFG 模拟io使能&#xff1a;ADCCFG | 0x80; //由于引脚为P07&#xff0c;第7位置为1&#xff08;1000 0000&#xff09; 模拟io禁用&#xff1a;ADCCFG & (0x80^0xFF); //(0x80^0xFF1000 0000 ^ 1111 1…

2022-4-4基于单片机的MQ2烟雾传感器报警系统设计

基于单片机的MQ2烟雾传感器报警系统设计 源代码和仿真图及MQ2相关资料可在文末的链接中下载 该系统实现的功能&#xff1a;检测空气中的烟雾浓度并实现超阈值报警 该系统组成由&#xff1a; 单片机最小系统、ADC0832、MQ2烟雾传感器、LCD1602液晶模块、声光报警模块、按键模…

MP-2烟雾传感器

1.传感器原理&#xff1a; MP-2 烟雾检测气体传感器采用多层厚膜制造工艺&#xff0c;在微型 Al2O3 陶瓷基片的两面分别制作加热器和金属氧化物半导体气敏层&#xff0c;封装 在金属壳体内。当环境空气中有被检测气体存在时传感器电导率发 生变化&#xff0c;该气体的浓度越高…

MQ-2气体传感器特性解析

MQ-2是一种多类型的气体检测传感器&#xff0c;可用于液化气、甲烷、丁烷、丙烷、酒精、氢气、烟雾等气体的检测。 MQ-2传感器内部结构如图&#xff1a; 从内部图看&#xff0c;传感器主要分为两部分&#xff0c;一部分为加热电阻&#xff0c;一部分为感应电阻&#xff1b;加热…

ESP32简单实现MQ-2烟雾浓度传感器(MicroPython+Thonny)

一、MQ-2 简介 MQ-2气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当传感器所处环境中存在可燃气体时&#xff0c;传感器的电导率随空气中可燃气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。 MQ-2气体…

MQ-2烟雾传感器启动

MQ-2气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当传感器所处环境中 存在可燃气体时&#xff0c;传感器的电导率随空气中可燃气体浓度的增加而增大。使用简单的电路即可将电导率的 变化转换为与该气体浓度相对应的输出信号。 MQ-2气体传感器对液化气…

烟雾传感器MQ-2实验

烟雾传感器MQ-2实验 实验现象 烟雾传感器把烟雾浓度值转换为模拟电压值输出&#xff0c;arduino通过A0引脚读取模拟电压值&#xff0c;通过串口发送给PC&#xff0c;当模拟电压值超过模块的比较器设定值&#xff0c;模块D0引脚输出低电平。arduino监控到D0引脚拉底信号时&…

MQ-2烟雾报警器

MQ-2烟雾报警器 原理&#xff1a;MQ-2型烟雾传感器属于二氧化锡半导体气敏材料&#xff0c;属于表面离子式N型半导体。处于200~300摄氏度时&#xff0c;二氧化锡吸附空气中的氧&#xff0c;形成氧的负离子吸附&#xff0c;使半导体中的电子密度减少&#xff0c;从而使其电阻值…

模拟烟雾传感器 (MQ2)

小板上的端口边上有一个大写的A&#xff0c;标明这是一个模拟的传感器。 该款气体传感器是基于气敏元件的MQ2气体传感器&#xff0c;可以很灵敏的检测到空气中的烟雾、液化气、丁烷、丙烷、甲烷、酒精、氢气等气体。 与单片机相结合使用&#xff0c;可以制作火灾烟雾报警、液化…