V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lllyglh
V2EX  ›  程序员

vue-router 居然在小版本号中引入破坏性更改

  •  2
     
  •   lllyglh · 2022-11-04 12:31:50 +08:00 · 5160 次点击
    这是一个创建于 743 天前的主题,其中的信息可能已经有所发展或是发生改变。
    大部分使用 vue 的 应该避免不了使用 vue-router

    官方教程中提到 可以使用 router.push({ name: 'user', params: { username } }) 的方式传参,

    但是现在这个 params 居然在小版本号中移除了,甚至没更新教程,这对于初学 vue-router 的新手的积极性是一个很大的打击。

    官方教程链接: https://router.vuejs.org/guide/essentials/navigation.html#navigate-to-a-different-location

    Github 讨论链接(已被关闭):https://github.com/vuejs/router/issues/1527
    第 1 条附言  ·  2022-11-04 15:04:38 +08:00
    结帖吧, 楼主一直以为 params 可以直接传的,原来是一个 BUG
    renmu
        1
    renmu  
       2022-11-04 12:51:45 +08:00 via Android
    我一直以为只有命名路由才能使用 params 参数。
    我觉得大概率是哪个开发者也是这么认为,然后改代码的时候解决了这个"bug""。

    其实文档写了用于 named route
    // named route with params to let the router build the url router.push({ name: 'user', params: { username: 'eduardo' } })
    liuxu
        2
    liuxu  
       2022-11-04 12:53:15 +08:00
    那就换 react 吧
    Torpedo
        3
    Torpedo  
       2022-11-04 12:54:18 +08:00
    这直接干掉一个 api ,有点随意了
    kwh
        4
    kwh  
       2022-11-04 12:54:40 +08:00
    flutter 携带面向对象,多端共用,性能优秀,大厂品质,来势汹汹
    thinkershare
        5
    thinkershare  
       2022-11-04 12:54:52 +08:00
    这种 fix 性质的更新引入 Breaking Change 的确比较烦,一些方便的特性就是反模式的,为了规范就要移除这些反模式的支持。但开源程序就是这样,自己不爽就再造一个轮子,如此循环。
    liuzhaowei55
        6
    liuzhaowei55  
       2022-11-04 12:59:34 +08:00 via iPhone
    这也说明在项目开发中锁版本是一件很重要的事情,愉快的去掉 package 中的 ^ ~ 吧,想要忽略小版本,定义版本时忽略掉不写那个小版本就好了
    wu67
        7
    wu67  
       2022-11-04 13:06:57 +08:00
    同上. 新的库还是锁版本比较好.
    别说什么出来好久了, 现在绝大部分项目还在 vue2 生态, vue3 生态目前就是半踩坑状态, 如果你同时还用着 element-plus, 那就更能体会到我说什么了. 从 1.*到 2.*极其痛苦, 从 2.0 往后, 补丁版本也很痛苦....半年前到几个月前, 在为爱发电的我, 简直就是地铁老人手机脸...
    gouflv
        8
    gouflv  
       2022-11-04 13:09:15 +08:00 via iPhone
    OP 理解了一半就还以为是个大新闻,看完 issue 其实就移除了一个反模式而已

    回过头说,既然都爱吹 vue 又快又好,那出些小问题也不碍事
    939630029
        9
    939630029  
       2022-11-04 13:39:38 +08:00
    你这么使用这个 api 本来就是不被推荐这么使用的啊,正确的用法应该是用 query...应该仔细读读 vue router 文档
    xutao881
        10
    xutao881  
       2022-11-04 13:39:42 +08:00
    @gouflv “一个反模式而已”???这个 API 在实际项目中的使用率并不低,这种都不算大新闻,什么算?文档和行为不一致不算大新闻什么算?
    939630029
        11
    939630029  
       2022-11-04 13:46:31 +08:00
    你们喷这个 api ,都仔细看过文档吗,vue 文档并没有推荐这样子使用这个 api ,并且文档上也明确写了:"named route with params to let the router build the url"。楼主这种场景,应该直接使用 query ,而不是使用 params
    gouflv
        12
    gouflv  
       2022-11-04 13:54:12 +08:00 via iPhone
    @xutao881 看来你和 op 一样,没看懂 issue 和 changlog
    hcwhan
        13
    hcwhan  
       2022-11-04 14:05:04 +08:00
    $route.params 是用来匹配路由中的动态路由的
    gouflv
        14
    gouflv  
       2022-11-04 14:05:20 +08:00 via iPhone
    @939630029 +1 ,难怪说 vue 是前端娱乐圈,官方和用户都有责任
    hcwhan
        15
    hcwhan  
       2022-11-04 14:10:12 +08:00
    现在是把 反模式的 (手动指定的 不存在与路由中的参数 过滤掉了) 现实项目中重来没见过这种用法 刚去建立了 一个 4.1.3 和 4.1.4 的项目试了下 才知道还可以这样 你的目的是路由跳转的时候传递数据 但是这个数据本身有不存在与路由路径中 肯定是不建议通过自定义不存在的 params key 的形式 我理解 之前这样使用算是 bug 现在只是修复了这个 文档中未定义的 bug params 本身还是正常的
    zhzy0077
        16
    zhzy0077  
       2022-11-04 14:11:11 +08:00
    楼上一直在讨论这么写究竟对不对,属于是根本没看过 semver 的,这个改动放到一个 major 版本上我拍手叫好,摆在一个 patch 的版本里就是不符合 semver
    hcwhan
        17
    hcwhan  
       2022-11-04 14:11:44 +08:00
    至于想在路由跳转的时候传递数据 又不想通过路由 解决方案官方列了 4 个
    hcwhan
        18
    hcwhan  
       2022-11-04 14:14:10 +08:00
    @zhzy0077 这个本身使用方式就是未定义的 我理解原来能这样用就算是 bug 现在只是修复了 $route 本身就代表了路由的只读描述 之前这样用等于手动修改只读变量 现在不让改了而已
    wangxiaoaer
        19
    wangxiaoaer  
       2022-11-04 14:15:34 +08:00
    有啥问题吗????????这是什么破坏性?

    如果你打算更新类库( vue )版本,更新好、编译好后不测试的????

    版本不兼容这些事情不是很正常吗? 至于这个不兼容是不是必要、有没有替代方案才值得讨论吧。
    mozhizhu
        20
    mozhizhu  
       2022-11-04 14:15:52 +08:00
    不规范导致踩进坑了嘛。要嘛锁定版本,要嘛自己规范代码
    shintendo
        21
    shintendo  
       2022-11-04 14:16:59 +08:00
    OP 搞个大新闻,哪有移除 params ,只能说改了一个未定义行为,只不过这个未定义行为被广泛使用了
    hcwhan
        22
    hcwhan  
       2022-11-04 14:18:56 +08:00
    @shintendo 我也是的 看内容吓了一跳 移除 params 那路由匹配咋弄 一脸问号
    hcwhan
        23
    hcwhan  
       2022-11-04 14:20:26 +08:00
    @shintendo 这个有被广泛使用吗 路由跳转的时候 通过手动指定非路由 params 传数据 看着就好不规范呀 从没见过这样写的
    shintendo
        24
    shintendo  
       2022-11-04 14:21:08 +08:00
    @zhzy0077 问题来了,修改 undocumented api 算不算破坏性更新
    Mithril
        25
    Mithril  
       2022-11-04 14:21:50 +08:00
    如果是安全性漏洞,在小版本里引入 breaking change 也是没办法的事。毕竟安全优先。
    但你在一个 patch 版本里,为了解决文档不一致问题,引入 breaking change 。
    只能说娱乐圈开心就好。
    zhzy0077
        26
    zhzy0077  
       2022-11-04 14:22:20 +08:00
    @hcwhan semver 的场景里,任何之前能运行的代码在改动后不能运行都是破坏性更改。Java/C++ 那么多未定义的行为,没有一个小版本更新会改动这些结果的,甚至在 C 臭名昭著的 (i++)+(i++) 类型表达式,gcc 在 patch 更新的时候也是不会改变行为的。
    zhzy0077
        27
    zhzy0077  
       2022-11-04 14:24:03 +08:00
    @shintendo 当然 一个 API 你只要暴露出来了 就不能以文档里没写就不维护吧?最好的选择就是谨慎的选择暴露的 API 范围
    hcwhan
        28
    hcwhan  
       2022-11-04 14:26:52 +08:00
    @zhzy0077 你这样理解肯定不对 就算是 semver 改动 是修复 bug 的 那假如我之前写的一个功能依赖于某个 bug 你现在把 bug 修复了 那我的功能就会出问题 我记得之前看到过有一个 lua 代码就是 依赖的 lua 解释器排序算法某种场景下的 bug 那个排序算法 bug 修复后 lua 功能出错了
    zhzy0077
        29
    zhzy0077  
       2022-11-04 14:29:23 +08:00
    @hcwhan 这样的 bug 当然可以修复 但是至少要放到 minor 里
    hcwhan
        30
    hcwhan  
       2022-11-04 14:33:40 +08:00 via Android
    @zhzy0077 赞同 改 minor 好一些
    shakukansp
        31
    shakukansp  
       2022-11-04 14:35:57 +08:00
    vue2 的时候我记得这么写传不过去的
    nomagick
        32
    nomagick  
       2022-11-04 14:39:04 +08:00
    表面看是版本政策问题,本质上是 API 设计问题
    sechi
        33
    sechi  
       2022-11-04 14:48:06 +08:00
    真就是标题党啊,只看你这个描述我还以为是 push 方法不能传 param 了
    hronro
        34
    hronro  
       2022-11-04 15:20:20 +08:00
    为啥 Vue 的 issue 里面这么多人用中文啊
    wangtian2020
        35
    wangtian2020  
       2022-11-04 15:25:54 +08:00   ❤️ 1
    破坏性更改
    指我的 build 被破坏的变化
    我的 build 不被破坏的不算
    MEIerer
        36
    MEIerer  
       2022-11-04 15:28:14 +08:00
    @hronro #34 用中文你看不懂吗
    ccyu220
        37
    ccyu220  
       2022-11-04 15:55:28 +08:00
    总想搞个大新闻,我还以为是移除了 params 只能使用 query 的方式。

    没想到你们一直以来的用法是不声明路由参数就使用 params 传递?那可能就是人的问题了

    这是用上框架就把 JS 基础给忘了
    ccyu220
        38
    ccyu220  
       2022-11-04 15:57:56 +08:00
    甚至我认为 params 就应该只在传递单个 id 或关键值时使用 ,其它的一概用 query 的方式,更语义化
    marcong95
        39
    marcong95  
       2022-11-04 16:23:18 +08:00
    这个 issue 还挺唬人的,而且没有附 router 的定义。盯着 issue 看了一圈,以为是真的把 params 去掉了。谁知道原来是一堆人在强行往 params 里面塞东西,把 params 当 query 用,还不想 URL 里出现这些内容。

    考虑到那个 issue 那么多人用中文,有没有一种可能是那些人没看(没看懂)作者发的 changelog

    Move the data to an actual param by defining it on the route's path or pass it as query params: this is relevant if you have small pieces of data that can fit in the URL and should be preserved when reloading the page
    yuningWang8
        40
    yuningWang8  
       2022-11-04 16:45:00 +08:00
    确实是个反模式。原来见有人这么用过。印象里文档老早就说过,params 只是用于构建 URL ,不知道为什么会有人用于传参。
    tagtag
        41
    tagtag  
       2022-11-04 16:58:28 +08:00
    又扯什么前端娱乐圈,讨论问题就不能好好讨论吗? OK 啦 ! CRUD Boy !!!
    lllyglh
        42
    lllyglh  
    OP
       2022-11-04 17:05:47 +08:00
    @Livid 该贴标题党了 我武断下结论了 希望删除该贴
    oldshensheep
        43
    oldshensheep  
       2022-11-04 18:24:49 +08:00
    初学 Vue 的时候我就**直接**用 params 给组件传参(就是在路由路径上没有这个参数)……
    然后发现怎么刷新页面数据就丢失了……
    然后就再也不**直接**用 params 给组件传参了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1352 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:57 · PVG 01:57 · LAX 09:57 · JFK 12:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.