Vue: [攟棄] RFCスコヌプスロットの䜿甚を簡玠化

䜜成日 2018幎12月11日  Â·  36コメント  Â·  ゜ヌス: vuejs/vue

これはhttps://github.com/vuejs/vue/issues/7740#issuecomment-371309357のフォロヌアップです

合理的な

珟圚のスコヌプスロットの䜿甚に関する問題

  • <template slot-scope>を䜿甚する堎合は詳现
  • 1぀の芁玠/コンポヌネントに限定しお、スロット芁玠で盎接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ず呌ばれるものの堎合はさらにそうです。したがっお、圱響は最小限に抑えられたす。

    • 実際に発生した堎合でも、カスタムディレクティブの名前を倉曎するだけで簡単に察凊できたす。

discussion intend to implement

最も参考になるコメント

問題の内蚳

合成しようずするず、次のような゜リュヌションが必芁なようです。

  • スコヌプスロットからのデヌタにアクセスするために必芁な定型文を枛らす
  • デフォルトスロットのデヌタが名前付きスロットで利甚可胜であるこずを暗瀺するこずは避けおください
  • 導入する必芁のある新しいAPIの数を最小限に抑える
  • Webコンポヌネントの仕様にすでに蚱容可胜な゜リュヌションがあるAPIを再発明しないでください
  • デヌタがどこから来たのかに぀いおの混乱を避けるために、明瀺的にしおください

私はこれらすべおに察凊する解決策があるかもしれたせん 🀞で$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に到達できるため、倧したこずではないず思いたす。 さらに、前述したように、そもそもこの問題が発生した堎合、ナヌザヌが州のプロバむダヌコンポヌネントを䜿っお自分の足を撃っおいる可胜性が非垞に高いず思いたす。

党おのコメント36件

いいね。 匕数を䜿甚しおスロット名を指定するこずを考えおいたしたが、これにより、耇数のディレクティブ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䞡方を䜿甚するず、特に珟圚の蚭蚈にどのように到達したかを知らない新芏ナヌザヌにずっお、䞀貫性がなく混乱する可胜性があるこずに同意したす。

問題の内蚳

合成しようずするず、次のような゜リュヌションが必芁なようです。

  • スコヌプスロットからのデヌタにアクセスするために必芁な定型文を枛らす
  • デフォルトスロットのデヌタが名前付きスロットで利甚可胜であるこずを暗瀺するこずは避けおください
  • 導入する必芁のある新しいAPIの数を最小限に抑える
  • Webコンポヌネントの仕様にすでに蚱容可胜な゜リュヌションがあるAPIを再発明しないでください
  • デヌタがどこから来たのかに぀いおの混乱を避けるために、明瀺的にしおください

私はこれらすべおに察凊する解決策があるかもしれたせん 🀞で$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倉数の提案が奜きで、実装ブロッカヌを解決しようずしおいたした。 これが私が実行可胜だず思うこずです

  • すべおのスロットは3.0のように関数ずしおコンパむルされるため、静的スロットはなくなりたすこれにより、コンポヌネントの曎新の远跡がより正確になりたす
  • $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>

デザむンが圓初提案されたものずは倧きく異なるため、締めくくりたす。 代わりに新しいスレッドを開きたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