vue尚品汇商城项目-day04【25.面包屑处理关键字】

2023/9/30 18:01:02

在这里插入图片描述

文章目录

    • 25.面包屑处理关键字
      • 25.1面包屑处理关键字
      • 25.2面包屑处理品牌信息
      • 25.3平台售卖属性的操作

25.面包屑处理关键字

25.1面包屑处理关键字

(1)动态开发面包屑中的分类名

  • 变成式导航路由跳转【自己跳自己】

(2)动态开发面包屑中的关键字

  • 当面包屑中的关键字清除以后, 需要让兄弟组件Header组件中的关键字清除
  • 设计组间通信
    • props:父子
    • 自定义事件:子父
    • vuex:完成
    • 插槽:父子
    • pubsub-js:万能
    • 全局事件总线 b u s 、 bus、 buson

在这里插入图片描述

修改代码,src/pages/Search/index.vue

<ul class="fl sui-tag">
	<!-- 分类的面包屑 -->
	<li class="with-x" v-if="searchParams.categoryName" @click="removeCategoryName">{{searchParams.categoryName}}</li>
	<!-- 关键字的面包屑 -->
	<li class="with-x" v-if="searchParams.keyword" @click="removeKeyword">{{searchParams.keyword}}</li>
</ul>

//删除分类的名字
removeCategoryName() {
        //把带给服务器的参数置空了,还需要向服务器发请求
        //带给服务器参数说明可有可无的:如果属性值为空的字符串还是会把相应的字段带给服务器
        //但是你把相应的字段变为undefined,当前这个字段不会带给服务器
        this.searchParams.categoryName = undefined;
        this.searchParams.category1Id = undefined;
        this.searchParams.category2Id = undefined;
        this.searchParams.category3Id = undefined;
        this.getData();
        /**
         * 地址栏也需要需改:进行路由跳转(现在的路由跳转只是跳转到自己这里)
         * 严谨:本意是删除query,如果路径当中出现params不应该删除,路由跳转的时候应该带着
         * this.$route.params有值就跳转/search并传参params,否则就只跳转/search
         */
        if (this.$route.params) {
          this.$router.push({name: "search", params:this.$route.params})
        }
},
//删除搜索框关键字的名字
removeKeyword() {
        //给服务器带的参数searchParams的keyword置空
        this.searchParams.keyword = undefined;
        this.getData();
        //通知兄弟组件Header清除搜索框里的关键字
        this.$bus.$emit("clearHeaderComponentKeyword");
        //进行路由的跳转
        if (this.$route.query) {
          this.$router.push({name: "search", query:this.$route.query})
        }
}

src/main.js

beforeCreate() {
    Vue.prototype.$bus = this
},

src/components/Header/index.vue

mounted() {
    //通过全局事件总线清除关键字
    this.$bus.$on("clearHeaderComponentKeyword", ()=>{
      this.keyword = "";
    })
}

注意点1:

问题:面包屑是根据什么产生的?

答案:根据searchParams.categoryName字段值(也就是搜索分类的名字)。

注意点2:面包屑出了v-for循环遍历产生的外,每一个都得能够点击删除,删除的话就得清空searchParams.categoryName值,比如this.searchParams.categoryName = ‘’,这样写没毛病,但是接口文档中说该字段可不传,所以推荐使用this.searchParams.categoryName = undefined;推荐传值undefined,这样的好处是当前这个字段不会带给服务器。

注意点3:

问题:点击“面包屑”会跳转路由,如何组件内跳转路由呢?

答案:组件内使用this.$router.push(),可以实现自己跳转自己

注意点4:除了要清空categoryName、category1Id、category2Id、category3Id的值外,还要注意关键字搜索params的值,比如进入Search组件内点击三级菜单后在搜索框关键字进行搜索,但是当点击面包屑的删除时params参数不能清空,且必须保留,所以才会出现如下代码:

if (this.$route.params) {
    this.$router.push({name: "search", params:this.$route.params})
}

注意点5:

问题:注意点4中的写法啥意思?

答案:判断this.$route.params有值就跳转/search并传参params,否则就只跳转/search。哪怕this.$route.params没值了会是个空对象{},但是if里面的跳转语句还是会进入的,即哪怕this.$route.params={},也会执行this.$router.push({name: “search”, params:this.$route.params}),只不过params:this参数是个空对象而已。

注意点6:点击“删除搜索框关键字的名字”的方法要清除3个地方:第一个li隐藏掉,第二个给服务器带的参数searchParams的keyword置空,第三个通知兄弟组件Header清除搜索框里的关键字。

25.2面包屑处理品牌信息

代码修改:

src/pages/Search/index.vue

