Vue中通过vue-router实现命名视图的问题


Posted in Javascript onApril 23, 2020

在用vue-router路由处理一些需求的时候 例如 有时需要同时同级展示多个组件 而不是嵌套展示
例如:创建一个布局 有侧导航和主内容两个视图 此时命名视图就派上用场了

在路由对象中 使用components属性 以使一个路径下可挂载多个子组件:
之后即可为每个要展示的组件指定一个名字
默认name为default 即 不设置名字

<script>
 var header={
  template:"<h1>头部</h1>"
 }
 var leftBox={
  template:"<h1>左侧边栏</h1>"
 }
 var mainBox={
  template:"<h1>主体</h1>"
 }

 // 创建路由对象
 var router=new VueRouter({
  routes:[
   // 使用components属性 一个路径下挂载多个子组件
   {path:"/",components:{
    // 默认展示的组件
    "default":header,
    // 为组件命名
    "left":leftBox,
    "main":mainBox
   }}
  ]
 })

 var vm=new Vue({
  el:'#app',
  data:{},
  methods:{},
  // 挂载路由对象
  router
 });
</script>

然后 在页面中使用<router-view>标签进行展示 在标签上指定name
若指定了name 那么该<router-view>只能放指定name的组件

<div id="app">
	<!-- 不指定name 则使用默认(default)的组件 -->
	<router-view></router-view>
	<!-- 为<router-view>指定name 该<router-view>只能放指定name的组件 -->
	<router-view name="left"></router-view>
	<router-view name="main"></router-view>
</div>

ps:下面介绍下vue-router的原理

更新视图但不重新请求页面,是前端路由原理的核心之一,目前在浏览器环境中这一功能的实现主要有2种方式,Hash模式和History模式:

(1)利用URL中的hash("#");

(2)利用History interface在HTML5中新增的方法;

1、Hash模式: 

      hash(#)是URL 的锚点,代表的是网页中的一个位置,单单改变#后的部分,浏览器只会滚动到相应位置,不会重新加载网页,也就是说 #是用来指导浏览器动作的,对服务器端完全无用,HTTP请求中也不会不包括#;同时每一次改变#后的部分,都会在浏览器的访问历史中增加一个记录,使用”后退”按钮,就可以回到上一个位置;

2、History模式: 

    HTML5 History API提供了一种功能,能让开发人员在不刷新整个页面的情况下修改站点的URL,就是利用 history.pushState API 来完成 URL 跳转而无须重新加载页面;

通常情况下,我们会选择使用History模式,原因就是Hash模式下URL带着‘#'会显得不美观;但实际上,这样选择一不小心也会出问题;比如:

但当用户直接在用户栏输入地址并带有参数时: 
Hash模式:xxx.com/#/id=5 请求地址为 xxx.com,没有问题; 
History模式: xxx.com/id=5 请求地址为 xxx.com/id=5,如果后端没有对应的路由处理,就会返回404错误; 

为解决这一问题,vue-router提供的方法是:

在服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是你 app 依赖的页面。 

给个警告,因为这么做以后,你的服务器就不再返回 404 错误页面,因为对于所有路径都会返回 index.html 文件。为了避免这种情况,你应该在 Vue 应用里面覆盖所有的路由情况,然后在给出一个 404 页面。或者,如果你使用 Node.js 服务器,你可以用服务端路由匹配到来的 URL,并在没有匹配到路由的时候返回 404,以实现回退。

到此这篇关于Vue中通过vue-router实现命名视图的问题的文章就介绍到这了,更多相关vue vue-router命名视图内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
jQuery实现表单input中提示文字value随鼠标焦点移进移出而显示或隐藏的代码
Mar 21 Javascript
javaScript基础语法介绍
Feb 28 Javascript
Node.js实现Excel转JSON
Apr 24 Javascript
解析javascript中鼠标滚轮事件
May 26 Javascript
JavaScript根据CSS的Media Queries来判断浏览设备的方法
May 10 Javascript
javascript实现去除HTML标签的方法
Dec 26 Javascript
VueJs单页应用实现微信网页授权及微信分享功能示例
Jul 26 Javascript
AngularJS实现的简单拖拽功能示例
Jan 02 Javascript
探索Vue高阶组件的使用
Jan 08 Javascript
教你如何编写Vue.js的单元测试的方法
Oct 17 Javascript
vue实现拖拽效果
Dec 23 Javascript
vue3.0实现插件封装
Dec 14 Vue.js
利用原生JS实现欢乐水果机小游戏
Apr 23 #Javascript
JS eval代码快速解密实例解析
Apr 23 #Javascript
浅谈vue权限管理实现及流程
Apr 23 #Javascript
js实现简单的贪吃蛇游戏
Apr 23 #Javascript
Vue Cli3 打包配置并自动忽略console.log语句的方法
Apr 23 #Javascript
vue项目打包之开发环境和部署环境的实现
Apr 23 #Javascript
javascript设计模式 ? 模板方法模式原理与用法实例分析
Apr 23 #Javascript
You might like
linux环境apache多端口配置虚拟主机的方法深入介绍
2013/06/09 PHP
php number_format() 函数通过千位分组来格式化数字的实现代码
2013/08/06 PHP
初识php MVC
2014/09/10 PHP
Yii实现多数据库主从读写分离的方法
2014/12/29 PHP
WordPress自定义时间显示格式
2015/03/27 PHP
php表单处理操作
2017/11/16 PHP
Laravel的Auth验证Token验证使用自定义Redis的例子
2019/09/30 PHP
jquery获取下拉列表的值为null的解决方法
2011/03/18 Javascript
无刷新预览所选择的图片示例代码
2014/04/02 Javascript
javascript 控制input只允许输入的各种指定内容
2014/06/19 Javascript
jquery表单对象属性过滤选择器实例分析
2015/05/18 Javascript
通过XMLHttpRequest和jQuery实现ajax的几种方式
2015/08/28 Javascript
javascript 动态脚本添加的简单方法
2016/10/11 Javascript
JS中split()用法(将字符串按指定符号分割成数组)
2016/10/24 Javascript
JavaScript函数基础详解
2017/02/03 Javascript
jquery实现倒计时小应用
2017/09/19 jQuery
微信小程序实现图片放大预览功能
2020/10/22 Javascript
jQuery选择器之基本过滤选择器用法实例分析
2019/02/19 jQuery
JS实现点餐自动选择框(案例分析)
2019/12/10 Javascript
js用正则表达式筛选年月日的实例方法
2021/01/04 Javascript
Eclipse + Python 的安装与配置流程
2013/03/05 Python
Python对文件操作知识汇总
2016/05/15 Python
Django开发中复选框用法示例
2018/03/20 Python
python 切换root 执行命令的方法
2019/01/19 Python
python实现将json多行数据传入到mysql中使用
2019/12/31 Python
开启Django博客的RSS功能的实现方法
2020/02/17 Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
2020/02/28 Python
sklearn的predict_proba使用说明
2020/06/28 Python
Python通过Schema实现数据验证方式
2020/11/12 Python
html5 Canvas画图教程(4)—未闭合的路径及渐变色的填充方法
2013/01/09 HTML / CSS
澳大利亚最大的百货公司:Myer
2018/12/21 全球购物
New Balance法国官方网站:购买鞋子和服装
2019/09/01 全球购物
小学开学典礼新闻稿
2015/07/17 职场文书
《清澈的湖水》教学反思
2016/02/17 职场文书
MongoDB balancer的使用详解
2021/04/30 MongoDB
MySQL池化框架学习接池自定义
2022/07/23 MySQL