vue3 - 仿 element-ui Breadcrumb 面包屑组件封装自己的面包屑组件
仿 element-ui Breadcrumb 面包屑组件封装自己的面包屑组件element-ui 面包屑结构<el-breadcrumb separator="/"><el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item><el-breadcrumb-item><a hre
·
仿 element-ui Breadcrumb 面包屑组件封装自己的面包屑组件
element-ui 面包屑结构
<el-breadcrumb separator="/">
<el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
<el-breadcrumb-item><a href="/">活动管理</a></el-breadcrumb-item>
<el-breadcrumb-item>活动列表</el-breadcrumb-item>
<el-breadcrumb-item>活动详情</el-breadcrumb-item>
</el-breadcrumb>
#自封装面包屑组件
先封装基础组件 my-bread-item.vue
<template>
<div class="my-bread-item">
// 有跳转的时候用 router-link 标签包裹,没有跳转就是用 span 标签包裹
<RouterLink v-if="to" :to="to"><slot /></RouterLink>
<span v-else><slot /></span>
</div>
</template>
<script>
export default {
name: 'MyBreadItem',
props: {
to: {
type: [String, Object]
}
}
}
</script>
封装父容器组件 my-bread.vue
<script>
import { h } from 'vue'
export default {
name: 'MyBread',
render() {
// render render选项,它是一个函数,函数回默认传人createElement的函数(h),这个函数用来创建结构
// 再render函数返回渲染为组件内容。它的优先级更高
// vue2.0 的h函数传参进来的,vue3.0 的h函数导入进来
// 1. 创建my-bread父容器
// 2. 获取默认插槽内容
// 3. 去除my-bread-item组件的i标签,因该由render函数来组织
// 4. 遍历插槽中的item,得到一个动态创建的节点,最后一个item不加i标签
// 5. 把动态创建的节点渲染再my-bread标签中
const items = this.$slots.default().filter(item => item.type.name === 'MyBrandItem')
const context = []
items.forEach((item, i) => {
context.push(item)
if (i < items.length - 1) {
context.push(h('i', { class: 'iconfont icon-angle-right' }, null))
}
})
return h('div', { class: 'My-bread' }, context)
}
}
</script>
<style scoped lang="less">
.My-bread {
display: flex;
padding: 25px 10px;
:deep(&-item) {
a {
color: #666;
transition: all 0.4s;
&:hover {
color: @MyColor;
}
}
}
:deep(i) {
font-size: 12px;
margin-left: 5px;
margin-right: 5px;
line-height: 22px;
}
}
</style>
封装父容器组件 my-bread.vue
JSX 优化
<script>
export default {
name: 'MyBread',
render() {
const items = this.$slots.default().filter(item => item.type.name === 'MyBrandItem')
const context = []
items.forEach((item, i) => {
context.push(item)
if (i < items.length - 1) {
context.push(<i className='iconfont icon-angle-right'></i>)
}
})
return <div className='my-bread'>{context}</div>
}
}
</script>
<style scoped lang="less">
.My-bread {
display: flex;
padding: 25px 10px;
:deep(&-item) {
a {
color: #666;
transition: all 0.4s;
&:hover {
color: @MyColor;
}
}
}
:deep(i) {
font-size: 12px;
margin-left: 5px;
margin-right: 5px;
line-height: 22px;
}
}
</style>
使用组件
<MyBread>
<MyBreadItem to="/">主页</MyBreadItem>
<MyBreadItem>二级</MyBreadItem>
<MyBreadItem>三级</MyBreadItem>
</MyBread>
更多推荐
所有评论(0)