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

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

  •  2
     
  •   lllyglh · 332 天前 · 4517 次点击
    这是一个创建于 332 天前的主题,其中的信息可能已经有所发展或是发生改变。
    大部分使用 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 条附言  ·  332 天前
    结帖吧, 楼主一直以为 params 可以直接传的,原来是一个 BUG
    renmu
        1
    renmu  
       332 天前 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  
       332 天前
    那就换 react 吧
    Torpedo
        3
    Torpedo  
       332 天前
    这直接干掉一个 api ,有点随意了
    kwh
        4
    kwh  
       332 天前
    flutter 携带面向对象,多端共用,性能优秀,大厂品质,来势汹汹
    thinkershare
        5
    thinkershare  
       332 天前
    这种 fix 性质的更新引入 Breaking Change 的确比较烦,一些方便的特性就是反模式的,为了规范就要移除这些反模式的支持。但开源程序就是这样,自己不爽就再造一个轮子,如此循环。
    liuzhaowei55
        6
    liuzhaowei55  
       332 天前 via iPhone
    这也说明在项目开发中锁版本是一件很重要的事情,愉快的去掉 package 中的 ^ ~ 吧,想要忽略小版本,定义版本时忽略掉不写那个小版本就好了
    wu67
        7
    wu67  
       332 天前
    同上. 新的库还是锁版本比较好.
    别说什么出来好久了, 现在绝大部分项目还在 vue2 生态, vue3 生态目前就是半踩坑状态, 如果你同时还用着 element-plus, 那就更能体会到我说什么了. 从 1.*到 2.*极其痛苦, 从 2.0 往后, 补丁版本也很痛苦....半年前到几个月前, 在为爱发电的我, 简直就是地铁老人手机脸...
    gouflv
        8
    gouflv  
       332 天前 via iPhone
    OP 理解了一半就还以为是个大新闻,看完 issue 其实就移除了一个反模式而已

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

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

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

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

    这是用上框架就把 JS 基础给忘了
    ccyu220
        38
    ccyu220  
       331 天前
    甚至我认为 params 就应该只在传递单个 id 或关键值时使用 ,其它的一概用 query 的方式,更语义化
    marcong95
        39
    marcong95  
       331 天前
    这个 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  
       331 天前
    确实是个反模式。原来见有人这么用过。印象里文档老早就说过,params 只是用于构建 URL ,不知道为什么会有人用于传参。
    tagtag
        41
    tagtag  
       331 天前
    又扯什么前端娱乐圈,讨论问题就不能好好讨论吗? OK 啦 ! CRUD Boy !!!
    lllyglh
        42
    lllyglh  
    OP
       331 天前
    @Livid 该贴标题党了 我武断下结论了 希望删除该贴
    oldshensheep
        43
    oldshensheep  
       331 天前
    初学 Vue 的时候我就**直接**用 params 给组件传参(就是在路由路径上没有这个参数)……
    然后发现怎么刷新页面数据就丢失了……
    然后就再也不**直接**用 params 给组件传参了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1973 人在线   最高记录 6067   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 07:30 · PVG 15:30 · LAX 00:30 · JFK 03:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.