我试图在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>
&#13;
我希望隐藏的表格行在出现时会出现在opacity属性上的转换/动画,但什么也没发生,我该怎么办呢?这完全适用于span或其他元素。
答案 0 :(得分:9)
所以,首先我要指出,如果您使用了字符串模板,那么您问题中的代码将按工作。
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中定义模板。这个单一更改的作用是因为当您使用“在DOM”模板中时,您需要使用浏览器解析HTML 之前到Vue,将模板转换为渲染函数。当您使用table
元素时,浏览器非常挑剔它们允许在表格内呈现的元素类型;通常,只有与表格相关的元素(thead
,tbody
,tr
,td
等)。 transition
不是它显然相处的元素(尽管有点令人惊讶的是,它不会在template
上窒息)。
然而,字符串模板永远不会被浏览器解析,它们会直接转换为渲染函数,因此它们将在您编写它们时起作用。所以我的第一个建议是,只使用字符串模板。
但是,如果您想继续使用in DOM模板,我们需要对代码进行一些更改。首先,我们需要将过渡转移到浏览器会满意的地方。使用表格,我们可以通过将其移动到tbody
标记并使用Vue的特殊is
指令轻松完成。其次,因为我们的转换现在将应用于多个元素,我们需要将其切换为transition-group
。
因为我们使用transition-group
转换中的每个元素必须都有一个键。因此,对于每一行,我们只需为该行添加一个键。
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>
答案 1 :(得分:1)
尝试删除&lt; transition&gt;完全标记并执行此操作:
<tr name="fade" is="transition" v-bind:key="item.data" v-if="item.more">
来源:https://github.com/vuejs/vue/issues/3907#issuecomment-253111682
小提琴:https://jsfiddle.net/c8vqajb4/3/
<强>更新强>
我们最终使用过渡组:
<tbody name="fade" is="transition-group">
<tr class="row" v-bind:key="item.data" v-if="item.more">
<td><p >{{k + 1}} - {{item.data}}</p></td>
</tr>
</tbody>
正如此处所示:https://vuejs.org/v2/guide/transitions.html#List-Transitions
答案 2 :(得分:0)
转换仅适用于单个渲染元素
如果我们在元素内移动过渡,它就会起作用
还应该考虑使用可能有帮助的过渡组