




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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']是创建属性执行函数,其他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测试_v("_c('p',}} parseHTML(tempalte,{start(tag,attrs,unary){},//遇到开 end(){},//遇到结束 chars(text){},//遇到文本 comment(text){}//遇到注 代码实现 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。对象,着不同名称的插槽以及它们对应的渲染函数,只有在编译和渲染子组件阶段////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项目最佳实践module.exports=publicPath:'/best-practice'部署应用包时的基本URLdevServer:{port: ck://向index.htmlname:}//<title><%= ckCnpmnpmisvg-sprite-loader-////resolveconstpath=functionresolve(dir)returnpath.join(dirname,} ck(config)//配置svg规则排除 //新增icons规则,设置svg-sprite-loader处理 中的..rule("icons")//新增icons.test(/\.svg$/)//test.include.add(resolve("src/icons"include.end()//add完上下文是数组不是icons规则,使用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//导航菜单忽略该项{path:component:Layout,//应用布局redirect:"/home",children:{path:"home",component:()=>import(/*wckChunkName:"home"*/"@/views/Home.vue"),name:"home",meta:title:"Home"icon:"qq"//}}]}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']//无需令牌白router.beforeEach(async(to,from,next)=>{//consthasToken=if(hasToken)if(to.path==='/login')//next({path:'/'}else//consthasRoles=store.getters.roles&&store.getters.roles.length0ifnext继续即}elsetry//const{roles}=await//constaccessRoutes=awaitstore.dispatch('permission/generateRoutes',roles)//添加这些路由至路由//继续路由切换,确保addRoutesnext({...to,rece:true}catch(error)出错需重置令牌并重新登录(令牌过期、网络错误等原因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("用户名、错误}},//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)//如果当前路由有roles字段则需判断用户权if(route.meta&&route.meta.roles)//若用户拥有的角色中有被包含在待判定路由角色表中的则拥有returnroles.some(role=>}else//没有设置roles则无需判定即可return}}@routes待过滤路由表,首次传入的就是@rolesexportfunctionfilsyncRoutes(routes,{constres=routes.forEach(route=>//一consttmp={...route//如果用户有权则加入结果路由if(hasPermission(roles,tmp))//if(tmp.children)tmp.children= syncRoutes(tmp.children,}}return}consts
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国工业制造RFID行业市场动态分析、发展方向及投资前景分析报告
- 农业气候风险防控与应对机制
- 低空经济飞行器管理与运营方案
- 大气污染防治策略与路径
- 初级社会工作实务-初级社会工作者考试《社会工作实务》点睛提分卷2
- 2018-2019学年高中一轮复习英语讲义选修六Module4Music
- 员工绩效工资奖金发放方案
- 鸭腺病毒3型基因组序列分析及致病性研究
- 九年级数学上册专题训练八平面图形的运动及不规则图形面积问题课时精讲新版新人教版
- 中介转让店铺合同范例
- 2025年江苏南通炜赋集团有限公司招聘笔试参考题库含答案解析
- 《中国象棋基础教程》课件
- 大模型落地应用实践方案
- 写字楼反恐防暴演练
- 2025年鞍钢集团招聘笔试参考题库含答案解析
- 2025年劳务合同范本(2篇)
- 人文社科类横向课题技术服务合同5篇
- MCN机构的业务模式与盈利模式
- 高压氧护理进修汇报
- 2024解析:第五章透镜及其应用-讲核心(解析版)
- 《国家的空间特征》课件
评论
0/150
提交评论