vue3 render函数,手搓面包屑

前段时间需要一个面包屑的组件,想着手动封装一下

大致思路就是使用到了solt,封装为类似于elment那种面包屑的组件,但是需要比较灵活的
首先是需要有两个组件来完成,一个bread和bread-item

bread组件

<template>
  <div class='bread'>
    <slot />   //这里插槽插入bread-item内容
  </div>
</template>

<script>
export default {
  name: 'Bread'
}
</script>
<!-- 去掉scoped全局作用 -->
<style lang='less'>

bread-item组件

<template>
  <div class="bread-item">
    <RouterLink v-if="to" :to="to"><slot /></RouterLink>//判断有没有传入跳转链接
    <span v-else><slot /></span>
    <i class="iconfont icon-angle-right"></i>
  </div>
</template>
<script>
export default {
  name: 'BreadItem',
  props: {
    to: {
      type: [String, Object]
    }
  }
}
</script>

这样封装号以后注册组件就可以直接使用了

  <Bread>
        <BreadItem to="/">首页</BreadItem>
        <BreadItem to="/category/1005000">电器</BreadItem>
        <BreadItem >空调</BreadItem>
    </Bread>
    //传入to跳转连接进行跳转,不传入的话只做展示

 出来的效果时这样的,但是我需要的时最后一个没有箭头的,可以使用css进行隐藏,但是感觉效果不是特别好,而且elment里也不是这样做的,就想到了直接使用render函数,虚拟dom进行实现

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

这样的是直接用的函数判断,进行的元素添加,就不用单选最后一个箭头的问题了

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue 3中的render函数是用来创建组件的虚拟DOM树,并将其渲染到实际的DOM上。它可以用于编写更灵活和高效的组件。 在Vue 3中,render函数采用了一种新的语法,称为JSX语法。下面是一个简单的示例,展示如何使用render函数: ```javascript import { createApp, h } from 'vue' const app = createApp({ render() { return h('div', 'Hello, Vue 3!') } }) app.mount('#app') ``` 在上面的示例中,我们首先导入了`createApp`和`h`函数。`createApp`用于创建Vue应用实例,而`h`函数是用来创建虚拟DOM节点。 在`render`函数中,我们使用`h`函数创建了一个`div`节点,并设置其内容为"Hello, Vue 3!"。最后,我们使用`app.mount('#app')`将应用挂载到id为`app`的DOM元素上。 你也可以在render函数中创建更复杂的虚拟DOM结构,例如嵌套的子节点、绑定事件等。以下是一个稍复杂的示例: ```javascript import { createApp, h } from 'vue' const app = createApp({ render() { return h('div', [ h('h1', 'Hello, Vue 3!'), h('button', { onClick: this.handleClick }, 'Click me') ]) }, methods: { handleClick() { console.log('Button clicked!') } } }) app.mount('#app') ``` 在上面的示例中,我们创建了一个包含`h1`标题和一个按钮的`div`节点。按钮上绑定了`onClick`事件,点击按钮时会触发`handleClick`方法。 这就是使用Vue 3中的render函数创建组件的基本用法。希望对你有所帮助!如果你还有其他问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值