# 面试题一

# 1.vue-router 的动态路由匹配以及使用

--在router目录下的index.js文件中,对path属性加上/:id。
--使用router对象的params.id

router-link 组件支持用户在具体有路由功能的应用中(点击)导航。 属性(props)

  1. to 通过 to 属性指定目标地址。
<router-link :to="home">Home</router-link>
<router-link :to="{ path:'home'}">Home</router-link>
//命名路由
<router-link :to="{ name: 'user', params: {userId: 123} }">Home</router-link>
//带查询参数,下面的结果为/register?plan=private-->
<router-link :to="{ path: 'register', query: {plan: 'private'}}"
  >Register</router-link
>
  1. replace 调用 router.replace()导航后不会留下 history 记录 也就是不能回退到上一个页面
<router-link :to="{path: '/abc'}" replace>ABC</router-link>
  1. append 在当前路径前添加基路径,例如,我们从/a 导航到一个相对路径 b,如果没有配置 append,则路径为/b,如果配了,则为/a/b
<router-link to="b" append>Home</router-link>
  1. tag 转化为我们想要的任意标签 同样它还是会监听点击,触发导航。
<router-link to="/foo" tag="li">FOO</router-link>
// 渲染结果
<li>FOO</li>
  1. active-class 设置链接激活时使用的 css 类名。默认值可以通过路由的构造选项 linkActiveClass 来全局配置, 默认值为
‘router-link-active‘
        export default New Router({
                linkActiveClass: ‘active‘
        })

6.exact 精准匹配链接激活时使用的 css 类名默认值可以通过路由的构造选项 linkExactActiveClass 来全局配置,

<!-- 这个链接只会在地址为 / 的时候被激活 -->
<router-link to="/" exact></router-link>

# 3.router 懒加载

    {
      path: '/vantlist',
      name: 'vantlist',
      component: () => import('./views/VantList.vue'),
    },

# 4.vue-router 两种模式区别及使用注意事项

  • hash vue-router 默认的是 hash 模式—使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变的时候,页面不会重新加载,也就是单页应用了,当#后面的 hash 发生变化,不会导致浏览器向服务器发出请求,浏览器不发出请求就不会刷新页面,并且会触发 hasChange 这个事件,通过监听 hash 值的变化来实现更新页面部分内容的操作
  • history 主要使用 HTML5 的 pushState()和 replaceState()这两个 api 来实现的,pushState()可以改变 url 地址且不会发送请求,replaceState()可以读取历史记录栈,还可以对浏览器记录进行修改

window.history.pushState(stateObject, title, URL) window.history.replaceState(stateObject, title, URL)

# 5.token

  • Token 的引入:Token 是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token 便应运而生。

  • 2、Token 的定义:Token 是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个 Token 便将此 Token 返回给客户端,以后客户端只需带上这个 Token 前来请求数据即可,无需再次带上用户名和密码。

  • 3、使用 Token 的目的:Token 的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。

# 6.vuex 是什么?什么是单向数据流

  • Vuex 是 vue 框架中状态管理。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
  • 单向数据流指只能从一个方向来修改状态。

# 7.使用 vuex 的核心概念

State:提供一个响应式数据; Getter:借助 Vue 的计算属性 computed 来实现缓存; Mutation;更改 state 方法; Action:触发 mutation 方法; Module:Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块

# 8.如何在组件中去使用 vuex 的值和方法?

  • 直接获取、修改:
//state
this.$store.state.count;
//getter
this.$store.getters.count;
//调用 action 修改 state 值,不带参数
this.$store.dispatch('increment');
//调用 action 修改 state 值,带参数
this.$store.dispatch('increment', { value: 123 });
  • 通过 map 辅助函数获取、修改 vuex:
/**
 *  vuex提供了三种辅助函数用于获取、修改vuex:
 *  mapState、mapGetters、mapActions
 *  即将vuex的变量或者方法映射到vue组件this指针上。
 */

