Vue学习笔记

作者: yanruoxin | 来源:发表于2018-07-27 13:47 被阅读4次
    • 主要针对笔者在学习中遇到的一些疑问进行记录

    Vue Study

    Prop
    • slot

      父组件模板的所有东西都会在父级作用域内编译;子组件模板的所有东西都会在子级作用域内编译

    • keep-alive

    要求被切换到的组件都有自己的名字,不论是通过组件的name选项还是局部/全局注册;

    Prop

    include:字符串或者正则表达式,只有匹配的组件会被缓存
    exclude:字符串或者正则表达式,任何匹配的组件都不会被缓存

    用法:

    • 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。和 transition相似,keep-alive是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在父组件链中。
    • is特性:
    Vuex
    • action 提交的是 mutation,而不是直接变更状态。
    • action 可以包含任意异步操作。
    • action 通过 store.dispatch 方法触发。
    Vue Router
    • this.$route.query 路由查询字符串
    • this.$route.hash 路由的hash值
    • this.$route.params 路由的的参数
    • router.push({ name: 'user', params: { userId }}) == router.push({ path: /user/${userId} })
    • 使用props将组件和路由解耦
        const User = {
            props: ['id'],
            template: '<div>User {{ id }}</div>'
        }
        const router = new VueRouter({
            routes: [
                { 
                    path: '/user/:id', 
                    component: User, 
                    props: true 
                },
                // 对于包含命名视图的路由,你必须分别为每个命名视图添加 `props` 选项:
                {
                    path: '/user/:id',
                    components: { default: User, sidebar: Sidebar },
                    props: { default: true, sidebar: false }
                }   
            ]
        })
    
    
    • History模式

    正常情况下都需要后端配合着使用

    • node js 使用的是connect-history-api-fallback
    导航守卫
    • router.beforeEach 注册一个全局前置守卫
    router.beforeEach((to,from,next)=>{
        //...   
    })
    

    1.next:Function 一定要通过调用该方法来resolve这个钩子。执行结果依赖next方法的调用参数;

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

    3.next(false)中断当前的导航。如果浏览器的URL改变了,那么URL地址会重置到from路由对应的地址;

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

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

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

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

    • 全局后置钩子:这些钩子不会接受next函数也不会改变导航本身

    • 路由独享的守卫 beforeEnter

    • 组件内的守卫:
      beforeRouteEnter(to,from,next)

    在渲染该组件的对应路由被confirm前调用,不能访问组件实例this,因为当守卫执行前,组件实例还没被创建

    • beforeRouteUpdate (to,from,next)

    在当前路由改变,但是该组件被复用时调用,可以访问组件实例this,

    eg: 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
    由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。

    • beforeRouteLeave(to,from,next)

    导航离开该组件的对应路由时调用,可以访问组件实例this

    完整的导航解析流程
    1. 导航被触发。
    1. 在失活的组件里调用离开守卫。
    2. 调用全局的 beforeEach 守卫。
    3. 在重用的组件里调用 beforeRouteUpdate 守卫 (2.2+)。
    4. 在路由配置里调用 beforeEnter。
    5. 解析异步路由组件。
    6. 在被激活的组件里调用 beforeRouteEnter。
    7. 调用全局的 beforeResolve 守卫 (2.5+)。
    8. 导航被确认。
    9. 调用全局的 afterEach 钩子。
    10. 触发 DOM 更新。
    11. 用创建好的实例调用 beforeRouteEnter 守卫中传给 next 的回调函数。
    路由元信息
    • 常常被用来验证登录权限以及设置页面的title
    const router = new VueRouter({
      routes: [
        {
          path: '/foo',
          component: Foo,
          children: [
            {
              path: 'bar',
              component: Bar,
              // a meta field
              meta: { 
                requiresAuth: true,
                title:'Bar page'
                
              }
            }
          ]
        }
      ]
    })
    

    一个路由匹配到的所有路由记录会暴露在route对象的route.matched数组

    router.beforeEach((to, from, next) => {
      if (to.matched.some(record => record.meta.requiresAuth)) {
        // this route requires auth, check if logged in
        // if not, redirect to login page.
        if (!auth.loggedIn()) {
          next({
            path: '/login',
            query: { redirect: to.fullPath }
          })
        } else {
          next()
        }
      } else {
        next() // 确保一定要调用 next()
      }
    })
    
    数据获取
    • 导航完成之后获取

    先完成导航,然后在接下来的组件生命周期钩子中获取数据。在数据获取期间显示“加载中”之类的指示。

    • 导航完成之前获取

    导航完成前,在路由进入的守卫中获取数据,在数据获取成功后执行导航。

    从技术角度讲,两种方式都不错 —— 就看你想要的用户体验是哪种。

    相关文章

      网友评论

        本文标题:Vue学习笔记

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