1、Vue-router 路由跳转和 location.href 区别?
- 使用 location.href= /url 来跳转,简单方便,但是刷新了页面;
- 使用 history.pushState( /url ) ,无刷新页面,静态跳转;
- 引进 router ,然后使用 router.push( /url ) 来跳转,使用了 diff 算法,实现了按需加载,减少了 dom 的消耗。其实使用 router 跳转和使用 history.pushState() 没什么差别的,因为vue-router就是用了 history.pushState() ,尤其是在history模式下。
2、vuex是什么?
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 + 库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
3、vuex实现原理?
1. store是怎么注册的?
- Vuex在vue的生命周期中的初始化钩子前插入一段Vuex初始化代码,给Vue的实例注入一个$store的属性,这就是为什么我们在Vue的组件中可以通过this.$store.xxx,访问到Vuex的各种数据和状态
2. mutation,commit是怎么实现的?
- mutation 在源码中:registerMutation 是对store的mutation的初始化。接受4个参数,store为当前Store实例,type为mutation的key,handler为mutation执行的回调函数,path为当前模块的路径
- mutation的作用就是同步修改当前模块的state
- 函数首先通过type拿到对应的mutation对象数组,
- 然后把一个mutation的包装函数push到这个数组中
- 这个函数接收一个参数payload,这就是我们在定义mutation的时候接收的额外参数
- 这个函数执行的时候会调用mutation的回调函数
- 并通过getNestedState(store.state,path)方法得到当前模块的state
- 和playload一起作为回调函数的参数
- commit 支持3个参数,type表示mutation的类型,payload表示额外的参数,根据type查找对应的mutation,找不到就输出一条错误信息,否则遍历这个type对应的mutation对象数组,执行handler(payload)方法,这个方法就是之前定义的wrappedMutationHandler(handler), 执行它就相当于执行了registerMutation注册的回调函数
4、什么情况下使用vuex?
Vuex 可以帮助我们管理共享状态,并附带了更多的概念和框架。这需要对短期和长期效益进行权衡。如果不打算开发大型单页应用,使用 Vuex 可能是繁琐冗余的。确实是如此——如果您的应用够简单,最好不要使用 Vuex。一个简单的 store 模式就足够您所需了。但是,如果需要构建一个中大型单页应用,很可能会考虑如何更好地在组件外部管理状态,Vuex 将会成为自然而然的选择。
5、vuex辅助函数有哪些?
Vuex提供了mapState、MapGetters、MapActions、mapMutations等辅助函数给开发在vm中处理store
6、vuex属性包含哪些?
有五种,分别是 State、Getter、Mutation 、Action、Module
- state => 基本数据(数据源存放地)
- getters => 从基本数据派生出来的数据
- mutations => 提交更改数据的方法,同步
- actions => 像一个装饰器,包裹mutations,使之可以异步。
- modules => 模块化Vuex
7、mutation和action有什么区别?
- Mutation专注于修改State,理论上是修改State的唯一途径;Action业务代码、异步请求。
- Mutation:必须同步执行;Action:可以异步,但不能直接操作State。
- 在视图更新时,先触发actions,actions再触发mutation
- mutation的参数是state,它包含store中的数据;action的参数是context,它是 state 的父级,包含 state、getters
8、vuex工作流程?
- 通过new Vuex.Store()创建一个仓库 state是公共的状态,state--->components渲染页面
- 在组件内部通过this.$store.state.属性 来调用公共状态中的state,进行页面的渲染。
- 当组件需要修改数据的时候,必须遵循单向数据流。通过this.$store.dispatch来触发actions中的方法
- actions中的每个方法都会接受一个对象 这个对象里面有一个commit方法,用来触发mutations里面的方法
- mutations里面的方法用来修改state中的数据 mutations里面的方法都会接收到2个参数 一个是store中的state,另外一个是需要传递的参数
- 当mutations中的方法执行完毕后state会发生改变,因为vuex的数据是响应式的 所以组件的状态也会发生改变
9、Vuex和单纯的全局对象有什么区别?
- Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。
- 不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样可以方便地跟踪每一个状态的变化,从而能够实现一些工具帮助更好地了解我们的应用。
10、Vuex的mutation为什么不能做异步操作?
- 原因是因为mutation必须是同步函数。这是因为Vuex的设计原则是通过mutation来改变状态,而状态改变后,视图会立即更新。如果mutation中是异步操作,那么当状态改变时,视图可能还没有更新完成,这会导致视图和状态不一致的情况。
- 另外,如果mutation中进行异步操作,那么就无法保证状态的改变是按照预期的顺序执行的,这可能会导致一些难以预料的问题。
- 如果需要进行异步操作,可以在action中进行。action可以包含任意异步操作,当异步操作完成后,再通过调用mutation来改变状态。这样可以保证状态的改变是按照预期的顺序执行的,同时也保证了视图和状态的一致性。
- 除了保证状态改变的一致性和可预测性,Vuex要求mutation必须是同步函数还有另一个重要的原因,那就是为了确保devtools中的时间旅行功能可以正常使用。