_router - 更新日志

2.0.0(2020-08-06)

修复引入样式重复,去除 require.context

1.0.8(2020-08-03)

修改防止连点仅仅限制 push

1.0.7(2020-07-25)

增加点击tabbar监听

1.0.6(2020-07-16)

增加防止连点功能(防止用户多次快速点击多次执行路由方法导致多次进入同一页面)

1.0.5(2020-07-13)

增强错误提示

1.0.4(2020-07-02)

route 增加 type 属性,可在全局导航守卫中判断路由方式以便在操作后继续路由

1.0.3(2020-06-18)

修复部分情况下 pushPop 接受不到 pop 传参。增加 监听函数。修该在 H5 端会产生报错的示例

1.0.2(2020-06-02)

新增 pushPop 方法支持 pop 传参

1.0.1(2020-02-11)

修复极少数情况下 $route.query 获取不到参数

1.0.0(2019-12-11)

欢迎使用 uni_router.js

对 uni-app 中的路由 api 进行了简单封装,定义了全局导航守卫方法、路由状态保存、错误捕获等。使用起来及其方便,无需配置路由表, 也无需进行二次封装。代码也不复杂,只有不到100行,比较适合中小型项目快速开发。很实用。如有BUG,还请不吝指出,非常感谢。


使用

// 在 main.js 中注册
import Vue from 'vue'
import App from '@/App'
import $router, { $route } from '@/common/js/uni_router.js'

$router.beforeEach = (to, next) => { // 注册全局前置守卫
    console.log('全局前置守卫', to)
    if (to.path.includes('/test')) {
        // 可以通过传一个回调给 next 来访问 $router 实例, 会返回一个 reject('在全局前置守卫 next 中重定向路由')
        next(vm => {
            vm.push('/redirect')
        })
    } else if (to.path.includes('/redirect')) {
        next(false) //  中断当前的导航,会返回一个 reject('在全局前置守卫 next 中取消路由')
    } else {
        next() // 一定要调用该方法来 resolve 这个钩子
    }
}

$router.afterEach = to => { // 注册一个全局后置守卫
 console.log('全局后置守卫', to)
}

Vue.prototype.$route = $route // 当前路由对象,保存路由当前信息
Vue.prototype.$router = $router // 路由对象,保存了实例方法

// 在组件中使用
methods: {
    to() {
        this.$router.push('/test', {
            id: 2333,
            test: {
                a: 1,
                b: 2
            }
        }).then(e => {
            console.log('路由结束,当前路由对象为', e)
        }).catch(e => {
            console.warn(e)
        })
    }
}

// test 页面中
onLoad() {
    console.log(this.$route) // 可以通过 $route 获取当前路由对象、参数、路径信息等
    // {
    //     fullPath: "/pages/test/test"
    //     path: "/test"
    //     query: {
    //         id: 2333,
    //         test: {
    //             a: 1,
    //             b: 2
    //         }
    //     }
    // }
}

// this.$router 上一共有 5 个方法, 分别是
this.$router.pop()
this.$router.push()
this.$router.replace()
this.$router.reLaunch()
this.$router.switchTab()

// 除了 pop 方法只接受一个参数 delta 外,其余四个方法接受的参数分别是
fun(
    path, // path 路由名
    query = {}, // query 路由传参
    notBeforeEach, // isBeforeEach 是否要被全局前置守卫拦截,默认false,拦截,设置为 true 禁止拦截
    notAfterEach // isAfterEach 是否要被全局后置守卫拦截,默认false,拦截,设置为 true 禁止拦截
).then(...)

注意事项

1 . uni_router 的核心实现是利用了

require.context('@/pages', true, /\.vue$/)

是利用 require.context 将 pages 文件夹中的所有 .vue 页面组件统统导入,然后放在一个数组里,在使用的时候动态匹配,因为才可以不用配置路由。这样的好处和坏处都是显而易见的,用起来方便的同时。你不可以将页面路由放在 pages 以外的地方,不然读取不到。同时 pages 除了页面最好不要放组件。你应该在根目录下建一个 componetns 文件夹管理组件。

2 . 全局导航守卫并不能也没有对 pop 方法或者说所有的返回行为做监听。因为目前个人用 uni-app 开发几乎都是小程序方面,小程序没办法对返回行为做监听,所有就没做

3 . 可能不支持 nvue 。没测试过。具体原因看第二条。