想要實(shí)作頁面的局部刷新,我們只需要實(shí)作局部元件(dom)的重新渲染。在Vue中,想要實(shí)現(xiàn)這效果最簡(jiǎn)單的方式方法就是使用v-if
指令。
在Vue2中我們除了使用v-if
指令讓局部dom的重新渲染,也可以新建一個(gè)空白元件,需要刷新局部頁面時(shí)跳轉(zhuǎn)至這個(gè)空白元件頁面,然後在空白元件內(nèi)的beforeRouteEnter
守衛(wèi)中又跳轉(zhuǎn)回原來的頁面。
如何在Vue3.X中實(shí)作點(diǎn)擊刷新按鈕重新載入紅框內(nèi)的DOM,並顯示對(duì)應(yīng)的載入狀態(tài)? 。
由於Vue3.X中script setup
語法中元件內(nèi)守衛(wèi)只有onBeforeRouteUpdate
及onBeforeRouteUpdate
兩個(gè)API,因此我們來借助v-if
指令使局部dom重新渲染來實(shí)現(xiàn)這一需求。
第一步:定義狀態(tài)識(shí)別
在全域狀態(tài)中定義一個(gè)isRouterAlive
識(shí)別刷新狀態(tài),根據(jù)isRouterAlive
變化來重新渲染。 isLoading
標(biāo)識(shí)載入狀態(tài)。
import { defineStore } from 'pinia' export const useAppStore = defineStore({ id: 'app', state: () => ({ isRouterAlive: true, isLoading: false } as { isRouterAlive: boolean; isLoading: boolean }) })
第二步、借用v-if 指令讓dom節(jié)點(diǎn)重新渲染
<template> <div class="common-layout"> <el-container> <SideMenuView :collapse="isCollapse"></SideMenuView> <el-container> <NavMenuView v-model:collapse="isCollapse"></NavMenuView> <TabsView></TabsView> <!--核心 start--> <el-main v-loading="appStore.isLoading" element-loading-text="頁面加載中……" element-loading-background="rgba(0, 0, 0, 0.8)" > <router-view v-if="appStore.isRouterAlive"> </router-view> </el-main> <!--核心 end--> <el-footer>Footer</el-footer> </el-container> </el-container> </div> </template> <script setup lang="ts"> import SideMenuView from './SideMenuView.vue' import NavMenuView from './NavMenuView.vue' import TabsView from './TabsView.vue' import { useAppStore } from '@/stores/app' const appStore = useAppStore() const isCollapse = ref(false) </script> <style lang="scss" scoped> …… CSS樣式 </style>
第三個(gè)步驟、修改isRouterAlive 值,實(shí)作dom的重新渲染
<template> <div class="tabs-item cursor-pointer arrow-down" ref="buttonRef" @click="onClickOutside" > <el-icon><ArrowDownBold /></el-icon> </div> <el-popover ref="popoverRef" trigger="hover" virtual-triggering :virtual-ref="buttonRef" > <div class="arrow-down-item" @click="handleCommand('refresh')">刷新</div> <div class="arrow-down-item" @click="handleCommand('closeOther')"> 關(guān)閉其他 </div> <div class="arrow-down-item" @click="handleCommand('closeLeft')"> 關(guān)閉左側(cè) </div> <div class="arrow-down-item" @click="handleCommand('closeRight')"> 關(guān)閉右側(cè) </div> </el-popover> </template> <script setup lang="ts"> import { CloseBold, ArrowDownBold } from '@element-plus/icons-vue' import type { MenuItem } from '@/interface/menu' import { useMenuRouterStore } from '@/stores/menu-router' import { useTabsStore } from '@/stores/tabs' import { useAppStore } from '@/stores/app' const router = useRouter() const menuRouterStore = useMenuRouterStore() const tabsStore = useTabsStore() const appStore = useAppStore() // tabs功能操作 const buttonRef = ref() const popoverRef = ref() const onClickOutside = () => { unref(popoverRef).popperRef?.delayHide?.() } const handleCommand = (command: string) => { if (command === 'refresh') { appStore.isLoading = true // 展示數(shù)據(jù)加載狀態(tài) appStore.isRouterAlive = false // 設(shè)置為false,卸載dom setTimeout(() => { // 此處采用了定時(shí)器,并沒有采用網(wǎng)上比較常見的nextTick appStore.isRouterAlive = true // 設(shè)置為true,重新掛載dom appStore.isLoading = false // 隱藏?cái)?shù)據(jù)加載狀態(tài) }, 500) } else if (command === 'closeOther') { tabsStore.closeOther() } else { tabsStore.closeLeftOrRight(command) } } // …… </script> <style lang="scss" scoped> …… CSS樣式 </style>
以上是Vue3如何實(shí)作刷新頁面局部?jī)?nèi)容的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)