<!-- 品牌的面包屑 -->
            <li class="with-x" v-if="searchParams.trademark" @click="removeTrademark">{{searchParams.trademark.split(":")[1]}}</li>
<SearchSelector @clickTrademarkHandler="clickTrademarkHandler"/>

 //删除品牌的信息
      removeTrademark() {
        this.searchParams.trademark = undefined;
        this.getData();
      },
      
//自定义事件回调
      clickTrademarkHandler(brands) {
        console.log("接收到自定义事件传过来的品牌参数!")
        //1:整理品牌字段的参数  "ID:品牌名称"
        this.searchParams.trademark = `${brands.tmId}:${brands.tmName}`
        //再次发请求获取search模块列表数据进行展示
        this.getData();
      }    
      
 beforeDestroy() {
      this.$off("clickTrademarkHandler");
    }     

src/pages/Search/SearchSelector/SearchSelector.vue

<li v-for="brands in trademarkList" :key="brands.tmId" @click="clickTrademarkInfo(brands)">{{brands.tmName}}</li>

methods: {
      //品牌的事件处理函数
      clickTrademarkInfo(brands) {
        //点击了品牌(苹果),还是需要整理参数,向服务器发请求获取相应的数据进行展示
        //老师问题:在哪个组件中发请求,父组件?
        //为什么那,因为父组件中searchParams参数是带给服务器参数,子组件组件把你点击的品牌的信息,需要给父组件传递过去---自定义事件
        this.$emit("clickTrademarkHandler", brands)
      }
    }     

注意点:1

问题:假设点击了品牌(苹果),在哪个组件中发请求,父组件?还是子组件?

答案:在父组件中,因为父组件中searchParams参数是带给服务器参数,子组件组件把你点击的品牌的信息,需要给父组件传递过去—自定义事件

注意点2:

问题:Search组件自定义方法为啥要写成<SearchSelector @clickTrademarkHandler=“clickTrademarkHandler”/>而不是<SearchSelector @clickTrademarkHandler=“clickTrademarkHandler(brands)”?/>

答案:自定义函数这里不用写形参brands,如果写上会报错如图,实际这里不用写函数参数名称,在methods定义函数clickTrademarkHandler的时候写brands进行接收就可以的

在这里插入图片描述

注意点3:

问题:为啥自定义事件回调函数clickTrademarkHandler()最后不用判断this.$route.params和this.$route.query进行路由自己跳转自己?而删除分类的名字函数removeCategoryName()和删除搜索框关键字的名字函数removeKeyword()中却要判断this.$route.params和this.$route.query?

答案:因为自定义事件回调函数clickTrademarkHandler()不涉及到query路径url展示的参数改变或者params的展示参数keyword改变,所以不用加判断,就是如图,无论怎么点击品牌信息,都不会让图中红框内展示的参数改变。

在这里插入图片描述

注意点4:

问题:为啥品牌的事件处理函数clickTrademarkInfo()使用的是this.$emit,而不是this.$bus.$emit?而且如果使用this.$bus.$emit会发现不生效?

答案:该处使用了“自定义事件”,而不是“全局事件总线”,这两语法自己弄混了。

自定义事件语法长这样:

在这里插入图片描述

全局事件总线语法长这样:

在这里插入图片描述

注意点5:Search组件中自定义事件回调clickTrademarkHandler()内写成this.searchParams.trademark = \${brands.tmId}:\${brands.tmName},用的是模板字符串的解析写法。

注意点6:

问题:Search组件中品牌的面包屑写法是{{searchParams.trademark.split(“:”)[1]}}?

答案:因为传递过来的品牌参数长这样 “1:苹果”,这样展示面包屑不优雅,所以需要截取字符串,只展示后面的名称即可。

25.3平台售卖属性的操作

修改代码:

src/pages/Search/SearchSelector/SearchSelector.vue

<li v-for="(attrValue, index) in attr.attrValueList" :key="index" @click="clickAttrInfo(attr, attrValue)">

//平台售卖属性值的点击事件
clickAttrInfo(attr, attrValue) {
        //["属性ID:属性值:属性名"]
        let props = `${attr.attrId}:${attrValue}:${attr.attrName}`;
        this.$emit("clickAttrInfo", props)
      }

src/pages/Search/index.vue

<!-- 平台售卖属性的面包屑 -->
<li class="with-x" v-for="(attr, index) in searchParams.props" :key="index" @click="removeAttrInfo(index)">{{attr.split(":")[1]}}</li>

<SearchSelector @clickAttrInfo="clickAttrInfo"/>

