今前端編程中,利用語義化的 HTML 結合 CSS 來完一個組件并不是一件難事,這也意味著無論在 React、Vue 中都可以插入,不過它倆不是今天的主角,接下來我將用一個例子來介紹如何封裝一個完整的原生 HTML 的 Web Components 組件,讓我們開始吧!
首先我們來了解下 HTML 中的 <details> 元素,它可以用于創建一個小部件,其中包含僅在小部件處于“打開”狀態時才可見的附加信息,<details>元素內可以包含的內容沒有任何限制。
默認情況下,元素創建的小部件<details>處于“關閉”狀態(open標簽可使其打開)。通過單擊小部件在“打開”和“關閉”狀態之間切換,以顯示或隱藏標簽中包含的附加信息,內部標簽 <summary> 元素則可為該部件提供概要。
一個簡單的例子如下:
<details>
<summary> 不能說的秘密 </summary>
藏的這么深,可還是被你發現了
</details>
details {
border: 1px solid #aaa;
border-radius: 4px;
padding: .5em .5em 0;
}
summary {
font-weight: bold;
margin: -.5em -.5em 0;
padding: .5em;
}
details[open] {
padding: .5em;
}
details[open] summary {
border-bottom: 1px solid #aaa;
margin-bottom: .5em;
}
使用語義化 HTML 的優點:頁面內容結構更清晰,方便開發者閱讀,更利于瀏覽器的理解與加載,搜索引擎解析與SEO優化。
原生元素默認的樣式很簡陋,因此我們需要為其定制一下樣式,這塊內容我們簡單帶過,只講解關鍵部分,樣式內容有省略,具體可以在文末的碼上掘金中看到呈現效果。
.ContentWarning > summary {
position: relative;
list-style: none; /** 去除默認樣式 **/
user-select: none;
cursor: pointer;
/** 為其添加一個斜線背景 **/
--stripe-color: rgb(0 0 0 / 0.1);
background-image: repeating-linear-gradient(45deg,
transparent,
transparent 0.5em,
var(--stripe-color) 0.5em,
var(--stripe-color) 1em);
}
/** 通過var變量調整懸停時的顏色樣式 **/
.ContentWarning>summary: hover,
.ContentWarning>summary: focus {
--stripe-color: rgb(150 0 0 / 0.1);
}
現在我們來把它封裝成一個完整的組件,這需要先將 HTML 編寫在模板 template 當中,并設置一個 id,如下所示:
<template id="warning-card">
<details class="ContentWarning">
<summary>
<strong>?? 注意:</strong> 以下為隱藏內容
</summary>
<slot name="desc"> 藏的這么深,可還是被你發現了 </slot>
</details>
</template>
熟悉 Vue 的小伙伴應該很容易理解上面的代碼,結構很相似,不過網頁不會直接渲染它包裹的內容。此外我們還對此模板設置了一個插槽 slot,后面會講到它的作用。
有了上面封裝好的模板,我們就需要在 JS 中定義成可用組件來讓其能夠被使用,調用 window 下的 customElements.define 方法,第一個參數是傳入組件名稱,我們定義組件名為: warning-card ,第二個參數傳入一個繼承了 HTMLElement 的類,在其構造方法當中獲取并克隆一個新的 HTML 節點,它會通過 appendChild 渲染到頁面當中。
window.customElements.define('warning-card',
class extends HTMLElement {
constructor() {
super();
var templateElem=document.getElementById('warning-card');
var content=templateElem.content.cloneNode(true);
this.appendChild(content);
}
})
接著我們就可以在頁面中把它當作組件那樣使用了:
<warning-card> </warning-card>
回頭看看上面我們模板中設置的插槽 slot,此時還是沒有生效的,我們需要稍微改寫一下構造函數中的渲染方式,將 web 組件定義為一個 Shadow DOM,這樣構造的是一個可以將標記結構、樣式和行為隱藏起來,并與頁面上的其他代碼相隔離,保證不同的部分不會混在一起的獨立元素,并在最后使用 Node.cloneNode() 方法添加了模板的拷貝到 Shadow 的根結點上。
window.customElements.define('warning-card',
class extends HTMLElement {
constructor() {
super();
var template=document.getElementById('warning-card').content;
this.attachShadow({ mode: 'open' }).appendChild(template.cloneNode(true));
}
})
現在我們嘗試使用下組件,往其內容添加一個圖片,指向名為 desc 的 slot 插槽中:
<warning-card>
<img slot="desc" src="https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ba825ffee78c4a1b9c0232e5d2f1d048~tplv-k3u1fbpfcp-watermark.image?" />
</warning-card>
這時你會發現,圖片插入到 details 元素的隱藏區域當中了,slot 已經成功生效,但是樣式卻消失了,這時因為組件已經被完全隔離,我們需要將樣式作用在其內部才會生效。
<template id="warning-card">
<style>
<!-- TODO: 組件的樣式 -->
</style>
<details class="ContentWarning">
<summary>
<strong>?? 注意:</strong>
</summary>
<slot name="desc">THE DESCRIPTION</slot>
</details>
</template>
這樣組件就正常了:
除了定制模板中的插槽,我們也可以通過 HTML 標簽屬性來實現一些簡單的傳參,例如在 summary 標簽中顯示一個標題:
<warning-card title="前方高能">
</warning-card>
我們只需要在模板中定義好這個標題的位置:
<template id="warning-card">
<details class="ContentWarning">
<summary>
<!-- TODO: 模板中加入一個span標簽 -->
<strong>?? 注意:</strong> <span id="title"></span>
</summary>
</details>
</template>
最后在構造函數中我們通過 document 的原生方法寫入模板中就可以了:
window.customElements.define('warning-card',
class extends HTMLElement {
constructor() {
super();
var template=document.getElementById('warning-card').content;
// TODO: 找到title標簽,寫入傳入組件的title屬性值
template.querySelector('#title').innerText=this.getAttribute('title');
this.attachShadow({ mode: 'open' }).appendChild(template.cloneNode(true));
}
})
至此,我們通過一個簡單的原生組件學習了如何編寫 Web Components,可以在此代碼片段中查看具體源碼:原生Web Components組件 - 碼上掘金原生Web Components組件 - 碼上掘金。
以上就是文章的全部內容,希望對你有所幫助!如果覺得文章寫的不錯,可以點贊收藏,也歡迎關注,我會持續更新更多前端有用的知識與實用技巧,我是茶無味de一天,希望與你共同成長~
業門戶系統是企業信息化系統建設的一個重要支撐,以企業業務系統為基礎搭建門戶系統作為統一入口和應用中心可以有效支撐系統整合,打造一體化信息整合平臺。Portal門戶集成平臺能夠基于企業的實際需要,通過應用集成、數據集成、菜單集成等集成方式構建企業門戶網站、應用門戶、數據門戶、知識中心等,滿足企業對外展示、內部業務、數據統計、文檔分享等場景需要。
Portlet組件是Portal中重要的組成部分,在頁面中注冊、配置相應的Portlet組件,通過Portal的聚合機制,從而實現數據的動態展現,同時Portlet組件之間支持通訊,可以實現組件之間的聯動,在Portal中Portlet有全動態和普通組件兩種,全動態Portlet直接在Portal平臺進行開發,而普通的Portlet組件需要借助DP進行擴展開發,二者的應用場景也是有所不同的,本篇文檔主要介紹兩種組件的開發步驟及配置過程。
Portal門戶集成平臺作為構建企業門戶和統一入口的集成配置平臺,提供了靈活的前端展現和后臺配置功能,根據企業的實際需要,可用通過Portal平臺的配置構建企業門戶、應用中心、數據門戶、知識中心等各類門戶,同時也能基于企業架構分別為集團和子公司、板塊獨立構建門戶。
1.功能架構
Portal門戶平臺主體功能包括門戶展現和后臺管理兩部分,門戶展現主要是呈現給最終用戶的顯示效果,即各類應用門戶,后臺管理主要作用是對Portal的門戶展現進行配置,包括各類導航、主題、頁面、組件、數據等。
Portal門戶集成平臺可以根據最終用戶或使用場景的不同構建面對管理層、普通員工、外部人員等不同角色的門戶,基于Portal平臺預置的各類組件和功能可以實現不同門戶的動態配置,包括展現方式、主題樣式、顯示內容等。同時平臺支持CAS認證、群組管理、角色管理、用戶管理、權限管理等機制,可以構建統一的認證和授權中心,控制相關的訪問權限。
2.集成架構
Portal門戶集成平臺作為應用的統一入口,支持應用集成、菜單集成、頁面集成、數據集成等不同的集成方式,可以將業務系統的訪問地址、功能菜單、頁面等統一集成到門戶中,從而實現在門戶的統一訪問和業務操作。
根據實際業務需要,Portal平臺支持建立多種門戶,并支持不同角色、不同終端的訪問需要,同時可以將業務系統的功能、業務、數據等集中到一個平臺進行查看和操作,借助于ESB企業應用集成平臺的應用集成、數據集成,將業務系統的相關數據匯總呈現到Portal門戶中。
3.組件說明
Portlet是基于Java的Web組件,在Portal門戶中,Portlet作為可插拔的組件實現Portal中數據的展現。在Portal中Portlet有全動態和普通組件兩種。
1.全動態Portlet:全動態Portlet組件不需要進行后端的代碼開發,只需要在后臺管理中定義好HTML的模板代碼,在配置頁面組件時選擇“全動態Portlet”,最后在展現頁面通過“編輯組件”配置組件的html模板,以及構建組件的數據URL,從而實現全動態Portlet的構建。
2.普通Portlet:開發時需要通過DP開發平臺進行代碼開發,一般適用于代碼比較復雜,缺少直接獲取數據接口的組件,需要通過代碼開發來構建組件,以及進行數據的獲取與處理。
在開發組件時主要涉及到的后臺功能有:組件設置、組件模板和靜態數據,下面主要介紹以上三塊功能。
1.組件設置
1.在組件設置中可以引入普通Portlet組件的相關信息。
2.配置完組件信息后,可以直接在“導航管理”模塊引用該組件。
2.組件模板
1.在組件模板中可以配置全動態Portlet組件的HTML模板代碼。
2.配置成功后,可以通過編輯頁面的接口地址獲取該模板信息。
3.靜態數據
1.在“靜態數據”模塊可以配置組件所需的靜態數據,可以配置json、xml等。
全動態Portlet組件不需要進行后端的代碼開發,只需要在后臺管理中定義好HTML的模板代碼,在配置頁面組件時選擇“全動態Portlet”,最后在展現頁面通過“編輯組件”配置組件的html模板,以及構建組件的數據URL,從而實現全動態Portlet的構建。下面主要介紹全動態Portlet的開發過程。
1.組件數據
1.首先需要確認組所需數據的格式,數據可以通過接口或者在Portal的靜態數據中獲取。
2.明確獲取數據的地址。
2.組件模板
1.確認完組件所需數據格式后,需要在“組件模板”中添加模板信息。
2.可以在模板明細頁面獲取該模板的地址信息。
3.展現配置
1.首先在“導航管理”模塊的頁面布局中配置一個全動態Portlet。
2.在展現頁面中對添加的組件切換為EDIT狀態,定義Html模板和數據URL。
3.頁面展現效果如下:
普通Portlet在開發時需要通過DP開發平臺進行代碼開發,一般適用于代碼比較復雜,缺少直接獲取數據的接口的組件,需要通過代碼開發來構建組件,以及進行數據的獲取與處理。下面主要介紹普通Portlet組件的開發過程。
1.開發組件
普通Portlet組件后臺代碼中主要包括以下方法:view、edit、saveConfig和getAjaxData。
1.view方法:用于組件展現的方法。
2.edit方法:顯示組件配置頁面,用來定義組件的各種屬性。
3.saveConfig方法:保存組件屬性時調用該方法。
4.getAjaxData:獲取組件所需數據方法。
2.配置組件
1.在DP中開發完組件后,需要在“組件設置”模塊添加該組件。
3.展現配置
1.首先在“導航管理”模塊的頁面布局中配置配置該組件。
2.然后在展現頁面中對添加的組件切換為EDIT狀態,配置組件相關屬性。
3.配置成功后頁面展現效果如下:
在學習portal產品的過程中,自己的技術能力及意識形態等多方面都得到了很大提升,并且有了很多感悟,現在將我在本工作中的收獲總結如下。
1.應用場景
Portal作為構建企業門戶和應用中心的集成平臺,提供了豐富的配置功能,可以根據業務需要配置各類門戶,同時支持定制化擴展開發,滿足企業業務的靈活展現,構建企業的統一訪問入口。基于Portal門戶平臺可以將各個業務系統的訪問入口、功能頁面、數據等統一集中展現,支撐同一平臺進行多業務的操作,或者跳轉到各個平臺進行操作。
2.發展趨勢
隨著數字化和移動互聯網時代的來臨,云計算、大數據、微服務、移動互聯等各種新興技術為企業業務不斷發展帶來支撐,門戶平臺理念技術也根據新技術的發展進行對應的改造與升級,以不斷支撐企業內外部業務的處理。新時期互聯網環境下,構建連接一切、集成一切的集中化、多層級、高服務、高創新的中臺戰略出現,而門戶搭建做為信息化建設重要階段,也在此背景下重新定位。
3.集成方案
由于Portal平臺是作為統一應用入口存在的,所以在各個解決方案中都可以結合Portal平臺構建統一的入口,這樣無論是使用還是進行方案演示,都可以通過Portal統一訪問,提高操作過程的流暢性,更能體現出方案的一體化特性,提高方案的演示效果。
后續隨著Portal產品更多的應用于集成方案和門戶網站建設,產品的相關功能也會更加全面和完善,同時隨著后續云平臺模式的不斷深化,不斷推動直接面向客戶的多租戶、云平臺的SaaS模式,Portal的使用場景也會更加的豐富和靈活,支撐更多的業務,更全面的支持產品方案的一體化融化。
本文由@數通暢聯原創,歡迎轉發,僅供學習交流使用,引用請注明出處!謝謝~
能:純VUE,純前端實現文件上傳,支持文件上傳,大文件上傳,文件夾上傳,100G超大文件斷點續傳,MD5校驗,文件秒傳,云存儲,比如阿里云,七牛云,華為云,百度云,騰訊云,
核心優勢:使用簡單,配置簡單,集成簡單,維護簡單。提供前端源代碼,提供后端源代碼,提供7*24小時專業工程師技術支持。
代碼:https://gitee.com/xproer/up6-vue-cli
1.引入up6組件
2.配置接口地址
接口地址分別對應:文件初始化,文件數據上傳,文件進度,文件上傳完畢,文件刪除,文件夾初始化,文件夾刪除,文件列表
參考:http://www.ncmem.com/doc/view.aspx?id=e1f49f3e1d4742e19135e00bd41fa3de
3.定義事件
*請認真填寫需求信息,我們會在24小時內與您取得聯系。