想要實(shí)現(xiàn)頁(yè)面的局部刷新,我們只需要實(shí)現(xiàn)局部組件(dom)的重新渲染。在Vue中,想要實(shí)現(xiàn)這一效果最簡(jiǎn)便的方式方法就是使用v-if
指令。
在Vue2中我們除了使用v-if
指令讓局部dom的重新渲染,也可以新建一個(gè)空白組件,需要刷新局部頁(yè)面時(shí)跳轉(zhuǎn)至這個(gè)空白組件頁(yè)面,然后在空白組件內(nèi)的beforeRouteEnter
守衛(wèi)中又跳轉(zhuǎn)回原來(lái)的頁(yè)面。
如何在Vue3.X中實(shí)現(xiàn)點(diǎn)擊刷新按鈕重新加載紅框內(nèi)的DOM,并顯示相應(yīng)的加載狀態(tài)?。
由于Vue3.X中script setup
語(yǔ)法中組件內(nèi)守衛(wèi)只有onBeforeRouteUpdate
及onBeforeRouteUpdate
兩個(gè)API,因此我們來(lái)借助v-if
指令使局部dom重新渲染來(lái)實(shí)現(xiàn)這一需求。
第一步:定義狀態(tài)標(biāo)識(shí)
在全局狀態(tài)中定義一個(gè)isRouterAlive
標(biāo)識(shí)刷新?tīng)顟B(tài),根據(jù)isRouterAlive
變化來(lái)重新渲染。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="頁(yè)面加載中……" 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>
第三步、修改isRouterAlive 值,實(shí)現(xiàn)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í)器,并沒(méi)有采用網(wǎng)上比較常見(jiàn)的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í)現(xiàn)刷新頁(yè)面局部?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脫衣機(jī)

Video Face Swap
使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱門文章

熱工具

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

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

禪工作室 13.0.1
功能強(qiáng)大的PHP集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)代碼編輯軟件(SublimeText3)

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

Vue實(shí)現(xiàn)博客前端,需要實(shí)現(xiàn)markdown的解析,如果有代碼則需要實(shí)現(xiàn)代碼的高亮。Vue的markdown解析庫(kù)有很多,如markdown-it、vue-markdown-loader、marked、vue-markdown等。這些庫(kù)都大同小異。這里選用的是marked,代碼高亮的庫(kù)選用的是highlight.js。具體實(shí)現(xiàn)步驟如下:一、安裝依賴庫(kù)在vue項(xiàng)目下打開(kāi)命令窗口,并輸入以下命令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開(kāi)發(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,并且它是國(guó)外的富文本插件,沒(méi)有通過(guò)中文版本,需要在其官網(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問(wèn)它的npm官方地址:官方教程。在組件中引用使用時(shí)也很簡(jiǎn)單,只需要引入對(duì)應(yīng)的組件和它的樣式文件,我這里沒(méi)有在全局引用,只在我的組件文件中引入import{userInfoByRequest}from'../js/api'import{VueCropper}from'vue-cropper&

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

vue3項(xiàng)目打包發(fā)布到服務(wù)器后訪問(wèn)頁(yè)面顯示空白1、處理vue.config.js文件中的publicPath處理如下:const{defineConfig}=require('@vue/cli-service')module.exports=defineConfig({publicPath:process.env.NODE_ENV==='production'?'./':'/&

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