<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
網際網路時代,網路“提速”日益頻繁,人們開啟Web或軟體的速度越來越快。然而在某些情況下,難免會出現需要使用者等待的時候。那麼,在這種情況下,美觀,有趣,又實用的載入動畫,不僅能夠有效地減緩使用者負面情緒,讓使用者挺留更長的時間。
使用 loading 的方式:
元件式
<van-loading />
指令式
<div v-loading="loading" ></div>
程式設計式
loading({ text: '載入中' })
註冊 loading 指令
app.directive('focus', { mounted(el, binding) {}, // ... other hooks })
使用指令
<div v-loading="isShow" >/** content **/ </div>
指令的作用:
自定義指令就是一個定義了一些 Hooks 的物件,這些 Hooks 接受繫結 DOM(這裡指的是div)、binding引數等引數。在這些 Hooks 可以進行一些 DOM 層的操作,來複用一些公共邏輯。
directive 具體使用參考
思路:
loading
元件,將它的 DOM 插入到檔案中。loading
對應的 DOM 從檔案中移除。來看下流程
檢視 Element 原始碼 packages/loading/src/directive
const vLoading = { mounted(el, binding) { if(!!binding.value){ createInstance(el, binding) // 建立 loading 元件並插入到檔案中 } }, updated(el, binding) { const instance = el.instance // 以建立的元件範例 if (binding.oldValue !== binding.value) { if(binding.value) { // value 從 false -> true 時觸發 createInstance(el, binding) } else { instance.close() // 移除 loading 元件掛載的 DOM } } }, unmounted(el) { el?.instance?.close() // 移除 loading 元件掛載的 DOM }, }
createInstance 建立 loading 範例
const createInstance = (el, binding) => { // 通過繫結 DOM 的自定義屬性來設定 loading 的相關引數 const textExr = el.getAttribute('element-loading-text') const spinnerExr = el.getAttribute('element-loading-spinner') const backgroundExr = el.getAttribute('element-loading-background') const customClassExr = el.getAttribute('element-loading-custom-class') const vm = binding.instance el.instance = Loading({ text: vm && vm[textExr] || textExr, spinner: vm && vm[spinnerExr] || spinnerExr, background: vm && vm[backgroundExr] || backgroundExr, customClass: vm && vm[customClassExr] || customClassExr, fullscreen: !!binding.modifiers.fullscreen, target: !!binding.modifiers.fullscreen ? null : el, body: !!binding.modifiers.body, visible: true, lock: !!binding.modifiers.lock, }) }
Loading
const Loading = function (options: ILoadingOptions = {}): ILoadingInstance { // 覆蓋預設設定 options = { ...defaults, ...options, } // 支援選擇器 if (typeof options.target === 'string') { options.target = document.querySelector(options.target) as HTMLElement } // 或者直接傳遞一個 DOM options.target = options.target || document.body // loading 插入的父元素 const parent = options.body ? document.body : options.target options.parent = parent // loading 元件 const instance = createLoadingComponent({ options, globalLoadingOption, }) // loading 插入到父元素中 parent.appendChild(instance.$el) // 返回 loading 範例 return instance }
createLoadingComponent
export function createLoadingComponent({ options, globalLoadingOption, }: ILoadingCreateComponentParams): ILoadingInstance { let vm: VNode = null const data = reactive({ ...options, visible: false, // 控制 loading 是否展示 }) function setText(text: string) { data.text = text } function close(){ data.visible = false } const componentSetupConfig = { ...toRefs(data), setText, close, handleAfterLeave, } // loading 元件 const elLoadingComponent = { name: 'ElLoading', setup() { return componentSetupConfig }, render() { return h(Transition, { name: 'el-loading-fade', }, { // withDirectives 使用指令 default: withCtx(() => [withDirectives(createVNode('div', { // ... loading 動畫 // v-show 指令,使用 visible 作為控制變數 }),[[vShow, this.visible]])]), }) } } vm = createVNode(elLoadingComponent) // 將 vnode patch 掛載到指定容器上, vnode 轉換為真正的 DOM render(vm, document.createElement('div')) return { ...componentSetupConfig, vm, get $el() { return vm.el as HTMLElement }, } }
elLoadingComponent
的 loading 元件是通過 svg + css animation 實現的。
<svg class="loading" version="1.1" xmlns="http://www.w3.org/2000/svg" width='50' height='50'> <circle class="circle" cx="25" cy="25" r="20" fill="none" stroke-width="2" stroke="#000"/> </svg>
涉及 stroke-dasharray
設定點劃線實虛線的間距,以及 stroke-dashoffset
設定起始位置,具體程式碼檢視下面的demo程式碼。
程式設計式呼叫和指令,他們的核心邏輯是相同的,
定義的 elLoadingComponent
通過 props 來控制 loading 的展示。
主要分析瞭如何通過 vue directive 實現 loading 的複用。包括瞭如何使用 loading 的三種方式,其中核心的邏輯是相同的渲染loading 元件,我們可以通過元件、程式設計式、指令將 loading 元件的DOM 插入到我們指定的掛載元素上。
到此這篇關於Element如何實現loading的方法範例的文章就介紹到這了,更多相關Element loading內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45