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