想要實(shí)現(xiàn)頁面的局部刷新,我們只需要實(shí)現(xiàn)局部元件(dom)的重新渲染。在Vue中,想要實(shí)現(xiàn)這效果最簡(jiǎn)單的方式方法就是使用v-if指令。在Vue2中我們除了使用v-if指令讓局部dom的重新渲染,也可以新建一個(gè)空白元件,需要刷新局部頁面時(shí)跳轉(zhuǎn)至這個(gè)空白元件頁面,然後在空白元件內(nèi)的beforeRouteEnter守衛(wèi)中又跳轉(zhuǎn)回原來的頁面。如下圖所示,如何在Vue3.X中實(shí)現(xiàn)點(diǎn)擊刷新按鈕實(shí)現(xiàn)紅框範(fàn)圍內(nèi)的dom重新加載,並展示對(duì)應(yīng)的加載狀態(tài)。由於Vue3.X中scriptsetup語法中組件內(nèi)守衛(wèi)只有o

Vue實(shí)作部落格前端,需要實(shí)作markdown的解析,如果有程式碼則需要實(shí)作程式碼的高亮。 Vue的markdown解析函式庫很多,如markdown-it、vue-markdown-loader、marked、vue-markdown等。這些庫都大同小異。這裡選用的是marked,程式碼高亮的函式庫選用的是highlight.js。具體實(shí)現(xiàn)步驟如下:一、安裝依賴庫在vue專案下開啟命令窗口,並輸入以下命令npminstallmarked-save//marked用於將markdown轉(zhuǎn)換成htmlnpmins

vue3+vite:src使用require動(dòng)態(tài)導(dǎo)入圖片報(bào)錯(cuò)和解決方法vue3+vite動(dòng)態(tài)的導(dǎo)入多張圖片vue3如果使用的是typescript開發(fā),就會(huì)出現(xiàn)require引入圖片報(bào)錯(cuò),requireisnotdefined不能像使用vue2這樣imgUrl:require(' …/assets/test.png')導(dǎo)入,是因?yàn)閠ypescript不支援require所以用import導(dǎo)入,下面介紹如何解決:使用awaitimport

tinymce是一個(gè)功能齊全的富文本編輯器插件,但在vue中引入tinymce並不像別的Vue富文本插件一樣那麼順利,tinymce本身並不適配Vue,還需要引入@tinymce/tinymce-vue,並且它是國外的富文本插件,沒有透過中文版本,需要在其官網(wǎng)下載翻譯包(可能需要翻牆)。 1.安裝相關(guān)依賴npminstalltinymce-Snpminstall@tinymce/tinymce-vue-S2、下載中文包3.引入皮膚和漢化包在項(xiàng)目public資料夾下新建tinymce資料夾,將下載的

最終效果安裝VueCropper組件yarnaddvue-cropper@next上面的安裝值針對(duì)Vue3的,如果時(shí)Vue2或想使用其他的方式引用,請(qǐng)?jiān)L問它的npm官方地址:官方教程。在元件中引用使用時(shí)也很簡(jiǎn)單,只需要引入對(duì)應(yīng)的元件和它的樣式文件,我這裡沒有在全域引用,只在我的元件檔案中引入import{userInfoByRequest}from'../js/api' import{VueCropper}from'vue-cropper&

vue3+ts+axios+pinia實(shí)作無感刷新1.先在專案中下載aiXos和pinianpmipinia--savenpminstallaxios--save2.封裝axios請(qǐng)求-----下載js-cookienpmiJS-cookie-s//引入aixosimporttype{AxiosRequestConfigig ,AxiosResponse}from"axios";importaxiosfrom'axios';import{ElMess

vue3專案打包發(fā)佈到伺服器後存取頁面顯示空白1、處理vue.config.js檔案中的publicPath處理如下:const{defineConfig}=require('@vue/cli-service')module.exports=defineConfig({publicPath :process.env.NODE_ENV==='production'?'./':'/&

前言無論是vue還是react,當(dāng)我們遇到多處重複程式碼的時(shí)候,我們都會(huì)想著如何重複使用這些程式碼,而不是一個(gè)檔案裡充斥著一堆冗餘程式碼。實(shí)際上,vue和react都可以透過抽組件的方式來達(dá)到復(fù)用,但如果遇到一些很小的程式碼片段,你又不想抽到另外一個(gè)檔案的情況下,相比而言,react可以在相同文件裡面宣告對(duì)應(yīng)的小元件,或透過renderfunction來實(shí)現(xiàn),如:constDemo:FC=({msg})=>{returndemomsgis{msg}}constApp:FC=()=>{return(