# 9.在 vuex 中使用异步

在调用 vuex 中的方法 action 的时候,用 promise 实现异步修改

const actions = {
  asyncInCrement({ commit }, n) {
    return new Promise(resolve => {
      setTimeout(() => {
        commit(types.TEST_INCREMENT, n);
        resolve();
      }, 3000);
    });
  }
};

# 10.请说出 vue 常用指令

v-for 循环渲染列表
v-bind:动态绑定属性 v-on:绑定事件
v-model:双向数据绑定(多用于表单)
v-if/v-show:控制元素的显示与隐藏

# 11.vue 常用的修饰符

修饰符

事件修饰符

.stop:阻止事件冒泡 .prevent:阻止默认行为
.self:只有事件在元素本身时触发回调 .once:只触发一次

键盘修饰符

.enter .tab .delete (捕获“删除”和“退格”键)
.esc .space .up .down .left .right

# 12.watch methods 和 computed 区别

  • watch:为了监听某个响应数据的变化 应用场景:值改变执行逻辑
  • computed:自动监听依赖值的变化 可以缓存值 简化模板内复杂运算 应用场景:只需要动态值
  • method:方法体 可以接受参数

# 13.route 与 router 的区别

1.route 是路由信息对象 包含属性配置项 path params hash query fullPath name children

const router = new VueRouter({
  routes: [
    // 下面的对象就是路由记录
    {
      path: '/foo',
      component: Foo,
      children: [
        // 这也是个路由记录
        { path: 'bar', component: Bar }
      ]
    }
  ]
});

2.路由实例对象 一般调用实例方法 (包括钩子函数)

this.$router.push(location, onComplete?, onAbort?)
this.$router.push(location).then(onComplete).catch(onAbort)
this.$router.replace(location, onComplete?, onAbort?)
this.$router.replace(location).then(onComplete).catch(onAbort)
this.$router.go(n)
this.$router.back()
this.$router.forward()

# 14. 路由的跳转方式?vue-router 守卫(卫士)

1.声明式跳转 (标签式跳转) 导航式跳转(js 跳转) 2.router.beforeEach

const router = new VueRouter({ ... })

router.beforeEach((to, from, next) => {
  // ...
})

# 15.vuex有哪几种属性(核心概念)

State Action Mutation Getter Module

# 16.组件中的data为什么是一个函数

因为对象是一个引用数据类型,如果data是一个对象的情况下会造成所有组件共用一个data。而当data是一个函数的情况下,每次函数执行完毕后都会返回一个新的对象,这样的话每个组件都会维护一份独立的对象(data)

# 17.组件之间的传值方式 (父子组件之间 跨级组件之间 兄弟组件之间)

  1. props/$emit 父组件向子组件传值 props 子组件向父组件传值 $emit
  2. $emit/$on 这种方法是通过一个空的vue实例作为事件中心 用它来触发事件和监听事件,巧妙而轻量地实现任何组件间的通信
  3. vuex 单向数据流 只能通过一种方式改变数据状态
  4. $attrs/$listeners $attrs/$listeners是两个对象,$attrs里存放的是父组件中绑定的非props属性 $listeners里存放的是父组件绑定的非原生事件
  5. $ref $parent与$children 子组件或元素中定义ref属性 ref代表这个子组件或标签 通过$ref可获取

# 18.父子组件生命周期问题

  1. beforeCreate、created、beforeMounted是按顺序执行,由外到内;而mounted即最终的挂载阶段则是由内到外,先将子组件挂载到dom上,然后再是父组件
  2. 原因:既然组件之间存在父子关系,即父嵌套子,那么子组件就相当于父组件的一部分,那肯定要先将其一部分先挂载到dom上,然后再将整个父组件挂载上去。
  3. 总结:父子组件嵌套的生命周期其实都是 先父后子 然后 先子后父。后续再加入update和destroy的相关代码