Vue04路由--SPA+ 使用路由建立多视图单页应用+router-link相关属性+【面试题:js中const,var,let区别】

简介: Vue04路由--SPA+ 使用路由建立多视图单页应用+router-link相关属性+【面试题:js中const,var,let区别】

1 vue中文件及文件夹命名规范


1.1.命名法

驼峰式命名法(camelCase)

短横线命名(kebab-case)全小写

帕斯卡命名法(PascalCase)


1.2.文件夹命名

kebab-case

尽量使用名词,尽量使用一个单词


1.3.*.js文件命名规范

3.1 所有模块的主文件index.js全小写

3.2 属于组件的.js文件,使用PascalBase风格

3.3 其他类型的.js文件,使用kebab-case风格


1.4.*.vue文件命名规范

除index.vue之外,其他.vue文件统一用PascalBase风格


1.5.*.less文件命名规范

统一使用kebab-case命名风格


前三点比较重要,需要记住!!!


附录一:.less为后缀的文件是什么

1、less是什么:LESS 为 Web 开发者带来了福音,它在 CSS 的语法基础之上,引入了变量,Mixin(混入),

运算以及函数等功能,大大简化了 CSS 的编写,并且降低了 CSS 的维护成本,就像它的名称所说的那样,LESS 可以让我们用更少的代码做更多的事情。

2、为什么有less:CSS 是一门非程序式语言,CSS 需要书写大量看似没有逻辑的代码,不方便维护及扩展,不利于复用

3、less最最最最最最简单实例:使用@符号来定义变量


2. SPA


2.1 SPA简介

单页Web应用(single page application,SPA),就是只有一个Web页面的应用,是加载单个HTML页面,并在用户与应用程序交互时动态更新该页面的Web应用程序


单页面应用程序:

只有第一次会加载页面, 以后的每次请求, 仅仅是获取必要的数据.然后, 由页面中js解析获取的数据, 展示在页面中


传统多页面应用程序:

对于传统的多页面应用程序来说, 每次请求服务器返回的都是一个完整的页面


优势

减少了请求体积,加快页面响应速度,降低了对服务器的压力

更好的用户体验,让用户在web app感受native app的流畅


2.2 SPA技术点

ajax

锚点的使用(window.location.hash #)(页面内定位的技术)

hashchange 事件 window.addEventListener("hashchange",function () {})

hashchange事件是html5新增的api,用来监听浏览器链接的hash值变化。当URL的片段标识符更改时,将触发hashchange事件


3. 使用路由建立多视图单页应用


3.1 引入依赖库

//建立一个基本html项目,创建一个demo页面并引入一下js库文件
<script src="js/vue.js"></script>
<script src="js/vue-router.min.js"></script>

3.2 创建自定义组件

创建vue组件有两种方式:


var MyComonent = Vue.component("button-counter", {...});

创建一个vue组件并赋给MyComponent变量

const Home = Vue.extend({});

extend是构造一个组件的语法器. 你给它参数,他给你一个组件,然后这个组件你可以作用到Vue.component这个全局注册方法里,也可以在任意vue模板里使用

【面试题】:js中const,var,let区别?分别写一个例子

1.变量提升:var存在变量提升,而let与const不存在变量提升,即在变量只能在声明之后使用,否在会报错。


2.重复声明:var定义的变量可以声明多次,const和let不允许重复声明变量


3.给全局添加属性:浏览器的全局对象是window,Node的全局对象是global。var声明的变量为全局变量,并且会将该变量添加为全局对象的属性,但是let和const不会。


4.暂时性死区: 在使用let、const命令声明变量之前,该变量都是不可用的。这在语法上,称为暂时性死区。使用var声明的变量不存在暂时性死区。


5.初始值设置: 在变量声明时,var 和 let 可以不用设置初始值。而const声明变量必须设置初始值。


6.块级作用域: 块作用域由 { }包括,let和const具有块级作用域,var不存在块级作用域。块级作用域解决了ES5中的两个问题:


内层变量可能覆盖外层变量

用来计数的循环变量泄露为全局变量

//创建一个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>'
});

3.3 创建路由

3.3.1 什么是路由

vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。

传统的页面应用,是用一些超链接来实现页面切换和跳转的。在vue-router单页面应用中,则是路径之间的切换,实际上就是组件的切换。

路由就是SPA(单页应用)的路径管理器。再通俗的说,vue-router就是我们WebApp的链接路径管理系统。


route和router的区别


route:路线

router:路由器

路由器中包含了多个路线

