首页 > 其他分享 >Blazor和Vue对比学习(进阶.路由导航二):布局(母版/嵌套)

Blazor和Vue对比学习(进阶.路由导航二):布局(母版/嵌套)

时间:2022-12-10 16:45:40浏览次数:56  
标签:razor vue 进阶 母版 Vue Animal 组件 路由

单文件组件框架中,当更改请求地址时,并不会引发页面跳转,而是由框架捕获请求地址(在框架中我们称之为路由),然后根据路由与组件的映射关系,在页面的指定位置切换和显示组件。在哪个位置显示(称之为路由出口),就是布局要解决的问题。无论是Vue,还是Blazor,我们都能以母版页的方式来理解和使用布局。母版页,就是布局的整个页面环境,我们可以在母版页的指定位置,放一个占位符,这个占位符作为路由出口,Vue使用【<router-view />】组件作为占位符,而Blazor中使用【@Body】指令。母版页本质上也是组件,所以我们可以将“在路由出口”显示的组件也成为母版页,这样就可以实现复杂的嵌套布局。文字描述,比较晦涩,下面通过案例直接上手。

 

一、案例说明:如图所示,首屏为左右结构,左侧显示文字链接“关于”和“动物”,右侧是一个路由出口。点击“关于”时,直接在路由出口上显示“About组件”。点击“动物”时,切换到Animal组件,Animal组件也是一个母版页,上下结构,上方显示文字链接“PandaDetail”和DogDetail“”,下方是动物组件的路由出口,点击上方链接时,将切换显示“PandaDetail组件”和“DogDetail组件”。

 

  

 

二、Blazor实现(忽略CSS样式)。文件结构包括:App.razor(路由管理器并设置顶层母版)、MainLayout.razor(默认顶层母版)、Index.razor(首页)、About.razor、Animal.razor(二层母版)、PandaDetail.razor、DogDetail.razor。

1、App.razor(路由管理器并设置顶层母版) 

<!--创建项目时自动创建立,基本没有变化,对布局来说,主要是指定的默认母版页ManiLayout-->
<Router AppAssembly="@typeof(App).Assembly">
    <Found Context="routeData">
        <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
        <FocusOnNavigate RouteData="@routeData" Selector="h1" />
    </Found>
    <NotFound>
        <PageTitle>Not found</PageTitle>
        <LayoutView Layout="@typeof(MainLayout)">
            <p role="alert">抱歉,未找到请求的页面.</p>
        </LayoutView>
    </NotFound>
</Router>

 2、MainLayout.razor(默认顶层母版) 

<!--将本组件转为母版页,LayoutComponentBase提供了Body属性
Body为RenderFragment类型,作为占位符渲染子组件,称之为路由出口-->
@inherits LayoutComponentBase

<PageTitle>嵌套布局</PageTitle>
<div class="page">
    <div class="sidebar">
        <NavLink class="nav-link" href="" Match="NavLinkMatch.All">
            <h1>首页</h1>
        </NavLink>
        <NavLink class="nav-link" href="about">
            <h1>关于</h1>
        </NavLink>
        <NavLink class="nav-link" href="animal">
            <h1>动物</h1>
        </NavLink>
    </div>
    <main>
        @Body
    </main>
</div>

3、Index.razor(首页,本案例中没有实际意义)

<!--路由为首页,隐式使用默认母版页MainLayout-->
@page "/"

<PageTitle>首页</PageTitle>
<h1>这里是首页</h1>
@code{
}

4、About.razor

<!--路由为about,隐式使用默认母版页MainLayout-->
@page "/about"

<PageTitle>关于</PageTitle>
<h3>这里是关于页About.razor</h3>
@code {
}

5、Animal.razor(二层母版)

<!--路由为animal,使用母版页MainLayout。
注意,如果组件转为母版页,需要显式指定母版页,不能隐式使用默认母版页。-->
@page "/animal"
@layout MainLayout
<!--将组件转为母版页,可以使用@Body占位符-->
@inherits LayoutComponentBase

<PageTitle>动物</PageTitle>
<h3>这里是动物页Animal.razor</h3>
<NavLink class="nav-link" href="animal/panda-detail"><h5>熊猫详情</h5></NavLink>
<NavLink class="nav-link" href="animal/dog-detail"><h5>狗狗详情</h5></NavLink>
<main>
    @Body
</main>
@code {
}

6、PandaDetail.razor、DogDetail.razor,Animal的子页面

<!--PandaDetail.razor-->
<!--路由animal/panda-detail,母版页为Animal.razor-->
@page "/animal/panda-detail"
@layout Animal

<h3>这里是熊猫详情页PandaDetail.razor</h3>
@code {
}

<!--DogDetail.razor-->
<!--路由animal/dog-detail,母版页为Animal.razor-->
@page "/animal/dog-detail"
@layout Animal

<h3>这里是狗狗详情页DogDetail.razor</h3>
@code {
}

 

  三、Vue的实现(忽略CSS样式)。文件结构包括:Router/index.js(路由管理器)、App.vue(顶层母版)、About.vue、Animal.vue(二层母版)、PandaDetail.vue、DogDetail.vue。

1、App.vue(顶层母版)

<template>
  <header>
    <h1><router-link to="/">首页</router-link></h1>
    <h1><router-link to="/about">关于</router-link></h1>
    <h1><router-link to="/animal">动物</router-link></h1>
  </header>
  <main>
    <!--顶层路由出口-->
    <router-view></router-view>
  </main>
