vue中使用render封裝一個(gè)select組件
使用render封裝一個(gè)select組件
父組件
value - {{ value }} ; value2 - {{ value2 }} <!-- disabled clearable --> <Select v-model="value" :option-data="optionData" placeholder="請(qǐng)選擇" clearable /> <Select v-model="value2" :option-data="optionData" /> value: '', // 默認(rèn)值為空字符串 value2: 'area1', optionData: [ { label: '區(qū)域1', value: 'area1' }, { label: '區(qū)域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( // 標(biāo)簽 'el-select', // 相關(guān)屬性參數(shù) { // html 相關(guān)的屬性 placeholder id 等 attrs: { ...this.$attrs // ( { placeholder:請(qǐng)輸入 } ) }, // props相關(guān)的 props: { value: this.newValue }, // 事件相關(guān) on: { change: this.onChangeHandle } }, this.optionData && this.optionData.map(option => { return createElement( 'el-option', { props: { label: option.label, value: option.value } } ) }) ) } } </script>
效果
vue另類封裝--render函數(shù)封裝
在講解render函數(shù)封裝前,擴(kuò)展一下組件自動(dòng)全局注冊(cè)的方法
先看看文件的結(jié)構(gòu)
接下來就是注冊(cè)代碼(即lib下的index.js代碼)
export default { install(Vue) { // 讀取components文件夾下的文件 // const req = require.context('路徑','是否讀取子文件夾','正則匹配') // req是一個(gè)函數(shù),該函數(shù)有三個(gè)屬性分別是resolve、keys、id // 下面進(jìn)行詳細(xì)說明這三個(gè)屬性 const req = require.context("@/components", false, /\.vue$/); //拿到讀取文件的路徑 //導(dǎo)入處理 req.keys().forEach((item) => { const com = req(item).default; // 全局注冊(cè)組件 Vue.component(com.name, com); }); }, };
接下來我們?cè)贏pp文件直接使用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
:它是一個(gè)函數(shù),接收一個(gè)參數(shù)(這個(gè)參數(shù)是匹配文件的相對(duì)路徑),返回值是匹配文件相對(duì)于項(xiàng)目的路徑keys
:它也是一個(gè)函數(shù),返回的是匹配成功文件的相對(duì)路徑(不包括文件名稱)id
:返回的是一個(gè)字符串,匹配的文件夾的路徑()、匹配規(guī)則等
render函數(shù)封裝
下面封裝以面包屑為例
在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組件進(jìn)行封裝
<script> export default { ? name: "Breadcrumb", ? // 開啟函數(shù)組件模式,它內(nèi)部的東西不是響應(yīng)式,并且沒有生命周期 ? functional: true, ? render: (h, context) => { ? ? //創(chuàng)建數(shù)組接收虛擬節(jié)點(diǎn) ? ? const vnodeArr = []; ? ? context.slots().default.forEach((item, index, arr) => { ? ? ? // 將處箭頭外的虛擬dom存儲(chǔ)起來 ? ? ? vnodeArr.push(item); ? ? ? // 判斷是不是最后一項(xiàng),是最后一項(xiàng)就不要加箭頭 ? ? ? if (arr.length - 1 !== index) { ? ? ? ? // 加上箭頭虛擬節(jié)點(diǎn) ? ? ? ? vnodeArr.push(h("i", { class: "el-icon-arrow-right" })); ? ? ? } ? ? }); ? ? // render作用:它會(huì)return一個(gè)虛擬dom,return什么就渲染相應(yīng)的實(shí)體Dom ? ? // h:創(chuàng)建虛擬DOM,有三個(gè)參數(shù) ? ? 參數(shù)一:標(biāo)簽/組件 ? ?參數(shù)二:虛擬dom配置 ? 參數(shù)三:虛擬dom/子節(jié)點(diǎn) ? ?// h(標(biāo)簽名/組件,{虛擬dom配置},子集:也是虛擬dom節(jié)點(diǎn)信息支持字符串與數(shù)組) ? ?// 進(jìn)行渲染,h第三個(gè)參數(shù)可以為數(shù)組 ? ? return h("span", {}, vnodeArr); ? }, }; </script>
App組件運(yùn)用
<template> ? <div> ? ? <Breadcrumb> ? ? ? <BreadcrumbItem to="/">首頁</BreadcrumbItem> ? ? ? <BreadcrumbItem>活動(dòng)列表</BreadcrumbItem> ? ? ? <BreadcrumbItem>活動(dòng)管理</BreadcrumbItem> ? ? ? <BreadcrumbItem>活動(dòng)詳情</BreadcrumbItem> ? ? </Breadcrumb> ? </div> </template> <script> export default { ? name: "", ? data() { ? ? return { ? ? ? flag: false, ? ? }; ? }, ? computed: {}, ? methods: {}, }; </script> <style lang="less" scoped></style>
效果圖如下
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- vue3通過render函數(shù)實(shí)現(xiàn)菜單下拉框的示例
- vue中的render函數(shù)、h()函數(shù)、函數(shù)式組件詳解
- Vue render函數(shù)使用詳細(xì)講解
- Vue中render函數(shù)調(diào)用時(shí)機(jī)與執(zhí)行細(xì)節(jié)源碼分析
- 簡(jiǎn)單談一談Vue中render函數(shù)
- Vue 2閱讀理解之initRender與callHook組件詳解
- vue語法之render函數(shù)和jsx的基本使用
- vue3中的render函數(shù)里定義插槽和使用插槽
- VUE3中h()函數(shù)和createVNode()函數(shù)的使用解讀
- Vue.js3.2的vnode部分優(yōu)化升級(jí)使用示例詳解
- Vue.js之VNode的使用
- vue中?render?函數(shù)功能與原理分析
相關(guān)文章
VUE2.0+ElementUI2.0表格el-table實(shí)現(xiàn)表頭擴(kuò)展el-tooltip
這篇文章主要介紹了VUE2.0+ElementUI2.0表格el-table實(shí)現(xiàn)表頭擴(kuò)展el-tooltip,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11Vue3 響應(yīng)式 API 及 reactive 和 ref&
響應(yīng)式是一種允許以聲明式的方式去適應(yīng)變化的編程范例,這篇文章主要介紹了關(guān)于Vue3響應(yīng)式API及reactive和ref的用法,需要的朋友可以參考下2023-06-06vue + typescript + 極驗(yàn)登錄驗(yàn)證的實(shí)現(xiàn)方法
這篇文章主要介紹了vue + typescript + 極驗(yàn) 登錄驗(yàn)證的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06element-ui tooltip修改背景顏色和箭頭顏色的實(shí)現(xiàn)
這篇文章主要介紹了element-ui tooltip修改背景顏色和箭頭顏色的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12vue.set向?qū)ο罄镌黾佣鄬訑?shù)組屬性不生效問題及解決
這篇文章主要介紹了vue.set向?qū)ο罄镌黾佣鄬訑?shù)組屬性不生效問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04vue.js todolist實(shí)現(xiàn)代碼
這篇文章主要介紹了vue.js todolist實(shí)現(xiàn)代碼,需要的朋友可以參考下2017-10-10Vue+Element-ui表單resetFields無法重置問題
本文主要介紹了Vue+Element-ui表單resetFields無法重置問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04