vue相关

作者: 蛋壳不讲武德 | 来源:发表于2019-11-20 11:58 被阅读0次

    1. 对MVVM开发模式的理解

    MVVM分为Model、View、ViewModel三者。

    Model 代表数据模型,数据和业务逻辑都在Model层中定义;

    View 代表UI视图,负责数据的展示;

    ViewModel 负责监听 Model 中数据的改变并且控制视图的更新,处理用户交互操作;

    Model 和 View 并无直接关联,而是通过 ViewModel 来进行联系的,Model 和 ViewModel 之间有着双向数据绑定的联系。因此当 Model 中的数据改变时会触发 View层的刷新,View 中由于用户交互操作而改变的数据也会在 Model 中同步。

    这种模式实现了 Model 和 View 的数据自动同步,因此开发者只需要专注对数据的维护操作即可,而不需要自己操作 dom。

    2. 简述Vue的响应式原理

    当一个Vue实例创建时,vue会遍历data选项的属性,用 Object.defineProperty 将它们转为 getter/setter并且在内部追踪相关依赖,在属性被访问和修改时通知变化。

    每个组件实例都有相应的 watcher 程序实例,它会在组件渲染的过程中把属性记录为依赖,之后当依赖项的 setter 被调用时,会通知 watcher 重新计算,从而致使它关联的组件得以更新。

    3. 如何优化SPA应用的首屏加载速度慢的问题?

    将公用的JS库通过script标签外部引入,减小app.bundel的大小,让浏览器并行下载资源文件,提高下载速度;

    在配置 路由时,页面和组件使用懒加载的方式引入,进一步缩小 app.bundel 的体积,在调用某个组件时再加载对应的js文件;

    加一个首屏 loading 图,提升用户体验;

    4.导航守卫

    (1).全局前置守卫

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

    当一个导航触发时,全局前置守卫按照创建顺序调用。守卫是异步解析执行,此时导航在所有守卫 resolve 完之前一直处于 等待中

    每个守卫方法接收三个参数:

    to: Route: 即将要进入的目标 路由对象

    from: Route: 当前导航正要离开的路由

    next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。

    next(): 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。

    next(false): 中断当前的导航。如果浏览器的 URL 改变了 (可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址。

    next('/') 或者 next({ path: '/' }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。你可以向 next 传递任意位置对象,且允许设置诸如 replace: true、name: 'home' 之类的选项以及任何用在 router-link 的 to prop 或 router.push 中的选项。

    next(error): (2.4.0+) 如果传入 next 的参数是一个 Error 实例,则导航会被终止且该错误会被传递给 router.onError() 注册过的回调。

    确保要调用 next 方法,否则钩子就不会被 resolved。

    (2)全局解析守卫

    在 2.5.0+ 你可以用 router.beforeResolve 注册一个全局守卫。这和 router.beforeEach 类似,区别是在导航被确认之前,同时在所有组件内守卫和异步路由组件被解析之后,解析守卫就被调用。

    (3).全局后置钩子

    你也可以注册全局后置钩子,然而和守卫不同的是,这些钩子不会接受 next 函数也不会改变导航本身:router.afterEach((to,from)=>{// ...})

    (4).路由独享的守卫

    你可以在路由配置上直接定义 beforeEnter 守卫:

    constrouter=newVueRouter({routes:[{path:'/foo',component:Foo,beforeEnter:(to,from,next)=>{// ...}}]})

    这些守卫与全局前置守卫的方法参数是一样的。

    (5).组件内的守卫

    constFoo={template:`...`,

    beforeRouteEnter(to,from,next){// 在渲染该组件的对应路由被 confirm 前调用// 不!能!获取组件实例 `this`// 因为当守卫执行前,组件实例还没被创建},

    beforeRouteUpdate(to,from,next){// 在当前路由改变,但是该组件被复用时调用// 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,// 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。// 可以访问组件实例 `this`},

    beforeRouteLeave(to,from,next){// 导航离开该组件的对应路由时调用// 可以访问组件实例 `this`}}

    beforeRouteEnter 守卫 不能 访问 this,因为守卫在导航确认前被调用,因此即将登场的新组件还没被创建。

    相关文章

      网友评论

          本文标题:vue相关

          本文链接:https://www.haomeiwen.com/subject/pfcoictx.html