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

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

1.jpeg

@[toc]

25.面包屑处理关键字

25.1面包屑处理关键字

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

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

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

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

image.png

修改代码,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组件自定义方法为啥要写成而不是

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

image.png

注意点3:

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

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

image.png

注意点4:

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

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

自定义事件语法长这样:

image.png

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

image.png

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

image.png

解决方案:

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

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

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

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

image.png

如图1

image.png

如图2

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

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

本人其他相关文章链接

1.vue尚品汇商城项目-day04【24.点击搜索按钮跳转后的页面商品列表、平台售卖属性动态展示(开发Search组件)】
2.vue尚品汇商城项目-day04【25.面包屑处理关键字】
3.vue尚品汇商城项目-day04【26.排序操作(难点)】
4.vue尚品汇商城项目-day04【27.分页器静态组件(难点)】
5.vue尚品汇商城项目-day04【28.详情页面Detail】
6.vue尚品汇商城项目-day04【29.加入购物车操作(难点)】

目录
相关文章
|
21天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
17天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2563 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
15天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
13天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
17天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1556 16
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
19天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
826 14
|
14天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
621 7
|
7天前
|
Docker 容器
Docker操作 (五)
Docker操作 (五)
170 69
|
7天前
|
Docker 容器
Docker操作 (三)
Docker操作 (三)
167 69
|
19天前
|
人工智能 自动驾驶 机器人
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
过去22个月,AI发展速度超过任何历史时期,但我们依然还处于AGI变革的早期。生成式AI最大的想象力,绝不是在手机屏幕上做一两个新的超级app,而是接管数字世界,改变物理世界。
629 52
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界