如何将 Vue 的动态组件与片段一起使用?
How to use Vue's Dynamic Component with a Fragment?
是否可以使用 Vue 的 <component>
有条件地渲染组件或 nothing 代替?
例如,考虑以下模式:
<component :is="hasTooltip ? 'CustomTooltip' : 'div'">
<div>Hover over me!</div>
</component>
在这种情况下,当 hasTooltip
值为真时,我们将渲染一个 CustomTooltip
组件,否则我们将渲染一个正常的 div。是否可以渲染一个片段来代替这个 div(就像 React 中的 <>
片段),它将在浏览器中被剥离?这将如何实现?我在 Vue 2.0.
有条件地渲染组件将不起作用,因为我们想要“将鼠标悬停在我身上!”无论如何都要呈现的文本。
也许是这样的?
Vue.component('tooltip', {
template: `<div> Tooltip for: <slot></slot> </div>`
})
Vue.component('wrap-if', {
functional: true,
props: ['wrap', 'wrapper'],
render(h, ctx) {
if (ctx.props.wrap) {
return h(ctx.props.wrapper, ctx.data, ctx.children)
} else {
// maybe check that children.length === 1 as Vue 2 does not support fragments
return ctx.children
}
}
})
new Vue({
el: '#app',
data: {
wrap: true
}
})
<script src="https://unpkg.com/vue@2.6.14/dist/vue.js"></script>
<div id="app">
<wrap-if :wrap="wrap" wrapper="tooltip">
<span>This is always rendered no matter what</span>
</wrap-if>
<br>
<button @click="wrap = !wrap">Toggle</button>
<pre>{{$data}}</pre>
</div>
只是将对此的一些其他评论合并为一个答案。
在 Vue-2 中似乎没有干净的方法来有条件地包装没有插件的组件,因为片段不可用。
但是,可以使用 Vue-2 片段插件或在 Vue3 中使用 fragment
组件来实现相同的模式,如 答案中所示。不是渲染 div,而是渲染片段。
是否可以使用 Vue 的 <component>
有条件地渲染组件或 nothing 代替?
例如,考虑以下模式:
<component :is="hasTooltip ? 'CustomTooltip' : 'div'">
<div>Hover over me!</div>
</component>
在这种情况下,当 hasTooltip
值为真时,我们将渲染一个 CustomTooltip
组件,否则我们将渲染一个正常的 div。是否可以渲染一个片段来代替这个 div(就像 React 中的 <>
片段),它将在浏览器中被剥离?这将如何实现?我在 Vue 2.0.
有条件地渲染组件将不起作用,因为我们想要“将鼠标悬停在我身上!”无论如何都要呈现的文本。
也许是这样的?
Vue.component('tooltip', {
template: `<div> Tooltip for: <slot></slot> </div>`
})
Vue.component('wrap-if', {
functional: true,
props: ['wrap', 'wrapper'],
render(h, ctx) {
if (ctx.props.wrap) {
return h(ctx.props.wrapper, ctx.data, ctx.children)
} else {
// maybe check that children.length === 1 as Vue 2 does not support fragments
return ctx.children
}
}
})
new Vue({
el: '#app',
data: {
wrap: true
}
})
<script src="https://unpkg.com/vue@2.6.14/dist/vue.js"></script>
<div id="app">
<wrap-if :wrap="wrap" wrapper="tooltip">
<span>This is always rendered no matter what</span>
</wrap-if>
<br>
<button @click="wrap = !wrap">Toggle</button>
<pre>{{$data}}</pre>
</div>
只是将对此的一些其他评论合并为一个答案。
在 Vue-2 中似乎没有干净的方法来有条件地包装没有插件的组件,因为片段不可用。
但是,可以使用 Vue-2 片段插件或在 Vue3 中使用 fragment
组件来实现相同的模式,如