面包屑组件

125 阅读1分钟
  1. 思路 使用render函数自己进行拼接创建。 createElement render render选项与h函数 指定组件显示的内容:new Vue({选项}) el 选项,通过一个选择器找到容器,容器内容就是组件内容 template 选项,
    组件内容
    作为组件内容 render选项,它是一个函数,函数回默认传人createElement的函数(h),这个函数用来创建结构,再render函数返回渲染为组件内容。它的优先级更高。
  2. 代码演示 修改BreadCurmbsItem组件内的代码
<template>
  <div class="bread-crumbs-item">
    <RouterLink v-if="to" :to="to"><slot /></RouterLink>
    <span v-else><slot /></span>
  </div>
</template>
<script>
export default {
  name: 'BreadCurmbsItem',
  props: {
    to: {
      type: [String, Object]
    }
  }
}
</script>

修改BreadCrumbs.vue中的代码

代码示例(如下):

<script>
import { h } from 'vue'
export default {
  name: 'BreadCrumbs',
  render () {
    // 用法
    // 1. template 标签去除,单文件组件
    // 2. 返回值就是组件内容
    // 3. vue2.0 的h函数传参进来的,vue3.0 的h函数导入进来
    // 4. h 第一个参数 标签名字  第二个参数 标签属性对象  第三个参数 子节点
    // 需求
    // 1. 创建bread-crumbs父容器
    // 2. 获取默认插槽内容
    // 3. 去除bread-crumbs-item组件的i标签,因该由render函数来组织
    // 4. 遍历插槽中的item,得到一个动态创建的节点,最后一个item不加i标签
    // 5. 把动态创建的节点渲染再bread-crumbs标签中
    const items = this.$slots.default()
    const dymanicItems = []
    items.forEach((item, i) => {
      dymanicItems.push(item)
      if (i < (items.length - 1)) {
        dymanicItems.push(h('i', { class: 'iconfont icon-angle-right' }))
      }
    })
    return h('div', { class: 'bread-crumbs' }, dymanicItems)
  }
}
</script>

<style lang='less'>
// 将scope属性去除,目的是为了样式穿透至item组件中
.bread-crumbs {
  display: flex;
  padding: 25px 10px;
   &-item {
    a {
      text-decoration: none;
      color: #666;
      transition: all .4s;
      &:hover {
        color: #27ba9b;
      }
    }
  }
  i {
    font-size: 12px;
    margin-left: 5px;
    margin-right: 5px;
    line-height: 22px;
    // 样式的方式,不合理
    // &:last-child {
    //   display: none;
    // }
  }
}
</style>
  1. 使用 这个方式封装后,让全局组件的复用性更强了,强烈推荐使用
<template>
  <div class="home-banner">
    <!-- 面包屑 -->
    <BreadCrumbs>
        <BreadCrumbsItem to="/">首页</BreadCrumbsItem>
        <BreadCrumbsItem to="/xxx">电器</BreadCrumbsItem>
        <BreadCrumbsItem to="/xxx/xx">空调</BreadCrumbsItem>
        <BreadCrumbsItem >遥控器</BreadCrumbsItem>
    </BreadCrumbs>
  </div>
</template>

<script>

export default {
  name: 'App',
  setup() {
  }
}
</script>