Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

vue@2.6.13插槽不可以并列v-if #5

Closed
zack-xy opened this issue Dec 25, 2021 · 0 comments
Closed

vue@2.6.13插槽不可以并列v-if #5

zack-xy opened this issue Dec 25, 2021 · 0 comments
Assignees
Labels
bug Something isn't working

Comments

@zack-xy
Copy link
Owner

zack-xy commented Dec 25, 2021

记一次Vue版本升级带来的bug(时间:2021\06\04)

问题是:具体的问题是,在项目中,页面上有些元素莫名其妙的不显示。

当出现问题时,首先排查的是vue代码,检查控制显示的逻辑是不是正确,而后排查数据是不是对的,经排查
以上都没有问题。

之后就是怀疑,出问题的代码,只是出现在slot中,根据表现来看,高度怀疑,两个并排的v-if,第一个不显示,则后面的逻辑数据都不生效,同层级的所有v-if都不会展示。

之后,查找代码中具有这种共性的代码,检查页面是不是有相同的问题,经检查页面确实有这个问题。

但是本地启动的页面是没有问题的,该问题只有上到测试环境或者生产环境才有问题

回溯生产和测试的打包流程,意识到可能是包版本问题引发的bug,怀疑上线环境中的UI库和Vue的版本与本地不一致
在本地重新拉取镜像模拟生产打包,果然复现了问题,可以断定是版本问题,再经比较,确定是Vue版本问题,而且是最新的版本2.6.13会有这个问题,而该版本,在3天前发布。

复盘原因,是拉取包是使用公司自建镜像,类似cnpm,拉取镜像时,不读取package-lock.json,总是拉取最新版本的npm包,导致该问题。

之后,查看vue@2.6.13源代码,经调试源码,发现bug根本原因是这一次修改:

https://github.com/vuejs/vue/pull/11963/files

在normalizeScopedSlot方法中,不显示的v-if元素会被解析为vNode.isComment
在上一个版本中,这里的判断是有且只有一个元素,并且这个元素是isComment,才会返回undefined
在2.6.13中,被修改成,拿第一个元素,如果是isComment,则就会返回undefined,最后导致后面的元素都不会渲染
所以导致上述问题

所以解决办法也可以想到,就是在最外面包一个标签,或者使用v-show(当然,对于上线项目来说,解决办法应该是固定版本,重新打包上线)

正打算给vue提issue,发现已经有人先一步了
vuejs/vue#12102
而且bug早已经在6月2日修复了
vuejs/vue@0367ddf
真快。。。。(感觉这个问题我也可以修,淦~~~)

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <div id="app">
    <todo-list>
      <template v-slot:todo="{ todo }">
        <span v-if="todo.showA">A content</span>
        <span v-if="todo.showB">B content</span>
      </template>
    </todo-list>
  </div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.13"></script>
<script>
  Vue.component('todo-list', {
    data: function () {
      return {
        todos: [{ text: "Learn Vue", id: "1", showA: false, showB: true }]
      }
    },
    template: `<ul>
                <li v-for="todo in todos" v-bind:key="todo.id">
                  <slot name="todo" v-bind:todo="todo"></slot>
                </li>
              </ul>`
  });
  new Vue({
    el: '#app',
  });
</script>

</html>
@zack-xy zack-xy added the bug Something isn't working label Dec 25, 2021
@zack-xy zack-xy self-assigned this Dec 25, 2021
@zack-xy zack-xy closed this as completed Dec 25, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

1 participant