版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
consthooks=['create','activate','update','remove','destroy']exportfunctioncreatePatchFunction(backend){//const{modules,nodeOps}=backendfor(i=0;i<hooks.length;++i){//cbs['update']=cbs[hooks[i]]=//modules:[attrs,klass,events,domProps,style,transition]for(j=0;j<modules.length;++j){//modules[0]['update']是創(chuàng)建屬性執(zhí)行函數(shù),其他hookif(isDef(modules[j][hooks[i]]))}}//cbs['update']:[fn,fn,fn...}functionpatchVnode(...)if(isDef(data)&&isPatchable(vnode))//每次patchfor(i=0;i<cbs.update.length;++i)if(isDef(i=data.hook)&&isDef(i=i.update))i(oldVnode,}}}<div<div//使用elnewdata:{foo:'foo'},el:"#demo",constapp=new//輸出render?unction?unction{with(this)return_c('div',{attrs:{"id":"demo"}},_c('h1',[_v("Vue.js測(cè)試_v("_c('p',}} parseHTML(tempalte,{start(tag,attrs,unary){},//遇到開(kāi) end(){},//遇到結(jié)束 chars(text){},//遇到文本 comment(text){}//遇到注 代碼實(shí)現(xiàn) piler/optimizer.js-exportexportfunctionoptimize(root: ement,options:{if(!root)isStaticKey=genStaticKeysCached(options.staticKeys||'') Tag=options.is Tag||no////markStaticRoots(root,} exportexportfunction(ast: ement|optionsoptions:):CodegenResultconststate=newconstcode=ast?genElement(ast,state):'_c("div")'return{render:`with(this){return${code}}`,staticRenderFns:state.staticRenderFns}}////解析v-functionprocessIf(el)constexp=getAndRemoveAttr(el,'v-if')//獲取v-if=“exp"中exp并刪除v-ifif(exp)el.if=exp為ast添加ifaddIfCondition(el,{//為ast添加ifConditionsexp:exp,block:else{if(getAndRemoveAttr(el,'v-else')!={el.else=}constelseif=getAndRemoveAttr(el,'v-else-if')if(elseif){el.elseif=}}}functiongenIfConditions(conditions:ASTIfConditions,state:CodegenState,altGen?:Function,altEmpty?:string):stringconstconstconditionconditions.shiftif(condition.exp`(${condition.exp})?${genIfConditions(conditions,state,altGen,}elsereturn}//v-ifwithv-onceshouldgeneratecodelike(a)?_m(0):_m(1)functiongenTernaryExp(el){}} "with(this){return"with(this){return(foo)?_c('h1',[_v(_s(foo))]):_c('h1',[_v("no_v("到這些渲染好的vnodes。對(duì)象,著不同名稱(chēng)的插槽以及它們對(duì)應(yīng)的渲染函數(shù),只有在編譯和渲染子組件階段////processSlotContent:處理 tev-constslotBindinggetAndRemoveAttrByRegex(elslotRE)查找v-slot:xxxif(slotBinding){constnamedynamicgetSlotName(slotBindingname是xxxel.slotTarget=name//xxx賦值到slotTargetel.slotTargetDynamic=dynamicel.slotScopeslotBinding.value||emptySlotScopeTokenyyy賦值到}processSlotOutlet:處理if(el.tag==='slot')el.slotName=getBindingAttr(el,'name')//獲取slot的name并賦值到}genScopedSlot:這里把slotScopeconstfn=`function(${slotScope}){``return${el.tag=== ?el.if&&?`(${el.if})?${genChildren(el,state)||:genChildren(el,state)||:genElement(el,//constv-slotwithoutscopeon=slotScope?``:return`{key:${el.slotTarget|| npmrun//vue.config.js//vue.config.jsconstport=7070;consttitle="vue項(xiàng)目最佳實(shí)踐module.exports=publicPath:'/best-practice'部署應(yīng)用包時(shí)的基本URLdevServer:{port: ck://向index.htmlname:}//<title><%= ckCnpmnpmisvg-sprite-loader-////resolveconstpath=functionresolve(dir)returnpath.join(dirname,} ck(config)//配置svg規(guī)則排除 //新增icons規(guī)則,設(shè)置svg-sprite-loader處理 中的..rule("icons")//新增icons.test(/\.svg$/)//test.include.add(resolve("src/icons"include.end()//add完上下文是數(shù)組不是icons規(guī)則,使用end().use("svg-sprite-loader")//添加use.loader("svg-sprite-loader")//切換上下文為svg-sprite-.optionssymbolId:"icon-[name]"})//為svg-sprite-loader.end();}//////指定requireconstreq=require.context('./svg',false,////import <svg:class="svgClass"aria-hidden="true"v-<use:xlink:href="iconName" exportdefault{name:'SvgIcon',props:{{type:required:true{type:default:''}{iconName()svgClasssvgClass()if(this.className)return'svg-icon'+}elsereturn'svg-}}}}<style.svg-{width:1em;height:1em;vertical-align:-0.15em;fill:currentColor;overflow:hidden;}importimportVuefromimportSvgIconfromponent('svg-icon',<svg-icon<svg-iconicon-class="qq"></svg-constantRoutes和asyncRoutes。importimportVuefromimportRouterfrom"vue-importLayoutfrom'@/layout'exportconstconstRoutes={path:componentimport("@/views/Login"),hidden:true//導(dǎo)航菜單忽略該項(xiàng){path:component:Layout,//應(yīng)用布局redirect:"/home",children:{path:"home",component:()=>import(/*wckChunkName:"home"*/"@/views/Home.vue"),name:"home",meta:title:"Home"icon:"qq"http://}}]}exportconstasyncRoutes={path:"/about",component:Layout,redirect:"/about/index",children:{path:"index",component:()=>import(/*wckChunkName:"home"*/"@/views/About.vue"),name:"about",meta:title:"About",icon:"qq",roles:['admin',}]}exportdefaultRouter({mode:"history",base:process.env.BASE_URL,routes:constRoutesimportrouterfrom'./router'importstorefrom'./store'import{Message}from'element-import{getToken}from'@/utils/auth'//從獲取令牌constwhiist=['/login']//無(wú)需令牌白router.beforeEach(async(to,from,next)=>{//consthasToken=if(hasToken)if(to.path==='/login')//next({path:'/'}else//consthasRoles=store.getters.roles&&store.getters.roles.length0ifnext繼續(xù)即}elsetry//const{roles}=await//constaccessRoutes=awaitstore.dispatch('permission/generateRoutes',roles)//添加這些路由至路由//繼續(xù)路由切換,確保addRoutesnext({...to,rece:true}catch(error)出錯(cuò)需重置令牌并重新登錄(令牌過(guò)期、網(wǎng)絡(luò)錯(cuò)誤等原因awaitstore.dispatch('user/resetToken')Message.error(error||'HasError')}}}}elseif(whiist.indexOf(to.path)!==-1)//白路由放}}else}}sfromconstToken=exportfunction{exportfunction{return exportfunction{importimportVuefrom'vue'importVuexfrom'vuex'importpermissionfromimportuserfromconststore=newVuex.Store({modules:{permission,exportdefaultimportimport{getToken,setToken,removeToken}fromconststate{token:getToken(),roles:constmutations={SET_TOKEN:(state,token)=>{state.token=SET_ROLES:(state,roles){state.roles=}constactions=//userlogin({commit},{const{username}=userInfo;returnnewPromise((resolve,reject)=>{setTimeout(()=>if(username==="admin"||username==={commit("SET_TOKEN",username);}elsereject("用戶(hù)名、錯(cuò)誤}},//getusergetInfo({commit,state{returnnewPromise((resolve){setTimeout(()=>constroles=state.token==='admin'?['admin']:['editor']commit("SET_ROLES",roles);},//removetokenresetToken({commit}){returnnewPromise(resolve{commit("SET_TOKEN",commit("SET_ROLES",[]);removeToken();resolve();}exportexport{namespaced:true,permission模塊:路由配置信息、路由生成邏輯,import{asyncRoutes,constRoutes}from@roles@routefunctionhasPermission(roles,route)//如果當(dāng)前路由有roles字段則需判斷用戶(hù)權(quán)if(route.meta&&route.meta.roles)//若用戶(hù)擁有的角色中有被包含在待判定路由角色表中的則擁有returnroles.some(role=>}else//沒(méi)有設(shè)置roles則無(wú)需判定即可return}}@routes待過(guò)濾路由表,首次傳入的就是@rolesexportfunctionfilsyncRoutes(routes,{constres=routes.forEach(route=>//一consttmp={...route//如果用戶(hù)有權(quán)則加入結(jié)果路由if(hasPermission(roles,tmp))//if(tmp.children)tmp.children= syncRoutes(tmp.children,}}return}consts
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 測(cè)試工程師自動(dòng)化方向面試題及答案
- 金融風(fēng)險(xiǎn)管理師應(yīng)聘攻略及知識(shí)考點(diǎn)詳解
- 區(qū)塊鏈工程師金融面試題及答案
- 內(nèi)容運(yùn)營(yíng)崗位試題庫(kù)與解題技巧介紹
- 2025年5G智能制造系統(tǒng)項(xiàng)目可行性研究報(bào)告
- 2026屆河南省新鄉(xiāng)市高三上學(xué)期12月月考?xì)v史試題(含答案)
- 2025年家庭寵物護(hù)理中心項(xiàng)目可行性研究報(bào)告
- 2025年中央空調(diào)節(jié)能技術(shù)應(yīng)用項(xiàng)目可行性研究報(bào)告
- 2025年增材制造技術(shù)項(xiàng)目可行性研究報(bào)告
- 2025年文化創(chuàng)意產(chǎn)業(yè)發(fā)展可行性研究報(bào)告
- 鐵路工程道砟購(gòu)銷(xiāo)
- 2024年廣東省廣州市中考?xì)v史真題(原卷版)
- 壯醫(yī)藥線(xiàn)療法
- 超星爾雅學(xué)習(xí)通《中國(guó)古代史(中央民族大學(xué))》2024章節(jié)測(cè)試答案
- 項(xiàng)目4任務(wù)1-斷路器開(kāi)關(guān)特性試驗(yàn)
- 編輯打印新課標(biāo)高考英語(yǔ)詞匯表3500詞
- (高清版)DZT 0215-2020 礦產(chǎn)地質(zhì)勘查規(guī)范 煤
- 高層建筑消防安全培訓(xùn)課件
- 實(shí)驗(yàn)診斷學(xué)病例分析【范本模板】
- 西安交大少年班真題
- JJF(石化)006-2018漆膜彈性測(cè)定器校準(zhǔn)規(guī)范
評(píng)論
0/150
提交評(píng)論