Vue-router(基础)_滚动行为和history模式

摘要:
将历史记录模式更改为2。创建一个模拟演示的小示例(1)目录结构如下(2)。vue文件如下。js文件如下<关于我的页面<data(){return{}}}<data(){return{}}}<styletype=“text/css”scoped=“”>组件:

一、前言                                                                                   

                               1、滚动事件

                               2、h5 history模式

二、主要内容                                                                            

1、   (1)使用前度路由,当切换到新路由时,想要页面滚动到顶部,或者是保持原先滚动的位置,就像重新加载页面那样。vue-router的滚动行为,它让你可以自定义路由切换的时候页面如何滚动

但是:这个功能history.pushState 的浏览器中可以使用

   (2)这个滚动行为只能在h5的history模式下使用,在使用滚动行为的时候必须要先将浏览器的hash模式,改成history模式

2、创建一个小例子模拟演示

  (1)目录结构如下

  Vue-router(基础)_滚动行为和history模式第1张

  (2).vue文件如下.js文件如下

Vue-router(基础)_滚动行为和history模式第2张Vue-router(基础)_滚动行为和history模式第3张
<template>
    <div>关于我页面</div>
</template>
<script type="text/javascript">
    export default{
        name:'About',
        data(){
            return {

            }
        }

    }
</script>

<style type="text/css" scoped></style>
About.vue
Vue-router(基础)_滚动行为和history模式第4张Vue-router(基础)_滚动行为和history模式第5张
<template>
    <div>
        首页页面
    </div>
</template>

<script type="text/javascript">
    export default{
        name:'Home',
        data(){
            return {

            }
        }
    }
</script>

<style type="text/css" scoped=""></style>
Home.vue
Vue-router(基础)_滚动行为和history模式第6张Vue-router(基础)_滚动行为和history模式第7张
import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import Home from '@/components/Home'
import About from '@/components/About'
Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      name: 'Home',
      component: Home
    },
    {
        path:'/about',
        name:'Abut',
        component: About
    }
  ]
})
index.js

  (3)hash模式是一上来就加载所有的请求,当你在切换路由的时候,不会再对后端发起情求,不会重载页面

Vue-router(基础)_滚动行为和history模式第8张

     (2)在index.js中设置为history模式,发现当切换路由的时候,默认还是保持在上一个路由的位置(这个功能浏览器已经帮我们做好了)

  (3)现在要实现,切换路由的时候,页面停留在指定的位置

  (4)在切换路由的时候没有调用这个savedPosition,会跳到上一次加载那个页面的时候滚动到的那个位置

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import Home from '@/components/Home'
import About from '@/components/About'
Vue.use(Router)

export default new Router({
    mode:'history',
    scrollBehavior (to, from, savedPosition) {
              //只有调用了history.pushState()的时候才会触发这个方法,也就是当我们点击浏览器中的“<-” "->"的时候

             //用这个方法实现期望滚动到哪一位置,
             // return { x: 0, y: 400 }

             //判断如果滚动条的位置存在直接返回当前位置,否则返回到起点
             //savedPosition只有当用户点击前进后退,或者go(-1)的时候才会调用
             console.log(savedPosition)
             if(savedPosition){

                 return savedPosition;

             }else{
                 return {x:0,y:200}
             }

     
    },
  routes: [
    {
      path: '/',
      name: 'Home',
      component: Home
    },
    {
        path:'/about',
        name:'Abut',
        component: About
    }
  ]
})

3、history配合后端的例子

          01-使用本地服务器演示(使用npm run build打包编译之后--->cd dist文件下-->执行hs -o -p 8888),可以发现可以看到我们的页面,但是将这个地址复制到一个新的标签中打开出现404

  上面验证了使用history模式必须配合后端

  02-使用node, 在打包编译后的dist文件夹下新建一个server.js如下

const express = require('express')
const http = require('http')
const fs = require('fs')
const httpPort = 8088

//app.use(express.static(path.join(__dirname, 'dist')))
http.createServer((req, res) => {
    if(req.url.startsWith('/static/js') || req.url.startsWith('/static/css')){
      fs.readFile('.'+req.url, (err,data)=>{
          res.end(data)
      })

      return;
    }
  fs.readFile('index.html', 'utf-8', (err, content) => {
    if (err) {
      console.log('We cannot open "index.htm" file.')
    }

    res.writeHead(200, {
      'Content-Type': 'text/html; charset=utf-8'
    })

    res.end(content)
  })
}).listen(httpPort, () => {
  console.log('Server listening on: http://localhost:%s', httpPort)
})