3.3.2 定义路由

//定义路由,"/"代表根路径,路由中可以使用name属性,一遍情况不建议使用
var routes = [
    {path: '/home',component: Home},
    {path: '/about',component: About}
];
//创建路由器实例
const router = new VueRouter({
    routes: routes
});

3.4 创建和挂载根实例

使用路由后,Vue实例的创建于以前会有一定的区别,原来使用el属性指定边界,使用路由后需要使用Vue实例$mount方法挂载根实例


//创建和挂载根实例
var vm = new Vue({
    //el: '#app',
    //将路由放入vue实例
    router: router,
    data: {
        ts: new Date().getTime()
    }
}).$mount("#app");

3.5 使用RouterLink和RouterView组件导航与显示

<div>
    <router-link to="/home">go to Home</router-link>
    <router-link to="/about">go to aboue</router-link>
</div>
<div>
     <router-view></router-view>
</div>

路由内容显示区域。


4. router-link相关属性


4.1 to

表示目标路由的链接

Home

Home

上面的示例已经使用,to既可以使用字符串,也可以使用js表达式


4.2 replace

设置 replace 属性的话,当点击时,会调用 router.replace() 而不是 router.push(),导航后不会留下 history 记录。

<router-link :to="{ path: '/home'}" replace></router-link>

如果配置了replace,则在点击该链接,将会导致history记录被清空,不能再执行回退。


vue中导航中的后退-前进-编程式导航


this.$router.go(-1) :代表着后退
this.$router.go(1):代表着前进
切换到path为/home的路由
this.$router.push({    
       path:'/home'
});
//或者使用path,推荐path
this.$router.push({    
       path:'/home'
});

示例一:编程式前进后退按键


1)在页面上加入前进和后退按钮,

<p>
    <button @click="previous">前进</button>
    <button @click="next">后退</button>
</p>

2)添加事件处理程序

methods: {
    //前进
    previous: function() {
        this.$router.go(1);
    },
    //后退
    next: function() {
        this.$router.go(-1);
    }
}

vue的 $

除了数据属性,Vue 实例还暴露了一些有用的实例属性与方法。它们都有前缀 $,以便与用户定义的属性区分开


示例二:切换到指定路由:


添加一个“回家”按钮。

<button @click="gotohome">回家</button>
gotohome: function() {
    console.log("go to home");
    this.$router.push({
        path: '/home'
    });
}

示例三,设置默认显示的组件


这个很简单,只要将需要默认显示的组件对应的路由的path设置为"/"即可

/定义路由表
var routes = [
    //默认显示home
    {path:'/', component:Home}, 
    {path:'/home', component:Home},
    {path:'/about', component:About}
];

示例四:


如果配置了replace,则在点击该链接,将会导致history记录被清空,不能再执行回退。


Home

加入replace属性,修改为:

<router-link to="/home" replace>Home</router-link>

通过测试可以看到,点击home后,history记录被清空。所以一般不用。


4.3 append

设置 append 属性后,则在当前 (相对) 路径前添加基路径。例如,我们从 /a 导航到一个相对路径 b,如果没有配置 append,则路径为 /b,如果配了,则为 /a/b (路径追加)

<router-link :to="{ path: 'relative/path'}" append></router-link>

4.4 tag