</template>

2、About.vue 

<!--普通组件-->
<template>
  <h2>这里是关于页About.vue</h2>
</template>

 

3、Animal.vue(二层母版) 

<template>
  <h2>这里是关于动物页Animal.vue</h2>
  <header>
    <h1><router-link to="/panda-detail">熊猫详情</router-link></h1>
    <h1><router-link to="/dog-detail">狗狗详情</router-link></h1>
  </header>
  <main>
    <!--第二层路由出口-->
    <router-view></router-view>
  </main>
</template>

4、PandaDetail.vue和DogDetail.vue

<!--普通组件-->
<template>
    <h2>这里是熊猫详情页PandaDetail.vue</h2>
</template>

<!--普通组件-->
<template>
    <h2>这里是狗狗详情页DogDetail.vue</h2>
</template>

5、Router/index.js(路由管理器),嵌套设置主要在路由管理器中进行

//路由使用了name属性,用于指定路由的别名
//导航时即可以使用路径path: <RouterLink to="/about">关于</RouterLink>
//也可以使用别名name: <RouterLink :to="{name:'about'}">关于</RouterLink>
//RouterLink和router-link一样
import { createRouter, createWebHistory } from 'vue-router'
const routes = [
  {
    path: '/',
    name: 'home', 
    component: ()=> import('../views/Index.vue'),
  },
  {
    path: '/about',
    name: 'about',
    component: () => import('../views/About.vue')
  },
  {
    path: '/animal',
    name: 'animal',
    component: () => import('../views/Animal.vue'),
    //Animal的子路由,以下路由的组件,在Animal组件的路由出口的切换显示
    children:[
      {
        path:'/panda-detail',
        name:'panda-detail',
        component: () => import('../views/PandaDetail.vue')
      },
      {
        path:'/dog-detail',
        name:'dog-detail',
        component:() => import('../views/DogDetail.vue')
      }
    ]
  }
]

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes
})

export default router

 

 

 

四、总结:通过嵌套路由实现,应该可以明显的感受到Blazor和Vue的路由和布局差异:

  1. Blazor是一个向上的过程,通过指定母版页,来确定母子嵌套关系。而Vue是一个向下的过程,通过指定子页面,来确定母子嵌套关系。
  2. Blazor的布局构件,包括了@page、@layout、@inherits LayoutComponentBase、@body。而Vue,就一个router-view,然后就是在路由配置文件(Router/index.js)中进行配置。它们的区别和路由一样,Blazor分散到各个组件中,而Vue集中到路由配置文件中。

标签:razor,vue,进阶,母版,Vue,Animal,组件,路由
From: https://www.cnblogs.com/functionMC/p/16950095.html

相关文章

  • Vue学习笔记2--类样式绑定和内置指令v-xxx
    Class和Style绑定class绑定放置对象(常用):class="{类名:布尔}"<!--第一种放置字符串--><pclass="active">hello</p><!--第二种放置对象--><!--......
  • 【Swift底层进阶--018:高阶函数】
    ​​Swift​​​是一门面向协议的语言,开发中我们已经充分享受到面向协议编程的便利,但​​Swift​​​相比​​OC​​还有一个更重要的优势,那就是对函数式编程提供了强大的支......
  • Vue Vue-Router params 传参 为空 path定义参数 参数 param is not repeatable
    我在Vue-Router4.0.3版本上出现这个问题因为官方在2022年8月22日时废除了未定义的传参方式,所以必须使用定义的params。解决办法:在配置路由时:path路径上带上传值的key值......
  • Vue2(笔记30) - 脚手架 - 插件
    插件Vue的插件功能可以整合之前所有的全局配置,也支持传参,使用起来比较强大;Vue 的插件,本质上是一个 对象;要求这个对象中,必须包含install() 方法;第一步:定义一个插件文件;pu......
  • vue2 基础
    一、什么是vue构建用户界面用vue网html页面中填充数据。框架框架是一套现场的解决方案,程序员必须遵守框架的语法,去编写业务代码。学习vue,即学习vue框架......
  • Vue2(笔记29) - 脚手架 - mixin混入
    mixin混入所谓混入,就是几个组件共享一个配置,可局部混入,也可全局混入;第一步:先建个混入文件,配置写进去,再export 出来;新建mixin.js 文件: exportconstcommonConfig={......
  • VUE项目启动: npm install --save core-js/modules/es.error.cause.js
    完美解决,按照给的方法。以下是链接:https://blog.csdn.net/qq_41071929/article/details/123920642?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.non......
  • vue table刷新单行数据
    1.给el-table加上标记方法<el-tablev-loading="loading":data="tagList1"@selection-change="handleSelectionChange1":row-class-name="tableRowClassName"> ta......
  • MySQL进阶实战7,查询的执行过程
    @目录一、拆分查询二、分解关联查询三、查询的执行过程四、优化器的一些优化手段1、重新定义关联表的顺序2、将外连接转化为内连接3、使用增加变换规则4、优化count()、max......
  • MySQL进阶实战9,InnoDB和MyISAM的数据分布对比
    一、InnoDB存储引擎InnoDB的数据存储在表空间dataspace中,由很多数据文件组成。InnoDB采用MVCC来支持高并发,实现了四个标准的隔离级别。其默认级别是可重复读repeatablerea......