//收集平台属性地方回调函数(自定义事件)
clickAttrInfo(props) {
        console.log("接收到自定义事件传过来的平台售卖属性参数!");
        //数组去重
        if (this.searchParams.props.indexOf(props) == -1) this.searchParams.props.push(props)
        //再次发请求
        this.getData();
      },
//removeAttr删除售卖的属性
removeAttrInfo(index) {
        //再次整理参数
        this.searchParams.props.splice(index, 1);
        //再次发请求
        this.getData();
      }
      
beforeDestroy() {
      this.$off("clickAttrInfo");
}      

注意点1:“品牌”面包屑可以只有一个,但是“平台售卖属性”面包屑却是可以多个的,所以不能用v-if,而是要用v-for了。

注意点2:点击“平台售卖属性”面包屑数组需要去重处理,否则就会出现如图错误现象

在这里插入图片描述

解决方案:

//数组去重
if (this.searchParams.props.indexOf(props) == -1) this.searchParams.props.push(props)

注意点3:点击清除按钮你得找到内容对应的数组索引值,否则无法匹配删除

this.searchParams.props.splice(index, 1);

注意点4:平台售卖属性的面包屑展示也要对attar进行分割展示,原attr长如图1,实际分割截取后展示如图2

在这里插入图片描述

如图1

在这里插入图片描述

如图2

注意点5:请求参数最终要的传递过来的属性格式是:[“属性ID:属性值:属性名”],所以我们需要拼接传递参数

let props = `${attr.attrId}:${attrValue}:${attr.attrName}`;

http://www.jnnr.cn/a/369103.html

相关文章

(Cont.) OpenPose OpenCV Caffe QT

Cont. conda deactivate Remember to deactivate conda before compiling conda deactivatecaffe colas.h Path: openpose/3rdparty/caffe/include/cblas.h Case 1: 如果没有 寻找一下 &#xff08;大概率在python directory有&#xff09;复制过来即可 exactly寻找命令&am…

C语言 —— 数组

一维数组与二维数组前言一、 一维数组1.1 一维数组定义和使用1.2 例子 &#xff1a;列出0-9的数字1.3 一维数组的初始化1.4 数组名二、二维数组2.1 二维数组的定义2.2 例题&#xff1a;一个学习小组有 5 个人&#xff0c;每个人有 3 门课程的考试成绩&#xff0c;求该小组各科的…

javaScript蓝桥杯----偷梁换柱

目录一、介绍二、目标三、代码四、知识点1. Object.defineProperty五、答案一、介绍 随着医疗水平的进步&#xff0c;人的平均寿命在慢慢提升。现在全球平均预期寿命是 73.2 岁&#xff0c;而在 1950 年则只有 47 岁。那么人类的寿命有极限吗&#xff1f;根据最新的研究&#…

用户体验设计中的颜色

&#x1f525;1 颜色模型是一种抽象的用于描述颜色被定义和呈现方式的数学模型。RGB模型&#xff08;加色模式&#xff09;最多用于显示器上&#xff0c;因为它是发光的颜色。CMYK模型&#xff08;减色模式&#xff09;适用于印刷体&#xff0c;不会发光而是反光的模式&#x1…

全网最详细的nodejs卸载和安装教程

因为项目需求&#xff0c;重装了3个版本的node.js&#xff0c;记录下完整过程&#xff0c;少走弯路少查资料。 一、卸载 1、Win菜单中找到Node.js的卸载程序&#xff0c;运行卸载程序。 2、点击是。 3、等待卸载完成。 4、删除C:\Users\用户名\AppData\Roaming目录下的npm和…

Linux使用:环境变量指南和CPU和GPU利用情况查看

Linux使用&#xff1a;环境变量指南和CPU和GPU利用情况查看Linux环境变量初始化与对应文件的生效顺序Linux的变量种类设置环境变量直接运行export命令定义变量修改系统环境变量修改用户环境变量修改环境变量配置文件环境配置文件的区别profile、 bashrc、.bash_profile、 .bash…

苦中作乐---竞赛刷题(15分-20分题库)

&#xff08;一&#xff09;概述 &#xff08;Ⅰ&#xff09;彩票是幸运的 &#xff08;Ⅱ&#xff09;AI 英文问答程序 &#xff08; Ⅲ &#xff09; 胎压检测 &#xff08;二&#xff09;题目 Ⅰ 彩票的号码有 6 位数字&#xff0c;若一张彩票的前 3 位上的数之和等于后 3 …

连接 AI,NebulaGraph Python ORM 项目 Carina 简化 Web 开发

作者&#xff1a;Steam & Hao 本文整理自社区第 7 期会议中 13‘21″ 到 44’11″ 的 Python ORM 的分享&#xff0c;视频见 https://www.bilibili.com/video/BV1s8411N7Cw 在做业务开发时&#xff0c;NebulaGraph Python ORM 项目作者&#xff1a;Sword Elucidator&#x…

