zoukankan      html  css  js  c++  java
  • 三十分钟学会使用VUE搭建单页应用(SPA) 上

     

    今天我们将学习如何用VUE构建一个简单的单页应用(SPA)

    如果没有其他特殊声明,此教程中的VUE全部指的是VUE2.X版本

    预览

    让我们先看看最终的的单页程序是什么样子的

     
    成果

    阅读本教程之前希望你能有如下的基础知识:

    1. VUE基础
    2. 如何创建VUE组件

    如果你没有任何VUE或者VUE组件的知识,可以看我之前的文章

    VueJS简明教程(一)之基本使用方法

    使用Vue CLI 脚手架

    我们将使用VUE提供的脚手架模块Vue CLI,它可以使我们构建的程序兼容ES5版本的浏览器。

    NOTE: 当然这需要你在Node.js环境下进行开发,如果你还没有Node.js和NPM的基本知识,建议你花半个小时的时间配置好Node.js环境,相信我,很简单,百度随便一搜就出来一大把教程。

    如何你还没有安装Vue CLI,你可以用下面的命令进行安装

    npm install -g vue-cli

    NOTE: vue-cli已经有了3.0版本,改名为 @vue/cli, 但是当前vue-cli还是可以使用的,因为大部分用户还是在用vue-cli,所以本教程也继续使用vue-cli作为教学。

    安装完Vue CLI,我们将通过下面的命令构建我们的VUE项目。

    vue init webpack spa
    

    在上面的命令中,我们说明一下webpackspa这两个参数.

    Webpack是指你想用哪个脚手架模板,这里其实用很多模板供我们选择,比如简化版webpack-simple,具体使用方法可以参考这里

    SPA指的是你要把项目放在哪个文件夹里,这里就是SPA这个文件夹,如果没有系统会自动创建。

    运行上面这个命令后,会有一些选项让你选择,比如项目的名字等等,全部默认就可以。

    运行完上面的命令后,我们需要将当前路径改变到SPA这个文件夹内,然后安装需要的模块:

    //改变路径到spa文件夹下
    cd spa
    //安装所有项目需要的npm模块
    npm install
    //在开发环境下运行程序
    npm run dev
    

    当上面的命令运行起来的时候,用浏览器访问 http://localhost:8080 这个地址,我们会看到如下页面:

     
     

    VUE Router 的安装与配置

    在我们正式开始配置我们的单页程序之前,还有一个东西必须安装,vue-router。

    vue-router 是VUE官方提供的一个路由组件,专门用来构建VUE的单页程序,它包含如下一些特点:

    1. 支持嵌套路由
    2. 组件化路由配置
    3. 支持路由参数传递,支持通配符
    4. 比传统路由更加优化的导航控制
    5. 自动激活不同CSS样式
    6. 支持HTML5历史模式或哈希模式,支持IE9的自动回退功能
    7. 支持自定义的滚动轴特性

    如果你之前接触过angular router或者react-router,其实vue-router跟这两个非常相似。

    我们使用vue-router的原因就是它可以使我们的页面在前端就完成切换,而不是每次切换页面都要向服务器重新请求数据,重载页面。

    换句话说,一个单页程序就像是一个安装在本地APP一样,使用起来比传统的网页更加的流畅。

    我们可以用下面的命令安装vue-router.

    npm install vue-router --save
    

    现在让我们打开 src/main.js 文件夹把路由模块配置到我们的程序里.

    复制下面的内容并替换原来的 src/main.js:

    // 导入vue实例
    import Vue from 'vue'
    //导入 App 组件
    import App from './App'
    //导入 vue router
    import VueRouter from 'vue-router'
    //告诉vue使用vue-router路由组件
    Vue.use(VueRouter)
    //定义路由表
    const routes = []
    
    // 创建路由器实例,并且传入`routes`变量作为路由。
    // 你还可以传入别的参数,不过在这里尽量简单化就可以了
    const router = new VueRouter({
      routes, 
      mode: 'history'
    })
    //实例化Vue实例
    new Vue({
      //定义Vue绑定的跟元素
      el: '#app',
      //用<App/>代替根元素
      template: '<App/>',
      //声明App组件,这样上面的<App/>元素就可以生效
      components: { App },
      //将上面声明的路由器传递到根Vue实例
      router
    }).$mount('#app')//将这个实例挂载到id=app的根元素上
    

    让我们屡一下上面这一段代码,首先我们从node模块中导入了vue模块,接着我们又导入了App模块(这个是本地定义的模块)。

    这个App模块是我们在用vue cli脚手架创建这个项目的时候默认帮我们创建的,作为我们整个项目的根模块。

    之后,我们导入了vue-router, 接着我们使用vue的静态方法Vue.use,告诉vue我们将使用vue-router这个组件。

    在下一行,我们定义了一个空的routes数组变量。每一个routes里面的元素为一条路由信息。当前里面还没有路由信息,后续会添加。

    NOTE:注意英文中routes和router的区别,router是一个组件,route是一条路由信息,routes是由多个路由信息(route)组成的路由表。
    可以这么理解,把router当成一个工人,这个工人(router)拿到一张由很多路由信息(route)组成的路由表(routes),然后每一次用户请求页面变化时,工人(router)会逐条比对路由表(routes)上的路由信息(route),遇到第一条匹配的信息就将对应的页面反馈给用户

    接下来我们做的是创建我们的路由器(router),一个vue-router的实例,在这里我们给它传入了两个参数。

    第一个参数是一个我们之前声明过的数组变量,路由表(routers),另一个参数在声明一种路由模式,这种模式下我们在URL中不会看到前导的#号。
    有兴趣的读者可以试试不加这个参数观察一下URL有什么变化。同时,去掉这个#号也会使SEO优化更加好。

    最后,我们创建了一个Vue实例,传入了根组件<App/>,声明了Vue的挂载点。

    现在,如果我们重新运行这个程序,会发现页面没有任何变化。下面我们将会开始设置路由。

    我将会把路由管道标签(<router-view></router-view>)加入到根组件<App/>中,也就是当url符合某个路由信息(route)时,对应的组件就会被渲染(render)到这个路由管道标签内。

    现在打开src/App.vue文件,也就是根组件文件,用下面的内容替换原有的内容:

    <template>
      <div id="app">
      <!--路由管道标签,任何符合某一路由(route)信息的组件都会在这个标签内展示出来 -->
      <router-view></router-view>
      </div>
    </template>
    
    <script>
    export default {
      name: 'app',
    }
    </script>
    <!-- css格式 -->
    <style>
    #app {
      font-family: 'Avenir', Helvetica, Arial, sans-serif;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
      text-align: center;
      color: #2c3e50;
      margin-top: 60px;
    }
    </style>
    

    上面的代码和用vue-cli自动生成的代码有几点不一样:

    1. 多了 router-view 标签用来渲染符合路由条件的组件
    2. 删除了导入hello组件的语句import hello
    3. 删除了script中关于component的定义
    4. 删除了默认的component是因为我们不需要了,因为我们在上面已经定义了路由管道标签<router-view>

    这时候我们在重新运行程序,会发现是空白页面

    路由初始化

    这时候我们需要定义Hello模块作为我们的Home页面,然后把相应的路由信息(route)加到路由表(routes)中

    打开main.js文件,把routes变量修改成如下形式并导入Hello组件:

    //导入hello组件
    import Hello from './components/HelloWorld'
    //定义路由表
    const routes = [
    //将根URL加入到路由表并声明对应Hello组件.
    { path: '/', component: Hello }
    ]
    

    在上面的代码中我们引入了脚手架默认添加的Hello组件,并且将根URL / 对应到了Hello组件上,这时候如果我们重新运行程序,会像下面这样:

     
     

    上面这个图片里,Vue的logo已经不见了,这是因为之前在APP组件中已经将显示VUE logo图标的代码删除了。

    现在,让我们定义更多的路由,在这之前先再创建一个组件。

    在 src/somponents 文件夹下创建一个 About.vue 文件,然后把下面的代码放进去。

    <template>
      <div id="about">
        When you have a great story about how your product or service was built to change lives, share it. The "About Us" page is a great place for it to live, too. Good stories humanize your brand, providing context and meaning for your product. What’s more, good stories are sticky -- which means people are more likely to connect with them and pass them on.
      </div>
    </template>
    
    <script>
    export default {
      name: 'about'
    }
    </script>
    <style>
    #about {
      font-family: 'Avenir', Helvetica, Arial, sans-serif;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
      text-align: center;
      color: #2c3e50;
      margin-top: 60px;
    }
    </style>
    

    让我们来看看上面这个About组件,这个组件里面只有简单的一段话,当URL正好对应这个组件的时候,它就会被渲染到<router-view>标签里面。

    在这之前,我们需要在路由表中加入这个组件对应的路由。

    打开 main.js 然后把路由表(routes)改成如下形式。

    //导入Hello组件
    import Hello from './components/HelloWorld'
    //导入Aboiut组件
    import About from './components/About'
    //定义路由表
    const routes = [
    //对应Hello组件的路由地址
    { path: '/', component: Hello },
    //对应About组件的路由地址
    { path: '/about', component: About }
    ]
    

    上面代码唯一的改动就是增加了About组件的引入和对应的路由信息。

    这时候如果我们在浏览器中访问 http://localhost:8080/about 这个地址,我们就会看到刚刚我们在About组件中写的那段话。

    在页面中使用<router-link>标签

    但是我们不能总是手工在浏览器中输入地址去切换页面,所以我们需要用到另一个路由器标签<router-link></router-link>

    打开 App.vue 文件,然后在<router-view>标签上面加入两个<router-link>标签:

    <router-link v-bind:to="'/'">Home</router-link>
    <router-link v-bind:to="'/about'">About</router-link>
    

    上面两个标签的作用就是创建两个指向对应URL的超链接,用来做动态的路由转换 (不用重载页面的页面转换)。

    这时候如果你重新启动程序,会注意到页面上多了两个可以点击的超链接,点击任意一个,页面和URL也会随着变动,而且页面并没有重载。

    程序看起来是这个样子的:

     
     

    总结

    好了,这就是如何构建一个单页程序(SPA)。

    当然,这个程序也可以构建的更加复杂一些,比如:

    1. 添加更多的路由
    2. 通过路由传递参数信息
    3. 使用路由守护(route guards)来在保证没有权限的用户不能访问特定页面

    在下一个教程中,我会分别介绍路由的参数传递和路由守护功能。



    转自作者:景行_白色极限
    链接:https://www.jianshu.com/p/1a7bbdd8ca4e
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
     
  • 相关阅读:
    给DOM元素绑定click事件也有学问
    几个JavaScript的浏览器差异处理问题
    CSS样式权重的级联cascade的概念
    你知道HTML标签设计的本意吗?
    一些奇怪的JavaScript试题
    JavaScript如何计算两个日期间的时间差
    Vim默认开启语法标识功能
    理解Python中的继承规则和继承顺序
    An Easy Introduction to CUDA C and C++
    super()
  • 原文地址:https://www.cnblogs.com/vagrant2814154894/p/12321925.html
Copyright © 2011-2022 走看看