【 使用路由建立多视图单页应用详细介绍】

发布时间:2024年01月20日

1. 多视图

构建多视图的单页应用程序(Single Page Application,简称SPA)通常会使用前端路由来实现,前端路由允许在不重新加载整个页面的情况下动态地加载不同的视图内容,这可以通过各种前端框架(如ReactAngularVue等)中的路由库来实现,下面,我将介绍如何在这些流行框架中使用路由来构建一个多视图SPA

1.1 引入依赖库

建立一个基本html项目,创建一个demo页面并引入一下js库文件

<script src="js/vue.js"></script>
<script src="js/vue-router.min.js"></script>

1.2 创建自定义组件

创建vue组件有两种方式:

  • var MyComonent = Vue.component(“button-counter”, {…});
    创建一个vue组件并赋给MyComponent变量
  • const Home = Vue.extend({});
    extend是构造一个组件的语法器. 你给它参数,他给你一个组件,然后这个组件你可以作用到Vue.component这个全局注册方法里,也可以在任意vue模板里使用

创建一个Home组件和About组件

//组件名用PPascalCase风格
const Home = Vue.extend({
    //必须定义一个根元素作为容器,包裹模板中的内容元素
    template: '<div><h1>Home组件</h1><div>Home组件内容区</div></div>'
});

const About = Vue.extend({
    //必须定义一个根元素作为容器,包裹模板中的内容元素
    template: '<div><h1>About组件</h1><div>About组件内容区</div></div>'
});

2. React(使用React Router)

React RouterReact中一个非常流行的路由库。

  1. 初始化项目和安装依赖

    npx create-react-app my-spa
    cd my-spa
    npm install react-router-dom
    
  2. 设置路由

    src目录中创建几个组件文件,例如Home.js, About.js, Contact.js,分别代表不同的视图。

    App.js中设置路由。

    import React from 'react';
    import { BrowserRouter as Router, Route, Switch, Link } from 'react-router-dom';
    import Home from './Home';
    import About from './About';
    import Contact from './Contact';
    
    function App() {
      return (
        <Router>
          <nav>
            <ul>
              <li><Link to="/">Home</Link></li>
              <li><Link to="/about">About</Link></li>
              <li><Link to="/contact">Contact</Link></li>
            </ul>
          </nav>
          <Switch>
            <Route exact path="/" component={Home} />
            <Route path="/about" component={About} />
            <Route path="/contact" component={Contact} />
          </Switch>
        </Router>
      );
    }
    
    export default App;
    

    当用户点击不同的链接时,<Router> 会匹配 <Route> 规则来动态加载对应组件。

  3. 创建视图组件

    在每个组件文件中定义不同的视图。

  4. 运行应用

    npm start
    

3. Angular(使用Angular Router)

在Angular中,有一个内建的路由库可以使用。

  1. 创建Angular应用

    ng new my-spa
    cd my-spa
    
  2. 设置路由

    app-routing.module.ts中配置路由。

    import { NgModule } from '@angular/core';
    import { Routes, RouterModule } from '@angular/router';
    import { HomeComponent } from './home/home.component';
    import { AboutComponent } from './about/about.component';
    import { ContactComponent } from './contact/contact.component';
    
    const routes: Routes = [
      { path: '', component: HomeComponent },
      { path: 'about', component: AboutComponent },
      { path: 'contact', component: ContactComponent },
    ];
    
    @NgModule({
      imports: [RouterModule.forRoot(routes)],
      exports: [RouterModule]
    })
    export class AppRoutingModule { }
    
  3. 创建视图组件

    使用Angular CLI来生成新组件。

    ng generate component home
    ng generate component about
    ng generate component contact
    
  4. 使用 <router-outlet>

    app.component.html中,使用 <router-outlet> 作为视图的占位符。

  5. 运行应用

    ng serve
    

4. Vue(使用Vue Router)

Vue Router是Vue的官方路由管理器。

  1. 创建Vue应用

    vue create my-spa
    cd my-spa
    vue add router
    
  2. 设置路由

    src/router/index.js文件中配置路由。

    import Vue from 'vue'
    import Router from 'vue-router'
    import Home from '../views/Home.vue'
    import About from '../views/About.vue'
    import Contact from '../views/Contact.vue'
    
    Vue.use(Router)
    
    const routes = [
      {
        path: '/',
        name: 'Home',
        component: Home
      },
      {
        path: '/about',
        name: 'About',
        component: About
      },
      {
        path: '/contact',
        name: 'Contact',
        component: Contact
      }
    ]
    
    const router = new Router({
      routes
    })
    
    export default router;
    
  3. 创建视图组件

    views目录中创建对应的组件文件。

  4. 使用 <router-view>

    App.vue文件中,使用 <router-view> 作为视图的占位符。

  5. 运行应用

    npm run serve
    

以上是使用三种不同框架构建多视图SPA的基本介绍,具体的代码实现和配置可能会根据框架版本和个人项目需求有所不同。这只是一个快速概览,实际开发过程中可能还需要考虑更多细节,如路由守卫、路由懒加载、嵌套路由等高级功能。

文章来源:https://blog.csdn.net/cz88888888666/article/details/135678098
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。