启动服务器,将该访问地址拿到一个新的网页中一样可以渲染出来

4、原理:下面模拟了点击a标签变更地址栏的操作,但是必须在服务器环境下才能运行h5的history模式

 服务器代码:

Vue-router(基础)_滚动行为和history模式第9张Vue-router(基础)_滚动行为和history模式第10张
const http = require('http')
const fs = require('fs')
const httpPort = 8088

http.createServer((req, res) => {

 //读取你要渲染的页面
  fs.readFile('./03-history.html', 'utf-8', (err, content) => {
    if (err) {
      console.log('We cannot open "index.htm" file.')
    }

    res.writeHead(200, {
      'Content-Type': 'text/html; charset=utf-8'
    })
 
    res.end(content)
  })
}).listen(httpPort, () => {
  console.log('Server listening on: http://localhost:%s', httpPort)
})
history-server
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <a class="router-link" href="/">Home</a>
    <a class="router-link" href="/about">About</a>
    
    <div id="router-view">
        
    </div>

    <script type="text/javascript">
        //获取到上面两个a标签对象
        var aobj = document.querySelectorAll('a');
        var routerView = document.getElementById('router-view');

        function Content(href){
            switch (href){
                case '/':
                routerView.innerHTML = '<div>首页</div>';
                break;

                case '/about':
                routerView.innerHTML='<div>关于我们</div>'
                break;
            }
        }

        console.log(location.pathname) //使用window.location.pathname 拿到/url
        Content(location.pathname);//让一开始就出现内容

        for(var i=0; i<=aobj.length-1;i++){
            aobj[i].addEventListener('click',function(e){
                e.preventDefault();
                var href = e.target.getAttribute('href');
                //变更地址栏
                history.pushState({},'',href);
                Content(href);
            })
        }

    </script>
</body>
</html>

5、了解history.pushState()参考MDN:https://developer.mozilla.org/zh-CN/docs/Web/API/History_API

三、总结                                                                                  

免责声明:文章转载自《Vue-router(基础)_滚动行为和history模式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Yeoman安装和使用详解windows server 2019 安装WSL Ubuntu下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

vue 路由更新页面视图未更新问题

最近项目做面包屑的时候遇到一个问题就是路由变化的时候页面视图并没有发生变化,后来上网查,发现是vue-router的特性导致的。 vue-router的切换不同于传统的页面的切换。路由之间的切换,其实就是组件之间的切换,不是真正的页面切换。这也会导致一个问题,就是引用相同组件的时候,会导致该组件无法更新,也就是我们口中的页面无法更新的问题了。 而我正是因为...

Duilib的圆环形 进度条 实现(网易云信版本)

/** @file CircleProgress.h* @brief 圆环型进度条控件,圆环中间可以有文本(如85%)* @copyright (c) 2019-2022, NetEase Inc. All rights reserved* @author Xuhuajie* @date 2019/8/14*/ #ifndef UI_CONTROL_CIR...

vue+elementui 中 @keyup 键盘上下左右移动聚焦

            <template>             <el-table :data="CreditUnclearOutlineList" border style=" 100%" ref="table"> <el-table-co...

webpack3 + vue 添加 serviceWorker

新的vue脚手架已经可以自带pwa了,本文主要针对旧版的webpack。 先装三个插件: $npm i register-service-worker sw-precache-webpack-plugin webpack-pwa-manifest --save-dev 因为pwa主要用于生产,我们来动手改造 build/webpack.prod.conf....

whl包构建

安装依赖 pip install whell pip install twine 参数对应 标注*号的为重要参数 描述性参数 —— 提供包信息,供PiPy识别管理 描述性参数,只是作为包的信息用的,没有特殊作用,可有可无。 参数 类型 说明 *name str 包名称 *version str 包版本 *author str 程序的作者...

博客基础_django_python从入门到实践_添加主题_添加条目_编辑条目

 要求及文件   用户可以添加新主题,添加新条目,以及编辑既有条目    forms.py  urls.py  views.py  html    new_topic.html  new_entry.html    edit_entry.html 添加新主题 new_topic.html   topics.html   添加新条目 new_entry.ht...