服务经常宕机的检查步骤以及排查问题、解决方法(持续更新)

一、检查步骤&#xff1a; 1. 首先查看数据库连接池有没有爆满 show max_connections; --查看连接池的大小 select count(1) from pg_stat_activity; --查看连接池已用数--查看剩余可用数 select max_conn-now_conn as resi_conn from (select setting::int8 as max_conn,(…

反向代理配置

目录 反向代理配置&#xff1a; 使用场景&#xff1a; 1、proxy_pass 作用&#xff1a;填的要代理的源站的IP地址或者域名。 格式&#xff1a; 几种location情况下的proxy_pass&#xff1a; 最正规写法&#xff1a; 关于代理的日志记录 2、proxy_set_header 作用&am…

c++多线程 1

https://www.runoob.com/cplusplus/cpp-multithreading.html 两种类型的多任务处理&#xff1a;基于进程和基于线程。 基于进程的多任务处理是程序的并发执行。 基于线程的多任务处理是同一程序的片段的并发执行。 线程 c11以后有了 标准库 1 函数 2 类成员函数 3 lambda函…

LeetCode-72. 编辑距离

目录动态规划题目来源 72. 编辑距离 动态规划 1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j] 表示以下标i-1为结尾的字符串word1&#xff0c;和以下标j-1为结尾的字符串word2&#xff0c;最近编辑距离为dp[i][j]。 2.确定递推公式 在确定递推公式…

BC12 字符圣诞树

BC12 字符圣诞树 我们先观察一下这个图&#xff0c;拆分来看&#xff0c;就是下面这张图 这么看来就是每行都有9个元素&#xff0c;字符或空格&#xff0c;只是他俩每行的所占比不同&#xff0c; 我们观察一下规律&#xff0c;发现 &#xff08;我们只用观察最后一个字符前面的…

Power BI----DAX 再复习(DAX基础、基础函数)

DAX基础一、数据模型模型关系二、基础函数1.时间日期函数2.关系函数3. 转换函数4.文本函数5.聚合函数6.逻辑函数7.三角函数和数学函数8.信息函数DAX 全称 Data Analysis eXpressions&#xff0c;是面向 Microsoft Power BI、Microsoft SQL Server Analysis Services (SSAS)和 M…

centos7 systemd 开机自启动脚本配置方法 redis开机自启动

centos7 systemd 开机自启动脚本配置方法1、步骤如下1.1、安装依赖包1.2、编译安装redis1.3、复制redis解压后utils目录下的service文件1.3.1、修改service文件注意1.3.2、可参考的service文件1.3.3、修改配置文件注意设置1.3.4、可参考的配置文件1.4、重启服务器测试redis自启…

Java对象和类

Java 对象和类 Java作为一种面向对象语言。支持以下基本概念&#xff1a; 多态 继承 封装 抽象 类 对象 实例 方法 重载 本节我们重点研究对象和类的概念。 对象&#xff1a;对象是类的一个实例&#xff08;对象不是找个女朋友&#xff09;&#xff0c;有状态和行为。例如&am…

认识Maven及Maven下载和管理依赖

目录 什么是Maven&#xff1f; 如何下载Maven&#xff1f; 通过Maven管理依赖 什么是Maven&#xff1f; maven是Java中知名的一个远程管理工具/构建工具&#xff0c;它的核心功能是&#xff1a;管理依赖&#xff1b;构建/编译&#xff1b;打包等等。 如何下载Maven&#x…

ES实战 | 黑马旅游案例

关键词搜索 需求&#xff1a;根据文字搜索&#xff0c;也可以选择标签搜索 思路&#xff1a;用bool查询&#xff0c;先根据关键词查询全部&#xff0c;再根据标签过滤。 public class HotelService extends ServiceImpl<HotelMapper, Hotel> implements IHotelService …

python Django 运用(2.简单运用)

1.用pycharm创建新项目(用pycharm建立它会帮你建立django相配的文件如:template文件夹): (前提纪要:环境变量设置好--path:python安装位置\Python\Lib\site-packages\django;)创建Django文件后: 2.建立后启动django项目:在pycharm终端输入---python manage.py runserver IP(自己…

Kettle基于字段去除重复记录操作过程

场景描述场景描述&#xff1a;比较庞大的数据中&#xff0c;想要根据一个或者多个字段判别是否位重复 数据的去重复操作。本案例以mysql为案例描述 创造一个id带有重复的数据测试 输入1.数据源输入 菜单中的【输入】【表输入】设定自己的数据源方案排序2.根据去重字段排序【转…
最新文章