Vue3.0在JSX/TSX下如何使用插槽(slot)
在Vue的文档上没找到,使用搜索引擎搜索也未见有人发表过相关的内容。最后我在vuejs/jsx-next这个repo的README.md找到了解决方案,在这里分享给大家。
官方文档示例
注意: 在 jsx 中,应该使用 v-slots 代替 v-slot
const A = (props, { slots }) => (
<>
<h1>{ slots.default ? slots.default() : 'foo' }</h1>
<h2>{ slots.bar?.() }</h2>
</>
);
const App = {
setup() {
const slots = {
bar: () => <span>B</span>,
};
return () => (
<A v-slots={slots}>
<div>A</div>
</A>
);
},
};
// or
const App = {
setup() {
const slots = {
default: () => <div>A</div>,
bar: () => <span>B</span>,
};
return () => <A v-slots={slots} />;
},
};
// or
const App = {
setup() {
return () => (
<>
<A>
{{
default: () => <div>A</div>,
bar: () => <span>B</span>,
}}
</A>
<B>{() => "foo"}</B>
</>
);
},
};
解构插槽Props
在template写法中:
<router-link
to="/about"
custom
v-slot="{ href, route, navigate, isActive, isExactActive }"
>
<NavLink :active="isActive" :href="href" @click="navigate">
{{ route.fullPath }}
</NavLink>
</router-link>
在JSX写法中可以则可以是这样:
<router-link
to="/about"
custom
>
{{
default: ({ href, route, navigate, isActive, isExactActive }) => (
<NavLink active={isActive} href={href} click={navigate}>
{ route.fullPath }
</NavLink>
)
}}
</router-link>