ããã¯https://github.com/vuejs/vue/issues/7740#issuecomment-371309357ã®ãã©ããŒã¢ããã§ã
çŸåšã®ã¹ã³ãŒãã¹ãããã®äœ¿çšã«é¢ããåé¡ïŒ
<template slot-scope>
ã䜿çšããå Žåã¯è©³çŽ°slot-scope
ã䜿çšããŠããŸããã³ã³ããŒãã³ãã§ã®ã¿äœ¿çšã§ããæ°ããv-scope
ãã£ã¬ã¯ãã£ããå°å
¥ããŸãã
<comp v-scope="scope">
{{ scope.msg }}
</comp>
<comp>
ã®ããã©ã«ãã®ã¹ã³ãŒãã¹ãããã®slot-scope
ãšåãããã«æ©èœããŸãïŒ <comp>
ãã¹ã³ãŒãå€ãæäŸããŸãïŒã ãããã£ãŠãããã¯è±æ§ç¯ã§ãæ©èœããŸãïŒ
<comp v-scope="{ msg }">
{{ msg }}
</comp>
ããŒã ã¯ããã°ããåã«Slackã®https://github.com/vuejs/vue/issues/7740#issuecomment -371309357ã§ææ¡ããå 容ã«ã€ããŠç°¡åã«è©±ãåã£ããšæããŸããããã£ããã®èšé²ãèŠã€ãããŸããã§ããã æ°ããæ什ã®èåŸã«ããçç±ã¯æ¬¡ã®ãšããã§ãã
slot-scope
slot
ã¯å±æ§ã§ãããã¹ãããé¢é£ã®å±æ§ã®äžè²«æ§ãç¶æãããã£ãããããã£ã¬ã¯ãã£ãïŒ v-
ãã¬ãã£ãã¯ã¹ã§å§ãŸãå±æ§ïŒã§ã¯ãªããç¹å¥ãªå±æ§ãšããŠslot-scope
ãå°å
¥ãããŸããã ã slot
ã¯ãShadow DOMæšæºã®å®éã®ã¹ããã䜿çšéããã©ãŒãªã³ã°ããããã«ãéãã£ã¬ã¯ãã£ãå±æ§ãšããŠå°å
¥ãããŸããã æšæºã§æŠå¿µçã«åããã®ãããå Žåã¯ãç¬èªã®äžŠåv-slot
ã䜿çšããªãããšãæåã§ãããšèããŸããã
ããšããšã slot-scope
ã¯ãæœè±¡ã³ã³ãããšããŠæ©èœãã<template>
èŠçŽ ã§ã®ã¿äœ¿çšã§ããããã«èšèšãããŠããŸããã ããããããã¯åé·<template>
ããã®ããã slot-scope
çŽæ¥äœ¿çšããããšãã§ããªããªããŸããããã¯ãã§ãã
slot-scope
修食åãŸãã¯ç¹å¥ãªãã¬ãã£ãã¯ã¹ãè¿œå ããŠãã³ã³ããŒãã³ãã§çŽæ¥äœ¿çšããŠãã¹ãããã³ã³ãã³ããããã©ã«ãã®ã¹ã³ãŒãã¹ããããšããŠæ±ãå¿
èŠãããããšã瀺ãããšãæ€èšããŸãããã修食åãŸãã¯$
ãããªãã¬ãã£ãã¯ã¹ã¯ãããŸããã
éåžžã«é·ãéããã£ã¬ã¯ãã£ãã®è¿œå ãé¿ããŠããŸããããã³ãã¬ãŒãæ§æã®äžéšã¯å¯èœãªéãå®å®ãããããã®ã§ãããã³ã¢ãã£ã¬ã¯ãã£ããæå°éã«æããŠäœããå®è¡ããããšããããšããããŸãããŠãŒã¶ãŒããŠãŒã¶ãŒã©ã³ãã§ç°¡åã«è¡ãããšã¯ã§ããŸããã ãã ãããã®å Žåãã¹ã³ãŒãã¹ãããã®äœ¿çšã¯ååã«éèŠã§ãããæ°ãããã£ã¬ã¯ãã£ãã¯ããã®äœ¿çšã®ãã€ãºãå€§å¹ ã«æžããããã«æ£åœåã§ãããšæããŸãã
v-scope
åãå
¥ããããåŒã¯ãä»ã®ã»ãšãã©ã®ãã£ã¬ã¯ãã£ããšã¯ç°ãªããŸããäžæå€æ°åïŒå解ã®å ŽåããããŸãïŒãå¿
èŠã§ãããåªå
é äœããªãããã§ã¯ãããŸããã v-for
ãšã€ãªã¢ã¹éšåãšåãããã«æ©èœããŸãã v-scope
ã¯ãå
éšã¹ã³ãŒãã®äžæå€æ°ãäœæããæ§é ãã£ã¬ã¯ãã£ããšããŠv-for
ãšåããã£ã³ãã«åé¡ãããŸãã
ããã«ããããŠãŒã¶ãŒãv-scope
ãšããååã®ã«ã¹ã¿ã ãã£ã¬ã¯ãã£ããæã¡ãã³ã³ããŒãã³ãã§äœ¿çšãããŠããå ŽåããŠãŒã¶ãŒã³ãŒããç ŽæããŸãã
v2ã®ã«ã¹ã¿ã ãã£ã¬ã¯ãã£ãã¯äž»ã«çŽæ¥ã®DOMæäœã«çŠç¹ãåãããŠãããããã³ã³ããŒãã³ãã§ã«ã¹ã¿ã ãã£ã¬ã¯ãã£ãã䜿çšãããããšã¯æ¯èŒçãŸãã§ãããããŸããŸv-scope
ãšåŒã°ãããã®ã®å Žåã¯ããã«ããã§ãããããã£ãŠã圱é¿ã¯æå°éã«æããããŸãã
å®éã«çºçããå Žåã§ããã«ã¹ã¿ã ãã£ã¬ã¯ãã£ãã®ååãå€æŽããã ãã§ç°¡åã«å¯ŸåŠã§ããŸãã
ãããã åŒæ°ã䜿çšããŠã¹ãããåãæå®ããããšãèããŠããŸããããããã«ãããè€æ°ã®ãã£ã¬ã¯ãã£ãvã¹ã³ãŒããåãã³ã³ããŒãã³ãã§äœ¿çšã§ãããããã³ã³ããŒãã³ãã«æäŸãããã³ã³ãã³ããåå©çšã§ããŸãã ãããæçšãã©ããããŸãã¯åé¡ã«ã€ãªããå¯èœæ§ããããã©ããã¯ããããŸãã
å šäœçã«ãããã«ãããæéãšãšãã«äœ¿çšãããã¬ã³ããªã³ã°ã¬ã¹ã³ã³ããŒãã³ãã®API䜿çšãæ¹åãããŸãð
ç§ãæ£ããç解ããŠããã°ã v-scope
ã¯1ã€ã®ãŠãŒã¹ã±ãŒã¹ã«ãã圹ç«ã¡ãŸããã æžã代ããã«ïŒ
<foo>
<template slot-scope="{ item }">{{ item.id }}</template>
</foo>
æã ã¯æžããïŒ
<foo v-scope="{ item }">{{ item.id }}</foo>
ãã®å Žåãããªãã®ãã€ãºãæžå°ããŸããããããå¯äžã®ã±ãŒã¹ã®ããã§ãã æ°ãããã£ã¬ã¯ãã£ããå°å
¥ããã®ã¯ãããçš®ã®ããéãã®ããã«æããŸãïŒã³ã³ããŒãã³ãã§ã®ã¿æ©èœãããã®äžã®<slot>
ããžãã¯ã«äŸåããŠããããã v-for
ããã§ããä»ã®ãã£ã¬ã¯ãã£ããšã¯ãŸã£ããç°ãªãåäœãããŸãïŒã ãã1ã€ã®æžå¿µã¯ããã®ãªããžããªã§æ€çŽ¢ãããšããã³ãã¬ãŒããµãããªãŒïŒhttps://github.com/vuejs/vue/issues/5269ïŒã®ããŒã¿ã¹ã³ãŒãã®çž®å°ã«ã€ããŠè©±ãåã£ãŠããã®ã¯2åã ãã§ãããšããããšã§ãã ïŒissuecomment-288912328ãhttpsïŒ//github.com/vuejs/vue/issues/6913ïŒãJavaScriptã§with
ã©ã®ããã«æ©èœããããªã©ã
ããã¯ããã§ããã ç§ã«æ®ã£ãŠãã1ã€ã®è³ªåã¯ãååä»ãã¹ããããã©ã®ããã«åŠçãããããšããããšã§ãã ååä»ãã¹ããããåããã£ã¬ã¯ãã£ãã䜿çšã§ããããã«ããå Žåã¯ã <template>
ã§ãèš±å¯ããå¿
èŠããããŸãã
<comp v-scope="scope">
{{ scope.msg }} <!-- default slot, inheriting from the scope from above -->
<template slot="someName" v-scope="otherScope">
<p>{{ otherScope }}</p>
<div> whatever</div>
</template>
</comp>
ãã®æ©äŒãå©çšããŠã sot-scope
ãå»æ¢ããVue 3ã§åé€ããŠã v-scope
ã«çœ®ãæããããšãã§ããŸãã
åãããšã«ã€ããŠã2ã€ã®ç°ãªãæŠå¿µïŒ v-scope
ãã£ã¬ã¯ãã£ããšslot-scope
å±æ§ïŒã§çµããã¹ãã§ã¯ãªããšæããŸãã
è£è¶³ïŒä»ããããèŠããšã人ã
ã¯èŠçŽ ã®éå±€ããå°è±¡ãåŸããããããŸããïŒ
æå®ãããã¹ãããã®otherScope
ããã³scope
ã«ã¢ã¯ã»ã¹ã§ãããã£ã¬ã¯ãã£ãã ãã€ãã¹é¢ãããããŸããã
@LinusBorgãšããååã®å ŽåãåŒæ°ã¯v-scope:slotName
å®è¡ã§ããŸãã ã³ã³ããŒãã³ãã§ã®ã¿ãããèš±å¯ããããšã®ãã€ã³ãã¯ã @ Justineoãèšã£ãããšã眮ãæããããšã ãšæããŸãïŒhttps://github.com/vuejs/vue/issues/9180#issuecomment-446168296ïŒ
è£è¶³ïŒä»ããããèŠããšã人ã ã¯èŠçŽ ã®éå±€ããå°è±¡ãåŸããããããŸããïŒ
æå®ãããã¹ãããå ã®ä»ã®ã¹ã³ãŒãããã³ã¹ã³ãŒãã«ã¢ã¯ã»ã¹ã§ãããã£ã¬ã¯ãã£ãã ãã€ãã¹é¢ãããããŸããã
ããã¯ããŸããããŸãããïŒ ð€ã¹ãããã¹ã³ãŒãããã¹ããããšç¢ºä¿¡ããŠããŸã
ããã¯ããŸããããŸãããïŒ ð€ã¹ãããã¹ã³ãŒãããã¹ããããšç¢ºä¿¡ããŠããŸã
ç§ã¯ãããããã¹ãããŸããã§ããããããããããã¯å
åŒã¹ãããã§ãã ç§ã¯ãããã©ã«ãã®ã¹ãããã®ç¯å²ãå®çŸ©ããv-scope
ã³ã³ããŒãã³ãäžãããã³ïŒå
åŒã¹ãããã§ããïŒãšããååã®ã¹ãããã§<template slot="someName">
èŠãïŒ çŽããããã§ã^^
@LinusBorg䜿ãæ¹ã
v-scope
ãã³ã³ããŒãã³ãã§çŽæ¥äœ¿çšãããŠããå Žåãããã¯ããã©ã«ãã®ã¹ãããã®ã¿ã䜿çšããŠããããšãæå³ããŸããslot
+ slot-scope
ã䜿çšããå¿
èŠããããŸããv-scope
ãšslot-scope
äž¡æ¹ã䜿çšãããšãç¹ã«çŸåšã®èšèšã«ã©ã®ããã«å°éããããç¥ããªãæ°èŠãŠãŒã¶ãŒã«ãšã£ãŠãäžè²«æ§ããªãæ··ä¹±ããå¯èœæ§ãããããšã«åæããŸãã
åæããããšãããšã次ã®ãããªãœãªã¥ãŒã·ã§ã³ãå¿ èŠãªããã§ãã
ç§ã¯ããããã¹ãŠã«å¯ŸåŠãã解決çããããããããŸããïŒ ð€ã§$event
ã«ã€ããŠv-on
ãæã
ã¯ååä»ãåŒæ°ãé°é¢æ°å
ã§å®è¡è¡šçŸãæäŸããå
äŸãæã£ãŠããŸãã 人ã
ã¯ãã®äŸ¿å©ãã楜ããã§ããããã§ãããã«ãã£ãŠåŒãèµ·ããããæ··ä¹±ã¯ããŸãèŠãããªãã®ã§ãã¹ã³ãŒãä»ãã¹ãããã«ã€ããŠã¯ãã®äŸã«åŸãå¿
èŠããããããããŸããã
v-scope
ã䜿çšãã代ããã«ãã¹ãããã¹ã³ãŒãã$slot
ãšããŠäœ¿çšã§ããããã«ããããšãã§ããŸãã äŸãã°ïŒ
<TodoList :todos="todos">
{{ $slot.todo.text }}
<template slot="metaBar">
You have {{ $slot.totals.incomplete }} todos left.
</template>
</TodoList>
ã³ã³ããã¹ãã§ã¯ãåãã³ãã¬ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
<ul>
<li v-for="todo in todos">
<slot :todo="todo" />
</li>
</ul>
<div>
<slot name="metaBar" v-bind="itemsStats" />
</div>
ã¹ãããããã¹ããããŠããå Žåã $slot
ãªããžã§ã¯ãã¯ã¹ãããããŒã¿ãããŒãžããæãå
åŽã®ã¹ããããåªå
ãããŸãã ããšãã°ã次ã®ããã«ãªããŸãã
<Outer>
<Middle>
<Inner>
{{ $slot }}
</Inner>
</Middle>
</Outer>
ããŒãžã¯æ¬¡ã®ããã«ãªããŸãã
$slot = {
...outerSlotData,
...middleSlotData,
...innerSlotData
}
åå空éã®éè€ãã©ã®ããã«åŠçãããã«ã€ããŠå¿é /çåã«æããããããŸãããã99.9ïŒ ã®å Žåããããåé¡ã«ãªããšã¯æããŸããã äŸãã°ïŒ
<UserData id="chrisvfritz">
My email is {{ $slot.user.email }}, but you can reach Sarah at
<UserData id="sdras">
{{ $slot.user.email }}
</UserData>.
</UserData>
äžèšã®äŸã§$slot.user
ããã¹ãã¹ã³ãŒãã«é¢ä¿ãªãã
<UserData id="chrisvfritz">
<template slot-scope="me">
<UserData id="sdras">
<template slot-scope="sarah">
<CollaborationPageLink :user-ids="[me.user.id, sarah.user.id]">
View your collaboration history
</CollaborationPageLink>
</template>
</UserData>
</template>
</UserData>
ãããã®ãŸããªãšããžã±ãŒã¹ã§ã¯ããŠãŒã¶ãŒã¯çŸåšã®åäœã§slot-scope
ããšã¹ã±ãŒãããããšããŠäœ¿çšã§ããŸãã ãããã v-scope
ã¯ãŸã äžèŠã§ããç§ãæ£ããç解ããŠããã°ããã®ç®çã¯ãåãåé¡ãåŒãèµ·ããããšãªã$slot
ãªããžã§ã¯ãããã§ã«éæããŠããæãäžè¬çãªãŠãŒã¹ã±ãŒã¹ãåçŽåããããšã§ããããã§ãã
ãŠãŒã¶ãŒãã¹ãããã«ãã£ãŠæäŸãããããŒã¿ã«ã¢ã¯ã»ã¹ãããå Žåãå¯äžã®å®åæã¯$slot
ãããã¯ãæ瀺çãªãŸãŸ
ã¢ã¯ã»ã¹ã§ããããŒã¿ãç¥ãã«ã¯ããŠãŒã¶ãŒã¯ã³ã³ãã³ããã¬ã³ããªã³ã°ãããã¹ãããã«ã€ããŠèããã ãã§æžã¿ãŸãã v-scope
å Žåãã¹ã³ãŒãä»ãã³ã³ããã¹ãããããã£ãå®çŸ©ããä»ã®ãã£ã¬ã¯ãã£ãã¯v-for
ã ããªã®ã§ã
ãŠãŒã¶ãŒã¯ã
å Žåã«ãã£ãŠã¯ãç¹ã«ãã¹ãŠãç¶æ
ãæäŸããå€ãã®ãã¹ããããã¹ãããã§ã¯ãã©ã®ç¶æ
ãã©ã®ã³ã³ããŒãã³ãããæ¥ãã®ããæ確ã§ã¯ãªãããŠãŒã¶ãŒã¯åã³slot-scope
ã«å°éããå¿
èŠããããŸãã ããã¯äžå©ã«èããããããããŸãããããã¹ããããã¹ã³ãŒãã¹ããããèŠããšãã»ãšãã©ã®å Žåãã¹ããŒããããã€ããŒãã¿ãŒã³çšã§ãããã¢ã³ããã¿ãŒã³ã§ãããšåŒ·ãæããŠããŸãã ãããç§ã®æšè«ã§ãã ãããã£ãŠããã¹ããããã¹ã³ãŒãã¹ãããã®å€ããããå€ãã®ãã€ã©ãŒãã¬ãŒããå¿
èŠãšãããšããäºå®ã¯ãå®éã«ã¯ã¢ã³ããã¿ãŒã³ã®äœ¿çšãæžããå¯èœæ§ããããŸãã
ã»ãšãã©ã®Vueéçºè
ã¯åãªããªããžã§ã¯ãã§ãã$slot
ãèŠããã ãã§ããããã APIã®è¡šé¢ç©ã¯å€§å¹
ã«åæžãããŸãã
$
ãã¬ãã£ãã¯ã¹ãä»ããããããã£ã䜿çšããããšã§ã $slot
ãVueã®ãã®ã§ããããšãæ確ã«ããæ¹æ³ã§Webã³ã³ããŒãã³ãã¹ãããAPIãæ§ç¯ããŠããŸãã
çŸåšãã©ã€ãã©ãªã¯<slot v-bind="user" />
ãããªããšãããããšãå€ãããŠãŒã¶ãŒã¯slot-scope="{ user }
代ããã«slot-scope="user"
æ°æåãä¿åã§ããŸãã äžèŠãšã¬ã¬ã³ãã«èŠããŸãããã¢ã³ããã¿ãŒã³ãšããŠäœéšããããã«ãªããŸããã ãã®åé¡ã¯ãã³ã³ããŒãã³ãããŠãŒã¶ãŒä»¥å€ã®ããŒã¿ãå
¬éãããå Žåã«çºçããŸãã 次ã«ã2ã€ã®éžæè¢ããããŸãããŠãŒã¶ãŒãšã¯ã»ãšãã©é¢ä¿ããªãå Žåã§ããAPIã«é倧ãªå€æŽãå ãããããã®æ°ããããããã£ãuser
ãªããžã§ã¯ãã«åŒ·å¶ããŸãã ã©ã¡ããçŽ æŽãããéžæè¢ã§ã¯ãããŸããã 幞ãã $slot
ã¯ãã³ã³ããŒãã³ãã®å°æ¥æ§ãäœäžãããããšããèªæãåãé€ããŸãã $slot
ã¯ãŸã $slot.user
ãããçãã®ã§ããããŠãŒã¶ãŒã$slot
ãšããŠãšã€ãªã¢ã¹ãããšãéèŠãªã³ã³ããã¹ãã倱ãããããã§ãã
slot-scope
ã«å°éã§ããããã倧ããããšã§ã¯ãªããšæããŸãã ããã«ãåè¿°ããããã«ããããããã®åé¡ãçºçããå ŽåããŠãŒã¶ãŒãå·ã®ãããã€ããŒã³ã³ããŒãã³ãã䜿ã£ãŠèªåã®è¶³ãæã£ãŠããå¯èœæ§ãéåžžã«é«ããšæããŸãã$
å§ãŸãããããã£ã¯ãVueã€ã³ã¹ã¿ã³ã¹å
šäœã§äžè²«ããŠããå¿
èŠããããšæããŸãã $slot
ãåã¹ãããã«æé»çã«æ¿å
¥ããããšã§æ··ä¹±ãçãããã©ããã¯ããããŸããããå®éã«ã¯ãããã®ã¹ãããã¹ã³ãŒãå
ã®ããŒã«ã«åŒæ°ãè¡šããŠããŸãã $
å§ãŸãããããã£ã¯ããã¹ãŠã®Vueã€ã³ã¹ã¿ã³ã¹ã§äœ¿çšã§ãããã®ãè¡šããããã©ã€ããµã€ã¯ã«ããã¯ãã¡ãœãããã¬ã³ããªã³ã°é¢æ°ãªã©ãã©ãã§ã䜿çšã§ãããšããæ
£ç¿ã®ãããªãã®ã§ãïŒç§ã®èŠ³å¯ã«ãããšïŒã ãã®ç¹å¥ãª$slot
ãè¿œå ãããšããã®èŠåãç ŽãããŸãã
@chrisvfritzããã¯èå³æ·±ãææ¡ã§ãããéåžžã®ã¹ããããšã¹ã³ãŒãã¹ããããçµ±åãããŠããããšã«äŸåããŠããŸãïŒãããã£ãŠãv3ã§æ€èšã§ãããã®ãããããŸããïŒã ããã«é¢ããæ倧ã®åé¡ã¯ãã¹ãããã³ã³ãã³ããåã³ã³ããŒãã³ãã®$slots
ãŸãã¯$scopedSlots
ãã©ããã§ãã å¯äžã®ãã³ãã¯ãåŒã®ã©ããã«$slot
ãååšããããšã§ãïŒããªãŒã®ã©ãã«ã§ãé
眮ã§ããŸãïŒãããã¯ã slot-scope
ïŒã¹ãããã«ãŒãã«ã®ã¿ååšã§ããŸãïŒã»ã©æ瀺çã§ã¯ãããŸããã æè¡çã«ã¯ã³ã³ãã€ã©ã§ãããæ€åºã§ããŸããããŠãŒã¶ãŒããã³ãã¬ãŒãã§$slot
ã䜿ãå§ãããšãã¹ãããã¯$slots
ãã$scopedSlots
ããŸã...
ããã¯JSXãŠãŒã¶ãŒã«å€§ããªåœ±é¿ãäžããŸããïŒ
@donnysimããããããã¯JSXã«ã¯ãŸã£ãã圱é¿ããŸããã
$
å§ãŸãããããã£ã¯ãVueã€ã³ã¹ã¿ã³ã¹å šäœã§äžè²«ããŠããå¿ èŠããããšæããŸãã$slot
ãåã¹ãããã«æé»çã«æ¿å ¥ããããšã§æ··ä¹±ãçãããã©ããã¯ããããŸããããå®éã«ã¯ãããã®ã¹ãããã¹ã³ãŒãå ã®ããŒã«ã«åŒæ°ãè¡šããŠããŸãã
@Justineoæåã¯åãèãã§ãããã $event
ã§ãããè¡ã£ãŠããã誰ãæå¥ãèšã£ãŠããªãããã§ãããã®ããããã§ã«åäŸãããããŠãŒã¶ãŒã¯éåžžæ··ä¹±ãããæ¬åœã«äŸ¿å©ã§ãããšãã蚌æ ããããŸãã
ããã«é¢ããæ倧ã®åé¡ã¯ãã¹ãããã³ã³ãã³ããåã³ã³ããŒãã³ãã®
$slots
ãŸãã¯$scopedSlots
ãã©ããã§ãã
@ yyx990803ãã°ããã質åã§ãïŒ ç§ã¯ããŸããããããããªããšããèããæã£ãŠããŸãã ãããŸããªå ŽåïŒ $slot
ã䜿çšããŠãã¹ããããã¹ãããïŒããã¹ãŠã®ã¹ããããã¹ã³ãŒãã¹ãããã«ã³ã³ãã€ã«ããã ãã§ãªãããã¹ãŠã®$scopedSlots
ã$slots
äžã§ã²ãã¿ãŒãšããŠäœ¿çšã§ããããã«ãããšã©ããªããŸããïŒ ããšãã°ã次ã®ãããªãã®ã§ãã
for (const slotName in vm.$scopedSlots) {
// Don't override existing slots of the same name,
// since that's _technically_ possible right now.
if (vm.$slots[slotName]) continue
Object.defineProperty(vm.$slots, slotName, {
get: vm.$scopedSlots[slotName],
enumerable: true,
configurable: true,
writable: true
})
}
ãã®ããã«ã次ã®å ŽåïŒ
<A>
<B>
{{ $slot.foo }}
</B>
</A>
次ã®ããã«ã³ã³ãã€ã«ã§ããŸãã
// Assume new render helper:
// _r = mergeSlotData
_c('A', {
scopedSlots: _u([
{
key: 'default',
fn: function(_sd) {
var $slot = _r($slot, _sd)
return [
_c('B', {
scopedSlots: _u([
{
key: 'default',
fn: function(_sd) {
var $slot = _r($slot, _sd)
return [_v(_s($slot.foo))]
},
},
]),
}),
]
},
},
]),
})
ãŸãã foo
ã<A>
ã<B>
ããã®ãã®ãã¯é¢ä¿ãããŸããããããã®ã³ã³ããŒãã³ãå
ã§ã¯ã this.$slots.default
ãšthis.$scopedSlots.default(someData)
äž¡æ¹ãæ©èœããããã§ãã
ããã€ãã®æ³šæç¹ïŒ
ãã¹ããããã¹ãããããããå®éã«ã¹ã³ãŒããèšå®ãããŠããã®ã¯äžéšã®ã¿ã®å Žåã $slot
ã䜿çšããŠãã³ãã¬ãŒãããã³ã³ãã€ã«ãããã¬ã³ããªã³ã°é¢æ°ã¯ã slot-scope
ã䜿çšããå Žåããããããã«å€§ãããªããŸãã ããã»ã©éèŠã§ã¯ãªãã®ã§ã倧äžå€«ã ãšæããŸãã
å®éã®äŸã¯èããããŸãããããŠãŒã¶ãŒã$slots
/ $scopedSlots
ãç¹°ãè¿ãåŠçããŠããŠãæ°ããããããã£ãéè€ããããããã£ããããšãäºæããªãåäœãçºçããå¯èœæ§ããããŸãã 以åãåçã«ååãä»ãããã$slots
ãš$scopedSlots
ãç¹°ãè¿ããŠãããã€ãã®èå³æ·±ããã¿ãŒã³ãæå¹ã«ããŸãããããã®å€æŽã¯ãééããã©ã®ãŠãŒã¹ã±ãŒã¹ã«ã圱é¿ããŸããã
èãïŒ
ç§ãã¡ã¯
$event
è¡ãã誰ãæå¥ãèšããªãããã§ã
@chrisvfritzãããç§ã¯$event
ããšãèŠéããŸããã ããã¯æããã«èŠåã®äŸå€ã§ããïŒç§ã¯ãããð
ã ãšä¿¡ããŠããŸããïŒã $event
ã¯éåžžã«éãããã¹ã³ãŒãã§ã®ã¿äœ¿çšã§ããŸãïŒv-bindå±æ§ãªãã©ã«å
ã§ã®ã¿äœ¿çšã§ãããã¹ãã¯ãããŸããïŒã
ãããŠããããã·ã®ããã®$scopedSlots
ã®$slots
ïŒ
以åã¯ãã¹ããããšã¹ã³ãŒãã¹ãããã¯ç°ãªãæŠå¿µã§ãããVueã¯ããããå¥ã
ã«äœ¿çšããŠãããšä¿¡ããŠããŸãããã€ãŸããã¹ããããšã¹ã³ãŒãã¹ãããã®äž¡æ¹ã§åãååãå
±æã§ããŸãããç®çã¯ç°ãªããŸãã ãããåŸã§ãæå®ãããã¹ã³ãŒãã¹ãããã䜿çšã§ããªãå ŽåãVueãå®éã«ã¯åãååã®ã¹ãããã«ãã©ãŒã«ããã¯ããããšãããããŸããã ç§ã«ãšã£ãŠããã¯ãããããåããã®ãšèŠãªãå¿
èŠãããããšãæå³ããŸãããåã€ã³ã¹ã¿ã³ã¹ã§$slots
ãš$scopedSlots
äž¡æ¹ã䜿çšã§ãããããã¬ã³ããªã³ã°é¢æ°ã§ããæè»ã§äºæããªãæ¹æ³ã§ãã€ã§ã䜿çšã§ããŸãã ãããã©ã«ãã®ã¹ãããã䜿çšããŠãã¹ãŠã®ãªã¹ãã¢ã€ãã ããªãŒããŒã©ã€ãããããã©ã«ãã®ã¹ã³ãŒãã¹ãããã䜿çšããŠåäžã®ã¢ã€ãã ããªãŒããŒã©ã€ããããããªãã®ã§ãã 3.0ã§ã¯ã¹ãããã®åäžã®æŠå¿µã«ããŒãžããå¯èœæ§ãé«ããããããã¯å®éã«ã¯æšå¥šãããŠããŸããïŒããã¥ã¡ã³ããšã¹ã¿ã€ã«ã¬ã€ãAFAIKã§ããã«é¢ããæšå¥šããã䜿çšæ³ãææ¡ããŠããŸããïŒãã2.xã§ããŒãžãããšæ©èœããªããªããŸãããªãé·ãéãããã€ãã®äœ¿çšãèš±å¯ãããŸããã
3.0ã§ã¯ããããã¹ãããã®åäžã®æŠå¿µã«ããŒãžããå¯èœæ§ããããŸããã2.xã§ããŒãžãããšãããªãé·ãé䜿çšãããŠãã䜿çšæ³ãç ŽãããŸãã
@Justineo誀解ããŠãããããããŸãããããã§ã«2.xã«ããŒãžããããšã¯ææ¡ããŠããŸãããçŸåšã®ãã©ãŒã«ããã¯åäœãæ¡åŒµããã ãã§ãã $slots
ãš$scopedSlots
äž¡æ¹ãåãåå空éã䜿çšããã説æãããŠãŒã¹ã±ãŒã¹ã¯ã slot-scope
ã®åäœãå€æŽãããªããããåŒãç¶ãå¯èœã§ãã äŸãã°ïŒ
<div>
Default slot
<template slot-scope="foo">
Default scoped slot {{ foo }}
</template>
</div>
ããã§ããŸã£ããåãããã«æ©èœããŸãã ããã¯çã«ããªã£ãŠããŸããïŒ
@chrisvfritz
2.xã§ããããããŒãžããããšã«ã€ããŠè©±ããŠããŸããã§ããã ããªããããããããªãç§ã¯èšã£ãŠããŸããïŒ
ãã¹ãŠã®
$scopedSlots
ã$slots
äžã§ã²ãã¿ãŒãšããŠå©çšã§ããããã«ããŸã
$slots.foo
ãš$scopedSlots.foo
ãåºå¥ããŠãã¬ã³ããªã³ã°é¢æ°ã§å¥ã
ã«äœ¿çšããããšã¯ã§ããªããªããŸããã
$ slots.fooãš$ scopedSlots.fooãåºå¥ããŠãã¬ã³ããªã³ã°é¢æ°ã§å¥ã ã«äœ¿çšããããšã¯ã§ããªããªããŸããã
æ£çŽãªãšããããã¹ãŠïŒslotsãšscopedSlotsïŒãscopedSlotsã§é¢æ°ãšããŠã¢ã¯ã»ã¹ã§ããããã«ãªãã°å¹žãã§ããã€ãŸããã¬ã³ããªã³ã°ããã¹ããããç¡é§ã«ãã§ãã¯ããå¿ èŠããªããªããŸãã éçºè ãã©ã®ã¿ã€ãã®ã¹ãããã䜿çšãããã¯ãã³ã³ããŒãã³ãã®èŠ³ç¹ããã¯å®éã«ã¯éãã¯ãããŸããã JSXãšãã³ãã¬ãŒãæ§æã®æ··åãŠãŒã¶ãŒããæ¥ãŠããŸãã
@donnysimã¯ããããããããŒãžããå¿ èŠãããããšã«åæããŸãã https://github.com/vuejs/vue/issues/9180#issuecomment-447185512ã§ãã®ãããªæžå¿µãããçç±ã説æããŸããã ããã¯äžäœäºææ§ã«ã€ããŠã§ãã
$slots.foo
ãš$scopedSlots.foo
ãåºå¥ããŠãã¬ã³ããªã³ã°é¢æ°ã§å¥ã ã«äœ¿çšããããšã¯ã§ããªããªããŸããã
@Justineo $slots
æåã«åŠçããå®çŸ©æžã¿ã®ã¹ãããã眮ãæããªãéããå®éã«ã¯_ã§ããŸã
for (const slotName in vm.$scopedSlots) {
// Don't override existing slots of the same name,
// since that's _technically_ possible right now.
if (vm.$slots[slotName]) continue
Object.defineProperty(vm.$slots, slotName, {
get: vm.$scopedSlots[slotName],
enumerable: true,
configurable: true,
writable: true
})
}
@chrisvfritz
次ã®äŸãèããŠã¿ãŸãããã
render (h) {
if (!this.$slots.default) {
return h(
'div',
this.items.map(item => this.$scopedSlots.default(item))
)
}
return h('div', this.$slots.default)
}
ã³ã³ããŒãã³ããŠãŒã¶ãŒãvm.$scopedSlots.default
ã®ã¿ãæž¡ããå Žåã¯ã this.items
ãã«ãŒãããŠã item
ã¹ã³ãŒãã¹ãããã«ã¬ã³ããªã³ã°ããå¿
èŠããããŸãã ãããã vm.$scopedSlot.default
ãã¹ã³ãŒãã¹ãããã«ãªããååšããããã«ãªã£ããããã¹ãããã®ä»£ããã«ã¹ã³ãŒãã¹ããããåŒã³åºãããŸãã
@Justineoãã®ãŠãŒã¹ã±ãŒã¹ã¯éåžžã«ãŸãã ãšæããŸããããã¿ãŒã³ãå€æŽããããšã§å¯èœã«ãªããŸãã
if (!this.$slots.default) {
ã«ïŒ
if (this.$scopedSlots.default) {
ãŸãã¯ããŠãŒã¶ãŒãäœããã®çç±ã§ç¡èŠãããã¯ãã®ã¹ã³ãŒãã¹ããããæäŸããããšãããå ŽåïŒ
if (!Object.getOwnPropertyDescriptor(this.$slots, 'default').value) {
ããããç§ã¯ãŸã ãããé倧ãªå€åã ãšã¯æããŸããã ãŸããåãååã®ã¹ããããšã¹ã³ãŒãã¹ãããã®äœ¿çšãææžå/æšå¥šããããšããªããããå ¬éå¥çŽã®äžéšã§ã¯ãããŸããã§ããã 次ã«ãåè¿°ã®ããã«ããã³ãã¬ãŒãã®ã¹ã³ãŒãã¹ãããã¯ãåãååã®ã¹ã³ãŒããªãã¹ãããã«ãã§ã«ãã©ãŒã«ããã¯ããŠããŸããããã¯ãã¹ã³ãŒãä»ã/ã¹ã³ãŒããªãã®å¢çããã®ããã«äœ¿çšããããšãæå³ããŠããªãã£ããšããæŽå²çãªèšŒæ ãšããŠåœ¹ç«ã¡ãŸãã
ããã¯çã«ããªã£ãŠããŸããïŒ ãŸããã¹ãããåãåå©çšããããã®å®éã®äœ¿çšäŸãèŠãããšããããŸããïŒ ãããšãäœãèããããŸããïŒ ã§ããŸãããããããå¯èœã«ãã䟿å©ã§ãŠããŒã¯ãªãã¿ãŒã³ãããã°ãVue 3ã§ããããããŒãžãããšããç§ãã¡ã®æ±ºå®ã«ã圱é¿ãäžããã®ã§ãä»ãããããã«ã€ããŠåŠã¶ã®ã¯è¯ãããšã§ãã
ã¹ã³ãŒãã¹ããããšåãååã®ç°ãªãç®çã®ã¹ãããã¯
æªãèãã ç§ã¯ãããVueã®ãã¬ããŒãžã§ã³ã§äœ¿çšããçŽæããŠåé€ããŸãã
æ··ä¹±ããŠããããã§ãã ãããŠä»ãç§ã¯äž¡æ¹ã®ããã©ã«ãã¹ãããããã§ãã¯ããå¿
èŠããããŸã
éçºè
ãããŒã¿ãæ¶è²»ããã«ã¹ããããæäŸã§ããããã«ãã¹ã³ãŒãä»ãã¹ãããã
ãããŠãç§ãæ£ããæãåºãã°ã䜿çšãããšãã«åãååãæã€ããšã¯ã§ããŸãã
ãã³ãã¬ãŒãã
@chrisvfritz
ç§ã¯ãã®ãã¿ãŒã³ãæçšã§ããããµããŒããããã¹ãã ãšèšã£ãŠããŸããã§ããã ããã¯ç¢ºãã«æ··ä¹±ãåŒãèµ·ããå¯èœæ§ããããŸãã ç§ãèšã£ãŠããã®ã¯ãæ¢åã®ã³ãŒããå£ãå¯èœæ§ã
@posvaããªãã®çµéšãå ±æããŠãããŠããããšãïŒ
@Justineoããªãã®æèŠã§ã¯ããã®ãšããžã±ãŒã¹ã¯ãŠãŒã¶ãŒã«é床ã®èŠçããããããšæããŸããããããšãVue 2.xã®ã¹ã³ãŒãã¹ãããAPIãæ¹åããã®ã«äŸ¿å©ã§ãããšæããŸããïŒ
ããã¯ãTodoãã«ç§»ãããŸãã-äœãå®è£ ãããã«ã€ããŠã®ã³ã³ã»ã³ãµã¹ã¯ãããŸããïŒ
ç§ã¯å
é±ããã«ã€ããŠèããŠããŸããã @chrisvfritzã®$slot
å€æ°ã®ææ¡ã奜ãã§ãå®è£
ãããã«ãŒã解決ããããšããŠããŸããã ãããç§ãå®è¡å¯èœã ãšæãããšã§ãïŒ
$scopedSlots
ã¯ããã¹ãŠã®ã¹ããããé¢æ°ãšããŠå
¬éããŸã$slots
ã¯ã空ã®ãªããžã§ã¯ãã§å¯Ÿå¿ããé¢æ°ãåŒã³åºããçµæãšããŠããã¹ãŠã®ã¹ããããå
¬éããŸãããããã£ãŠã以äžã¯åçã§ãã
this.$slots.default
// would be the same as
this.$scopedSlots.default({} /* $slot */)
äžèšã®å
éšå€æŽã«ããã $slots
ãš$scopedSlots
ã¯åºæ¬çã«çµ±åãããŠããŸãããäžäœäºææ§ãããã¯ãã§ãã ãŸãã3.0ãžã®ç§»è¡ã容æã«ãªãã¯ãã§ãã
ææ¡ããã$slot
å€æ°ã䜿çšããããã€ãã®äœ¿çšäŸïŒ
<!-- list and item composition -->
<fancy-list>
<fancy-item :item="$slot.item"/>
</fancy-list>
<!-- hypothetical data fetching component -->
<fetch :url="`/api/posts/${id}`">
<div slot="success">{{ $slot.data }}</div>
<div slot="error">{{ $slot.error }}</div>
<div slot="pending">pending...</div>
</fetch>
ãã¹ããããã¹ã³ãŒããããŒãžããã®ã¯è¯ãèãã§ã¯ãªããšæããŸãã ãã¹ããå«ãŸããå Žåã¯æ瀺çã«ããæ¹ãè¯ããšæããŸãïŒã€ãŸããã¹ã³ãŒãã¹ãããããã¹ãããŠããå Žåã¯åžžã«slot-scope
䜿çšããŸãïŒã
<!-- nested usage -->
<foo>
<bar slot-scope="foo">
<baz slot-scope="bar">
{{ foo }} {{ bar }} {{ $slot }}
</baz>
</bar>
</foo>
æåŸã®äŸã§ã¯ãã©ã®ã¹ãããã$slot
ãåç
§ããŠããŸããïŒ
@Akryumããã¯{ ...foo, ...bar }
ã§ãã
@Akryum @JustineoããŒãããã¯çŽãããããããããŸãã...ã¹ãããã®ã«ãŒãèŠçŽ ã§slot-scope
䜿çšã§ããããã«ããŸãããã€ãŸããããã§foo
ã¯<foo/>
ã«ãã£ãŠæäŸãããã¹ãããã¹ã³ãŒãã§ãã bar
ã¯<bar/>
ã«ãã£ãŠæäŸããã $slot
ã¯<baz/>
ã«ãã£ãŠæäŸãããŸã...ä»ããã®ãããªäœ¿çšãèš±å¯ããã®ã¯ééãã ã£ããšæããŸãããã®å Žåã®ããçŽæçãªäœ¿çšæ³ã¯æ¬¡ã®ããã«ãªããŸãã
<!-- nested usage -->
<foo slot-scope="foo">
<bar slot-scope="bar">
<baz slot-scope="baz">
{{ foo }} {{ bar }} {{ baz }}
</baz>
</bar>
</foo>
ããã¯æ··ä¹±ããå¯èœæ§ããããŸã
ãã®å Žåã®ããçŽæçãªäœ¿çšæ³ã¯æ¬¡ã®ããã«ãªããŸã
å
šãåæã§ãããŸãã ãŸããåŒãç¶ãç Žå£ã䜿çšã§ããŸãã
äŸãã°ïŒ
`` `vue
<FieldValidation field="login" slot-scope="{ value, setValue, error }">
<LoginInput
:value="value"
:error="error"
@input="setValue"
/>
</FieldValidation>
<FieldValidation field="password" slot-scope="{ value, setValue, error }">
<PasswordInput
:value="value"
:error="error"
@input="setValue"
/>
</FieldValidation>
7988a554ããã³5d52262fçµç±ã§éé
æŠèŠïŒ
ãã¹ãŠã®ã¹ãããã§$slot
å€æ°ããµããŒãããŸãã ïŒ $slot
ãååšãããšãã¹ãããã¯ã¹ã³ãŒãä»ãã¹ããããšããŠã³ã³ãã€ã«ãããŸãïŒã
éåžžã®ã¹ããããå«ããã¹ãŠã®ã¹ãããããé¢æ°ãšããŠthis.$scopedSlots
å
¬éãããããã«ãªããŸããã ããã¯ã this.$slots.default
ãååšãããšä»®å®ãããšã this.$scopedSlots.default()
ã¯ãã®å€ãè¿ãããšãæå³ããŸãã ããã«ãããã¬ã³ããªã³ã°é¢æ°ã®ãŠãŒã¶ãŒã¯åžžã«this.$scopedSlot
ã䜿çšã§ããæž¡ãããã¹ããããã¹ã³ãŒããããŠãããã©ãããå¿é
ããå¿
èŠããªããªããŸãã ããã¯ããã¹ãŠã®ã¹ããããé¢æ°ãšããŠå
¬éãããŠãã3.0ãšãäžèŽããŠããŸãïŒãã ãã代ããã«this.$slots
ïŒã
slot-scope
䜿çšæ³ã«å€æŽã¯ãªããæ°ãããã£ã¬ã¯ãã£ãã®å°å
¥ããããŸããã æ§æã®å€æŽãæå°éã«æããæœåšçãªç Žæã3.0ã®ãŸãŸã«ããŠãããããšèããŠããŸãã
@ yyx990803 $slot
ãã¹ãŠã®å€éšã¹ãããã¹ã³ãŒããããŒãžããŸããããããšãæãè¿ãã¹ããããåç
§ããŸããïŒ
@Justineoã¯ããŒãžãããæãè¿ããã®ã§ãã
ç§ãã¢ã¯ã»ã¹ã§ããã¢ããªã®ã¹ã³ãŒãã¹ãããã®äœ¿çšç¶æ³ãèŠããšããã¹ããããã¹ãããã®ããŒãžåäœããªããšã $slot
çç¥åœ¢ã¯å®éã«ã¯åå匷ã®ã±ãŒã¹ã§äœ¿çšã§ããªãããã§ãã åé¡ã¯ãéåžžãçã®HTMLèŠçŽ ã®ä»£ããã«åºæ¬ã³ã³ããŒãã³ãã䜿çšããããããã®ã³ã³ããŒãã³ãã«ã¯ç¬èªã®ã¹ããããããããšãå€ãããšã§ãã äŸãã°ïŒ
<MapMarkers :markers="cities">
<BaseIcon name="map-marker">
{{ $slot.marker.name }}
</BaseIcon>
</MapMarkers>
äžèšã®äŸã§ã¯ã <MapMarkers>
ã³ã³ããŒãã³ãçšã®ã¹ã³ãŒãã¹ãããã¯1ã€ã ãã§ãã <BaseIcon>
ã¯ã¹ã³ãŒãã®ãªãã¹ããããåãå
¥ããŸãããã¹ãããããŸã£ããåãå
¥ããããã $slot
ã¯æªå®çŸ©ã§ããããããŒãžåäœã®ãªã空ã®ãªããžã§ã¯ãã§ãããããäžæ Œå¥œãªãªãã¡ã¯ã¿ãªã³ã°ã匷å¶ããŸãã
<MapMarkers :markers="cities">
<template slot-scope="{ marker }">
<BaseIcon name="map-marker">
{{ marker.name }}
</BaseIcon>
</template>
</MapMarkers>
ã ããããã«ç§ã®æžå¿µããããŸãïŒ
å°ãªããšãç§èªèº«ã®ãµã³ããªã³ã°ããã¯ã $slot
ã®å©ç¹ã®ã»ãšãã©_ããæãå
åŽã®ã¹ãããã®ã¿ãåç
§ããŠããå Žåã«å€±ãããå¯èœæ§ãããããã§ãã å®éã人ã
ãåŠã¶ããã®APIãå€ããããããã¯è¯ãããšããã害ãåãŒãå¯èœæ§ãããããŸãã
UIã©ã€ãã©ãªã¯ã $slot
ã䜿çšã§ããªããšãããŠãŒã¶ãŒã®èŠæ
ã«å¿ããŠãã¹ããããããé©åãªv-html
ã§å°éå
·ã䜿ãããå§ããå¯èœæ§ããããŸãã
ãŠãŒã¶ãŒã¯ãã¹ã³ãŒãã¹ãããã®äœ¿çšããããšã¬ã¬ã³ãã«ä¿ã€ããã«ãå Žåã«ãã£ãŠã¯ããŒã¹ã³ã³ããŒãã³ããé¿ãå§ããã³ãŒãã®ä¿å®æ§ãäœäžããå¯èœæ§ããããŸãã
@ yyx990803 $slot
ããŒãžã«é¢ããäž»ãªæžå¿µäºé
ã¯ãã©ã®ã³ã³ããŒãã³ãã¹ãããããŒã¿ããã®ãã®ããå€æããã®ãé£ãããšããããšã§ããïŒ ãããããªããç§ãã¢ã¯ã»ã¹ã§ããã¢ããªããã¹ããããã¹ã³ãŒãã¹ãããã䜿çšããå¯äžã®ã±ãŒã¹ã¯ãåè¿°ããããã«ã¢ã³ããã¿ãŒã³ã§ããããšãããã£ãç¶æ
ãããã€ããŒã³ã³ããŒãã³ãçšã§ãã£ãããšãç¥ã£ãŠãããšåœ¹ç«ã€ãããããŸããã ãããã£ãŠãç¹ã«ååã®ä»ããã¹ãããããããã£ã§ã¯ãæ£åœãªãŠãŒã¹ã±ãŒã¹ã§å®éã«ãããŸãã«ãªãã±ãŒã¹ã¯éåžžã«ãŸãã ãšæããŸãã ãŸããèªåããŒãžåäœã«ããããŠãŒã¶ãŒã¯ããæ確ã«ããå¿
èŠããããã©ãããèªåã§å€æã§ããŸããå¿
èŠãªå Žåã¯ããããslot-scope
ç®çã§ãã
ãã ãã劥åæ¡ãšããŠãèãããã代æ¿æ¡ããããŸãããã¹ããããã¹ã³ãŒãã¹ããããããŒãžãã代ããã«ã $slot
_ã¹ã³ãŒããæäŸãã_æãè¿ãã¹ããããåç
§ããå Žåã¯ã©ããªãã§ããããã ããã«ãããç§ã®æžå¿µã«å¯ŸåŠããªãããæããããŸããªã±ãŒã¹ãæé€ã§ããŸãã èãïŒ
ããŒãžãåé¿ããäž»ãªçç±ã¯ãéæ瀺æ§ã§ãããã³ãã¬ãŒããèªã¿åãã ãã§ã¯ãã©ã®$slot
ããããã£ãã©ã®ãããã€ããŒã³ã³ããŒãã³ãããã®ãã®ã§ããããå®éã«ã¯ããããŸããã ããã«ã¯ãäœãèµ·ãã£ãŠããã®ãã確èªããããã«ãèŠãŠããåã³ã³ããŒãã³ãã®å®è£
ã®è©³çŽ°ãå®å
šã«èªèããå¿
èŠããããããã¯å€ãã®ç²Ÿç¥çè² è·ãè¿œå ããŸãã ãã®æç¹ã§å®å
šãªã³ã³ããã¹ããé ã«ããã®ã§ãæžããŠããç¬éã¯åé¡ãªãããã«èããããããããŸããããå°æ¥ã®èªè
ïŒããªãã§ããããšä»ã®ããŒã ã¡ã³ããŒã§ããããšïŒã«ãšã£ãŠã³ãŒããç解ããã®ã¯ã¯ããã«å°é£ã«ãªããŸãã
$ slotã¯ãã¹ã³ãŒããæäŸããæãè¿ãã¹ããããæããŸã
ç§ã¯ãããããŸããããšã¯æããªãã åãåé¡ãçºçããŸããäœãèµ·ãã£ãŠããã®ãã確èªããã«ã¯ãã³ã³ããŒãã³ãã®å®è£ ã®è©³çŽ°ã«ã€ããŠç¥ãå¿ èŠããããŸãã ããŒãžãããããããã«æé»çã§æ··ä¹±ãæãå¯èœæ§ããããšæããŸãã
é·æçã«ã¯ã slot-scope
ã®ã»ãã³ãã£ã¯ã¹ãå€æŽããŠã $slot
ããšã€ãªã¢ã¹/éæ§é åããæ¹æ³ã«ãªãããã«ããã®ãæåã®è§£æ±ºçã ãšæããŸãã ãããã£ãŠãäŸã¯æ¬¡ã®ããã«ãªããŸãã
<MapMarkers :markers="cities" slot-scope="{ marker }">
<BaseIcon name="map-marker">
{{ marker.name }}
</BaseIcon>
</MapMarkers>
ããã«ãããããŒãžã®å¿ èŠããªããªããã©ã®å€æ°ãã©ã®ãããã€ããŒããã®ãã®ã§ããããæ確ã«ãªããé床ã«åé·ã«ãªããŸããã ïŒããã¯ãããã3.0ã§ããããšããŠããããšã ãšæããŸãïŒ
ç§ãã¡ãä»çŽé¢ããŠããåä»ãªç¹ã¯ã slot-scope
ãéãã³ãã¬ãŒãã§äœ¿çšã§ããããã«ããããšã§ããããã«ãããã³ã³ããŒãã³ãèªäœã§ããã䜿çšã§ããªããªããŸããã
3.0ã§ã»ãã³ãã£ã¯ã¹ãå€æŽãããšãå€ãã®æ··ä¹±ãšç§»è¡ã®åé¡ãçºçããå¯èœæ§ããããŸãã
ãã¶ããæ°ããããããã£slot-alias
å°å
¥ããããšã§ãwhileã®åé¡ãåé¿ã§ããŸããããã¯ã $slot
ãå¥ã®ããããã£ã«ãšã€ãªã¢ã¹ããŸãã slot-scope
ãšã¯ç°ãªããã³ã³ããŒãã³ãèªäœãŸãã¯ãã³ãã¬ãŒãã¹ãããã³ã³ããã§ã®ã¿äœ¿çšã§ããŸãïŒããã¯ã <template>
䜿çšããå Žåã«slot-scope
ãšãŸã£ããåãããã«æ©èœããããšãæå³ããŸãïŒ ïŒ
ãã¹ããããããã©ã«ãã¹ãããïŒ
<MapMarkers :markers="cities" slot-alias="{ marker }">
<BaseIcon name="map-marker">
{{ marker.name }}
</BaseIcon>
</MapMarkers>
<foo slot-alias="foo">
<bar slot-alias="bar">
<baz slot-alias="baz">
{{ foo }} {{ bar }} {{ baz }}
</baz>
</bar>
</foo>
ãã¹ããªãã®ååä»ãã¹ãããïŒ
å¿ ç¶çã«åé·ã«ãªãå¯äžã®ã±ãŒã¹ã¯ããã¹ããããã¹ããããšåŒã°ããŸãã
<foo>
<template slot="a" slot-alias="a">
<bar slot-alias="b">
{{ a }} {{ b }}
</bar>
</template>
</foo>
ïŒããã¯ãå®éã«ã¯slot-scope
ãšslot-alias
äž¡æ¹ã䜿çšããããšã§åé·æ§ãæžããããšãã§ããŸãããããªãæ··ä¹±ããå¯èœæ§ããããšæããŸãã slot-scope
å®å
šã«å»æ¢ããããšã«è³æã§ãïŒ
<foo>
<bar slot="a" slot-scope="a" slot-scope="b">
{{ a }} {{ b }}
</bar>
</foo>
æåŸã«ãçç¥åœ¢()
ä»ããããšãã§ããŸãïŒJSXã§ã¯ãã¬ã³ããªã³ã°å°éå
·ã¯éåžž()
ã§å§ãŸãç¢å°é¢æ°ã§ããããïŒïŒ
<MapMarkers :markers="cities" ()="{ marker }">
<BaseIcon name="map-marker">
{{ marker.name }}
</BaseIcon>
</MapMarkers>
<foo ()="foo">
<bar ()="bar">
<baz ()="baz">
{{ foo }} {{ bar }} {{ baz }}
</baz>
</bar>
</foo>
äžèšãåçã®JSXãšæ¯èŒããŠãã ããã
<foo>
{foo => (
<bar>
{bar => (
<baz>
{baz => `${foo} ${bar} ${baz}`}
</baz>
)}
</bar>
)}
</foo>
ãã¶ã€ã³ãåœåææ¡ããããã®ãšã¯å€§ããç°ãªããããç· ãããããŸãã 代ããã«æ°ããã¹ã¬ãããéããŸãã
æãåèã«ãªãã³ã¡ã³ã
åé¡ã®å èš³
åæããããšãããšã次ã®ãããªãœãªã¥ãŒã·ã§ã³ãå¿ èŠãªããã§ãã
ç§ã¯ããããã¹ãŠã«å¯ŸåŠãã解決çããããããããŸããïŒ ð€ã§
$event
ã«ã€ããŠv-on
ãæã ã¯ååä»ãåŒæ°ãé°é¢æ°å ã§å®è¡è¡šçŸãæäŸããå äŸãæã£ãŠããŸãã 人ã ã¯ãã®äŸ¿å©ãã楜ããã§ããããã§ãããã«ãã£ãŠåŒãèµ·ããããæ··ä¹±ã¯ããŸãèŠãããªãã®ã§ãã¹ã³ãŒãä»ãã¹ãããã«ã€ããŠã¯ãã®äŸã«åŸãå¿ èŠããããããããŸãããææ¡ããã解決ç
v-scope
ã䜿çšãã代ããã«ãã¹ãããã¹ã³ãŒãã$slot
ãšããŠäœ¿çšã§ããããã«ããããšãã§ããŸãã äŸãã°ïŒã³ã³ããã¹ãã§ã¯ãåãã³ãã¬ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
ã¹ãããããã¹ããããŠããå Žåã
$slot
ãªããžã§ã¯ãã¯ã¹ãããããŒã¿ãããŒãžããæãå åŽã®ã¹ããããåªå ãããŸãã ããšãã°ã次ã®ããã«ãªããŸããããŒãžã¯æ¬¡ã®ããã«ãªããŸãã
åå空éã®éè€ãã©ã®ããã«åŠçãããã«ã€ããŠå¿é /çåã«æããããããŸãããã99.9ïŒ ã®å Žåããããåé¡ã«ãªããšã¯æããŸããã äŸãã°ïŒ
äžèšã®äŸã§
$slot.user
ããã¹ãã¹ã³ãŒãã«é¢ä¿ãªãããããã®ãŸããªãšããžã±ãŒã¹ã§ã¯ããŠãŒã¶ãŒã¯çŸåšã®åäœã§
slot-scope
ããšã¹ã±ãŒãããããšããŠäœ¿çšã§ããŸãã ããããv-scope
ã¯ãŸã äžèŠã§ããç§ãæ£ããç解ããŠããã°ããã®ç®çã¯ãåãåé¡ãåŒãèµ·ããããšãªã$slot
ãªããžã§ã¯ãããã§ã«éæããŠããæãäžè¬çãªãŠãŒã¹ã±ãŒã¹ãåçŽåããããšã§ããããã§ããå©ç¹
ãŠãŒã¶ãŒãã¹ãããã«ãã£ãŠæäŸãããããŒã¿ã«ã¢ã¯ã»ã¹ãããå Žåãå¯äžã®å®åæã¯
$slot
ãããã¯ãæ瀺çãªãŸãŸã¢ã¯ã»ã¹ã§ããããŒã¿ãç¥ãã«ã¯ããŠãŒã¶ãŒã¯ã³ã³ãã³ããã¬ã³ããªã³ã°ãããã¹ãããã«ã€ããŠèããã ãã§æžã¿ãŸãã
v-scope
å Žåãã¹ã³ãŒãä»ãã³ã³ããã¹ãããããã£ãå®çŸ©ããä»ã®ãã£ã¬ã¯ãã£ãã¯v-for
ã ããªã®ã§ããŠãŒã¶ãŒã¯ã
å Žåã«ãã£ãŠã¯ãç¹ã«ãã¹ãŠãç¶æ ãæäŸããå€ãã®ãã¹ããããã¹ãããã§ã¯ãã©ã®ç¶æ ãã©ã®ã³ã³ããŒãã³ãããæ¥ãã®ããæ確ã§ã¯ãªãããŠãŒã¶ãŒã¯åã³
slot-scope
ã«å°éããå¿ èŠããããŸãã ããã¯äžå©ã«èããããããããŸãããããã¹ããããã¹ã³ãŒãã¹ããããèŠããšãã»ãšãã©ã®å Žåãã¹ããŒããããã€ããŒãã¿ãŒã³çšã§ãããã¢ã³ããã¿ãŒã³ã§ãããšåŒ·ãæããŠããŸãã ãããç§ã®æšè«ã§ãã ãããã£ãŠããã¹ããããã¹ã³ãŒãã¹ãããã®å€ããããå€ãã®ãã€ã©ãŒãã¬ãŒããå¿ èŠãšãããšããäºå®ã¯ãå®éã«ã¯ã¢ã³ããã¿ãŒã³ã®äœ¿çšãæžããå¯èœæ§ããããŸããã»ãšãã©ã®Vueéçºè ã¯åãªããªããžã§ã¯ãã§ãã
$slot
ãèŠããã ãã§ããããã APIã®è¡šé¢ç©ã¯å€§å¹ ã«åæžãããŸãã$
ãã¬ãã£ãã¯ã¹ãä»ããããããã£ã䜿çšããããšã§ã$slot
ãVueã®ãã®ã§ããããšãæ確ã«ããæ¹æ³ã§Webã³ã³ããŒãã³ãã¹ãããAPIãæ§ç¯ããŠããŸããçŸåšãã©ã€ãã©ãªã¯
<slot v-bind="user" />
ãããªããšãããããšãå€ãããŠãŒã¶ãŒã¯slot-scope="{ user }
代ããã«slot-scope="user"
æ°æåãä¿åã§ããŸãã äžèŠãšã¬ã¬ã³ãã«èŠããŸãããã¢ã³ããã¿ãŒã³ãšããŠäœéšããããã«ãªããŸããã ãã®åé¡ã¯ãã³ã³ããŒãã³ãããŠãŒã¶ãŒä»¥å€ã®ããŒã¿ãå ¬éãããå Žåã«çºçããŸãã 次ã«ã2ã€ã®éžæè¢ããããŸãããŠãŒã¶ãŒãšã¯ã»ãšãã©é¢ä¿ããªãå Žåã§ããAPIã«é倧ãªå€æŽãå ãããããã®æ°ããããããã£ãuser
ãªããžã§ã¯ãã«åŒ·å¶ããŸãã ã©ã¡ããçŽ æŽãããéžæè¢ã§ã¯ãããŸããã 幞ãã$slot
ã¯ãã³ã³ããŒãã³ãã®å°æ¥æ§ãäœäžãããããšããèªæãåãé€ããŸãã$slot
ã¯ãŸã$slot.user
ãããçãã®ã§ããããŠãŒã¶ãŒã$slot
ãšããŠãšã€ãªã¢ã¹ãããšãéèŠãªã³ã³ããã¹ãã倱ãããããã§ããçæ
slot-scope
ã«å°éã§ããããã倧ããããšã§ã¯ãªããšæããŸãã ããã«ãåè¿°ããããã«ããããããã®åé¡ãçºçããå ŽåããŠãŒã¶ãŒãå·ã®ãããã€ããŒã³ã³ããŒãã³ãã䜿ã£ãŠèªåã®è¶³ãæã£ãŠããå¯èœæ§ãéåžžã«é«ããšæããŸãã