vue中使用render封装一个select组件

 更新时间:2022年09月02日 10:17:40   作者:不求人0  
这篇文章主要介绍了vue中使用render封装一个select组件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

使用render封装一个select组件

父组件

    value - {{ value }} ; value2 - {{ value2 }}
    <!--  disabled clearable   -->
    <Select v-model="value" :option-data="optionData" placeholder="请选择" clearable />
    <Select v-model="value2" :option-data="optionData" />
      value: '', // 默认值为空字符串
      value2: 'area1',
      optionData: [
        { label: '区域1', value: 'area1' },
        { label: '区域2', value: 'area2' }
      ],

Select.vue

<script>
export default {
  name: 'Select',
  props: {
    value: {
      default: '',
      type: [String, Number]
    },
    optionData: {
      default: () => {
        return []
      },
      type: Array
    }
  },
  computed: {
    newValue: {
      get({ value }) {
        return value
      },
      set(val) {
        this.$emit('input', val)
      }
    }
  },
  methods: {
    onChangeHandle(val) {
      this.newValue = val
    }
  },
  render(createElement) {
    return createElement(
      // 标签
      'el-select',
      // 相关属性参数
      {
        // html 相关的属性 placeholder id 等
        attrs: {
          ...this.$attrs //  ( { placeholder:请输入 } )
        },
        // props相关的
        props: {
          value: this.newValue
        },
        // 事件相关
        on: {
          change: this.onChangeHandle
        }
      },
      this.optionData && this.optionData.map(option => {
        return createElement(
          'el-option',
          {
            props: {
              label: option.label,
              value: option.value
            }
          }
        )
      })
    )
  }
}
</script>

效果

在这里插入图片描述

vue另类封装--render函数封装

在讲解render函数封装前,扩展一下组件自动全局注册的方法

先看看文件的结构

接下来就是注册代码(即lib下的index.js代码)

export default {
  install(Vue) {
    // 读取components文件夹下的文件
    // const req = require.context('路径','是否读取子文件夹','正则匹配')
    // req是一个函数,该函数有三个属性分别是resolve、keys、id
    // 下面进行详细说明这三个属性
    const req = require.context("@/components", false, /\.vue$/);
    //拿到读取文件的路径
    //导入处理
    req.keys().forEach((item) => {
      const com = req(item).default;
      // 全局注册组件
      Vue.component(com.name, com);
    });
  },
};

接下来我们在App文件直接使用components下的组件

<template>
  <div>
    <myA></myA>
    <myB></myB>
  </div>
</template>
<script>
export default {
  name: "",
  data() {
    return {
      flag: false,
    };
  },
  computed: {},
  methods: {},
};
</script>
<style lang="less" scoped></style>

  • resolve:它是一个函数,接收一个参数(这个参数是匹配文件的相对路径),返回值是匹配文件相对于项目的路径
  • keys:它也是一个函数,返回的是匹配成功文件的相对路径(不包括文件名称)
  • id:返回的是一个字符串,匹配的文件夹的路径()、匹配规则等

render函数封装

下面封装以面包屑为例

在a.vue下定义组件

<template>
  <span>
    <router-link v-if="to" :to="to">
      <slot />
    </router-link>
    <span v-else>
      <slot />
    </span>
  </span>
</template>
<script>
export default {
  name: "BreadcrumbItem",
  props: {
    to: {
      type: [Object, String],
      default: "",
    },
  },
};
</script>

在b组件进行封装

<script>
export default {
  name: "Breadcrumb",
  // 开启函数组件模式,它内部的东西不是响应式,并且没有生命周期
  functional: true,
  render: (h, context) => {
    //创建数组接收虚拟节点
    const vnodeArr = [];
    context.slots().default.forEach((item, index, arr) => {
      // 将处箭头外的虚拟dom存储起来
      vnodeArr.push(item);
      // 判断是不是最后一项,是最后一项就不要加箭头
      if (arr.length - 1 !== index) {
        // 加上箭头虚拟节点
        vnodeArr.push(h("i", { class: "el-icon-arrow-right" }));
      }
    });
    // render作用:它会return一个虚拟dom,return什么就渲染相应的实体Dom
    // h:创建虚拟DOM,有三个参数     参数一:标签/组件    参数二:虚拟dom配置   参数三:虚拟dom/子节点
   // h(标签名/组件,{虚拟dom配置},子集:也是虚拟dom节点信息支持字符串与数组)
   // 进行渲染,h第三个参数可以为数组
    return h("span", {}, vnodeArr);
  },
};
</script>

App组件运用

<template>
  <div>
    <Breadcrumb>
      <BreadcrumbItem to="/">首页</BreadcrumbItem>
      <BreadcrumbItem>活动列表</BreadcrumbItem>
      <BreadcrumbItem>活动管理</BreadcrumbItem>
      <BreadcrumbItem>活动详情</BreadcrumbItem>
    </Breadcrumb>
  </div>
</template>
<script>
export default {
  name: "",
  data() {
    return {
      flag: false,
    };
  },
  computed: {},
  methods: {},
};
</script>
<style lang="less" scoped></style>

效果图如下 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue canvas绘制矩形并解决由clearRec带来的闪屏问题

    vue canvas绘制矩形并解决由clearRec带来的闪屏问题

    这篇文章主要介绍了vue canvas绘制矩形并解决由clearRec带来的闪屏问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • vue+elementUI中使用Echarts之饼图问题

    vue+elementUI中使用Echarts之饼图问题

    这篇文章主要介绍了vue+elementUI中使用Echarts之饼图问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • 详解Vue的监听属性

    详解Vue的监听属性

    这篇文章主要为大家介绍了Vue的监听属性,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • vue项目是如何运行起来的

    vue项目是如何运行起来的

    这篇文章主要介绍了vue项目是如何运行起来的,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • 详解Vue.js v-for不支持IE9的解决方法

    详解Vue.js v-for不支持IE9的解决方法

    这篇文章主要介绍了详解Vue.js v-for不支持IE9的解决方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • vue中计算属性computed和普通属性method的区别小结

    vue中计算属性computed和普通属性method的区别小结

    Vue.js中Computed和Methods是两种常用的数据处理方式,本文主要介绍了vue中计算属性computed和普通属性method的区别小结,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • vue-element-admin+flask实现数据查询项目的实例代码

    vue-element-admin+flask实现数据查询项目的实例代码

    这篇文章主要介绍了vue-element-admin+flask实现数据查询项目,填写数据库连接信息和查询语句,即可展示查询到的数据,需要的朋友可以参考下
    2022-11-11
  • Vue获取页面元素的相对位置的方法示例

    Vue获取页面元素的相对位置的方法示例

    这篇文章主要介绍了Vue获取页面元素的相对位置的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • vue子页面控制父页面刷新问题

    vue子页面控制父页面刷新问题

    这篇文章主要介绍了vue子页面控制父页面刷新问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • antd中table展开行默认展示,且不需要前边的加号操作

    antd中table展开行默认展示,且不需要前边的加号操作

    这篇文章主要介绍了antd中table展开行默认展示,且不需要前边的加号操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11

最新评论