我试图在html表格行(vue.js)上进行转换(动画),但没有成功.下面是完整的例子

  new Vue({
    el: '#data',
    data: {
      items: [
        {
          data: 'd1',
          more: false
        },
        {
          data: 'd2',
          more: false
        },
      ]
    }

  });
.fade-enter-active, .fade-leave-active {
        transition: opacity 2s
      }
      .fade-enter, .fade-leave-to  {
        opacity: 0
      }
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.2/vue.min.js"></script>


    <div class="container-fluid" id="data">
      <br>
      <br>
      <table border="1" class="table table-bordered">
        <thead class="thead-inverse">
          <tr>
            <th>anim</th>
          </tr>
        </thead>
        <tbody>  
        <template v-for="item, k in items">
          <tr>
            <td><button @click="item.more = !item.more" type="button" 
                         v-bind:class="[item.more ? 'btn-danger' : 'btn-primary']" class="btn">Show the hidden row</button></td>
          </tr>

          <transition name="fade" > 
            <tr  v-bind:key="item" v-if="item.more">
              <td><p >{{k + 1}} - {{item.data}}</p></td>
            </tr>
          </transition>

        </template>
        </tbody>
      </table>
    </div>

我希望隐藏的表格行在显示时应该带有transition/animation on opacity属性,但什么都没有发生,我该怎么做?这是完美的工作在另一个元素,如跨度或其他.

推荐答案

首先,我想指出,如果你用string template,那么你问题中的代码就可以用as is.

console.clear()
new Vue({
    el: '#data',
    template: `
     <div>
          <br>
      <br>
      <table border="1" class="table table-bordered">
        <thead class="thead-inverse">
          <tr>
            <th>anim</th>
          </tr>
        </thead>
        <tbody>  
        <template v-for="item, k in items">
          <tr>
            <td><button @click="item.more = !item.more" type="button" 
                         v-bind:class="[item.more ? 'btn-danger' : 'btn-primary']" class="btn">Show the hidden row</button></td>
          </tr>

          <transition name="fade" > 
            <tr  v-bind:key="item" v-if="item.more">
              <td><p >{{k + 1}} - {{item.data}}</p></td>
            </tr>
          </transition>

        </template>
        </tbody>
      </table>
      </div>
    `,
    data: {
      items: [
        {
          data: 'd1',
          more: false
        },
        {
          data: 'd2',
          more: false
        },
      ]
    }

  });
.fade-enter-active, .fade-leave-active {
        transition: opacity 2s
      }
      .fade-enter, .fade-leave-to  {
        opacity: 0
      }
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.2/vue.min.js"></script>


    <div class="container-fluid" id="data">

    </div>

请注意,本例中所做的更改是,我将Vue的模板转换为字符串,而不是在DOM中定义模板.这一变化之所以有效,是因为当您使用"in-DOM"模板时,浏览器会将HTML prior解析为Vue,并将模板转换为渲染函数.当您使用table个元素时,浏览器会非常挑剔他们允许在表中呈现哪些类型的元素;通常,只有与表相关的元素(theadtbodytrtd等).transition显然是一个与之相处融洽的元素(不过,有点令人惊讶的是,它并没有扼杀template).

但是,字符串模板永远不会被浏览器解析,它们会直接转换为渲染函数,因此它们可以在编写时正常工作.所以我的第一个建议是just use a string template.

但是,如果您想继续使用DOM模板,我们需要对代码进行一些更改.首先,我们需要将过渡转移到浏览器满意的地方.有了一个表,我们可以通过将其移动到tbody标签并使用Vue的特殊is指令轻松实现这一点.第二,因为我们的转换现在将应用于多个元素,所以我们需要将其切换到transition-group.

因为我们使用的是transition-group,转换must中的每个元素都有一个键.因此,对于每一行,我们只需为该行添加一个键.

console.clear()
new Vue({
  el: '#data',
  data: {
    items: [{
        data: 'd1',
        more: false
      },
      {
        data: 'd2',
        more: false
      },
    ]
  }

});
.fade-enter-active,
.fade-leave-active {
  transition: opacity 2s
}

.fade-enter,
.fade-leave-to {
  opacity: 0
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.2/vue.js"></script>

<div class="container-fluid" id="data">
  <br>
  <br>
  <table border="1" class="table table-bordered">
    <thead class="thead-inverse">
      <tr>
        <th>anim</th>
      </tr>
    </thead>
    <tbody  name="fade" is="transition-group">
      <template v-for="item, k in items">
          <tr v-bind:key="`button-${item.data}`">
            <td>
              <button @click="item.more = !item.more" 
                      type="button" 
                      v-bind:class="[item.more ? 'btn-danger' : 'btn-primary']" 
                      class="btn">Show the hidden row
              </button>
            </td>
          </tr>
          <tr  v-bind:key="`detail-${item.data}`" v-if="item.more">
            <td><p >{{k + 1}} - {{item.data}}</p></td>
          </tr>
        </template>
    </tbody>
  </table>
</div>

Vue.js相关问答推荐

VueJS使所有组件崩溃,而不是只有一个

如何将$validator实例注入到使用组合API语法的Vue2.7应用程序中

Vutify-v-工具提示-不使用键盘轻击按钮显示

在 Vue.js 2.6 的 Javascript 中访问 的内容

在 Vue 中更改 json 数据后,如何在屏幕上重新呈现表格组件?

Vue,Composition API:如何从react 式转换中跳过深度嵌套的属性?

更改 Vuetify 轮播高度

如果 Vuetify 自动完成没有匹配的结果,则保留输入的文本

带有热重载的 docker 容器上的 Vue.js 应用程序

Vue + Webpack 构建显示空白页面

如何在 Vue.js 中添加动态组件/部分

Webpack 你可能需要一个合适的加载器来处理这个文件类型

VueJS + VueRouter:有条件地禁用路由

使用 Vue.js (cdn) 在特定元素上切换显示/隐藏

使用 nuxt,如何将路由名称放在页面标题中?

即使在生产模式下构建,VueJS 也会显示开发模式开发模式消息

在找不到图像源时设置替代图像

使密码字符隐藏在 Vuetify 字段中

v-if 未在计算(computed)属性上触发

如何在 Vue.js 2 应用程序中模拟 onbeforeunload?