默认渲染为标签,有时候想要  渲染成某种标签,例如

  • 。 于是我们使用 tag prop 类指定何种标签,同样它还是会监听点击,触发导航。
  • (如果不指定tag,默认渲染为a标签)

    <router-link to="/foo" tag="li">foo</router-link>
    <!-- 渲染结果 -->
    <li>foo</li>

    4.5 active-class

    设置链接激活时使用的 CSS 类名


    4.6 exact-active-class

    配置当链接被精确匹配的时候应该激活的class


    4.7 event

    声明可以用来触发导航的事件。可以是一个字符串或是一个包含字符串的数组。

    <router-link v-bind:to = "{ path: '/route1'}" event = "mouseover">Router Link 1</router-link>
    相关文章
    |
    1天前
    |
    自然语言处理 JavaScript 前端开发
    当面试官再问我JS闭包时,我能答出来的都在这里了。
    闭包(Closure)是前端面试中的高频考点,广泛应用于函数式编程中。它不仅指函数内部定义的函数,还涉及内存管理、作用域链和垃圾回收机制。闭包可以让函数访问其外部作用域的变量,但也可能引发内存泄漏等问题。通过合理使用闭包,可以实现模块化、高阶函数和回调函数等应用场景。然而,滥用闭包可能导致代码复杂度增加、调试困难以及潜在的性能问题。为了避免这些问题,开发时应谨慎处理闭包,避免不必要的嵌套,并及时清理不再使用的变量和监听器。
    当面试官再问我JS闭包时,我能答出来的都在这里了。
    |
    7天前
    |
    JavaScript 前端开发 安全
    【JavaScript】深入理解 let、var 和 const
    掌握这些关键字的使用可以提高代码的可读性和可维护性,避免潜在的变量提升和作用域问题。希望本文能帮助您更好地理解和应用 JavaScript 中的变量声明方式,编写出更高质量的代码。
    48 20
    |
    3月前
    |
    JavaScript 前端开发 API
    Vue 3 中 v-model 与 Vue 2 中 v-model 的区别是什么?
    总的来说,Vue 3 中的 `v-model` 在灵活性、与组合式 API 的结合、对自定义组件的支持等方面都有了明显的提升和改进,使其更适应现代前端开发的需求和趋势。但需要注意的是,在迁移过程中可能需要对一些代码进行调整和适配。
    167 60
    |
    2月前
    |
    前端开发 API 开发者
    Next.js 实战 (五):添加路由 Transition 过渡效果和 Loading 动画
    这篇文章介绍了Framer Motion,一个为React设计的动画库,提供了声明式API处理动画和页面转换,适合创建响应式用户界面。文章包括首屏加载动画、路由加载Loading、路由进场和退场动画等主题,并提供了使用Framer Motion和next.js实现这些动画的示例代码。最后,文章总结了这些效果,并邀请读者探讨更好的实现方案。
    |
    3月前
    |
    JSON JavaScript 前端开发
    [JS]面试官:你的简历上写着熟悉jsonp,那你说说它的底层逻辑是怎样的?
    本文介绍了JSONP的工作原理及其在解决跨域请求中的应用。首先解释了同源策略的概念,然后通过多个示例详细阐述了JSONP如何通过动态解释服务端返回的JavaScript脚本来实现跨域数据交互。文章还探讨了使用jQuery的`$.ajax`方法封装JSONP请求的方式,并提供了具体的代码示例。最后,通过一个更复杂的示例展示了如何处理JSON格式的响应数据。
    57 2
    [JS]面试官:你的简历上写着熟悉jsonp,那你说说它的底层逻辑是怎样的?
    |
    3月前
    |
    缓存 前端开发 JavaScript
    JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式
    本文深入解析了JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式(Hash路由和History路由)、优点及挑战,并通过实际案例分析,帮助开发者更好地理解和应用这一关键技术,提升用户体验。
    124 1
    |
    3月前
    |
    JavaScript 前端开发 安全
    ECMAScript 6(以下简称 ES6)的出现为 JavaScript 带来了许多新的特性和改进,其中 let 和 const 是两个非常重要的关键字。
    ES6 引入了 `let` 和 `const` 关键字,为 JavaScript 的变量管理带来了革新。`let` 提供了块级作用域和暂存死区特性,避免变量污染,增强代码可读性和安全性;`const` 用于声明不可重新赋值的常量,但允许对象和数组的内部修改。两者在循环、函数内部及复杂项目中广泛应用,有助于实现不可变数据结构,提升代码质量。
    46 5
    |
    4月前
    |
    资源调度 JavaScript 前端开发
    路由管理:Vue Router的使用和配置技巧
    【10月更文挑战第21天】路由管理:Vue Router的使用和配置技巧
    83 3
    |
    4月前
    |
    JavaScript 前端开发 开发者
    Vue v-for 进阶指南:in 与 of 的区别及应用场景 | 笔记
    Vue.js 中的 v-for 是强大的遍历指令,但其中的 in 和 of 关键字往往被开发者忽视。尽管它们的用法相似,但适用的场景和数据结构却各有不同。本文将详细探讨 v-for 中 in 和 of 的区别、适用场景以及在实际开发中的最佳使用时机。通过理解它们的差异,你将能够编写更加高效、简洁的 Vue.js 代码,灵活应对各种数据结构的遍历需求。
    179 6
    |
    4月前
    |
    缓存 JavaScript
    Vue 中 computed 与 method 的区别
    【10月更文挑战第15天】computed 和 method 是 Vue 中两个重要的选项,它们在功能和特点上存在着明显的区别。理解并合理运用它们的区别,可以帮助我们构建更高效、更具可维护性的 Vue 应用。在实际开发中,要根据具体情况灵活选择使用,以满足不同的需求。
    82 2