Vue: 예기치 μ•Šμ€ "쀑볡 된 슬둯 쑴재"

에 λ§Œλ“  2018λ…„ 03μ›” 28일  Β·  9μ½”λ©˜νŠΈ  Β·  좜처: vuejs/vue

버전

2.5.2

볡제 링크

https://codesandbox.io/s/mzvkppmvo8

μž¬ν˜„ 단계

  1. λ²”μœ„ 슬둯 (AppSwitcher.vue)으둜 ꡬ성 μš”μ†Œλ₯Ό λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.
  2. 그런 λ‹€μŒ μžμ‹ μ˜ μŠ¬λ‘―μ΄μžˆλŠ” λ‹€λ₯Έ ꡬ성 μš”μ†Œμ—μ„œ μ‚¬μš©ν•©λ‹ˆλ‹€ (슬둯 "μ„œλΈŒ ν…μŠ€νŠΈ"κ°€μžˆλŠ” HelloWorld.vue).
  3. μŠ¬λ‘―μ— 일뢀 μš”μ†Œ μΆ”κ°€ (App.vue의 div)

무엇을 κΈ°λŒ€ν•©λ‹ˆκΉŒ?

였λ₯˜μ—†μ΄ μž‘λ™ν•΄μ•Όν•©λ‹ˆλ‹€.

μ‹€μ œλ‘œ 무슨 일이 μΌμ–΄λ‚˜κ³  μžˆμŠ΅λ‹ˆκΉŒ?

AppSwitcher.vue의 λ³€κ²½μœΌλ‘œ 인해 "λ™μΌν•œ λ Œλ” νŠΈλ¦¬μ—μ„œ 발견 된 슬둯"μ„œλΈŒ ν…μŠ€νŠΈ "의 쀑볡 쑴재"였λ₯˜κ°€ λ°œμƒν•˜μ§€λ§Œ 쀑볡이 μ—†μŠ΅λ‹ˆλ‹€.


λ˜ν•œ App.vue의 div에 slot-scope 을 μΆ”κ°€ν•˜λ©΄ λ¬Έμ œκ°€ ν•΄κ²°λ˜κ³  였λ₯˜κ°€ μ—†μ§€λ§Œ slot-scope 없이 λ°œμƒν•˜λŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?

bug has PR

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

저도 같은 일을 κ²ͺκ³  μžˆμŠ΅λ‹ˆλ‹€. 슬둯 λ²”μœ„ λ‚΄μ—μ„œ λ‹€μ‹œ λ Œλ”λ§μ„ νŠΈλ¦¬κ±°ν•˜λŠ” λͺ¨λ“  ν•­λͺ©μ€ 쀑볡 슬둯 μ‘΄μž¬μ— λŒ€ν•œ κ²½κ³ λ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€.

λ¬Έμ œλŠ” 여기이 μ€„μ—μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€ . 슬둯이 ν•œ 번 λ Œλ”λ§λ˜λ©΄ ν•΄λ‹Ή λΈ”λ‘μ˜ 후속 싀행은 μ•„λ§ˆλ„ 첫 번째 λ Œλ”λ§μ—μ„œ slotNodes._rendered μ°ΈμœΌλ‘œλ©λ‹ˆλ‹€.

λ‹€μ‹œ λ Œλ”λ§μ΄ 트리거 될 λ•Œ 무언가가 λ‹€μ‹œ κ±°μ§“μœΌλ‘œ μ„€μ •λ˜μ–΄μ•Όν•œλ‹€κ³  μƒκ°ν•˜μ§€λ§Œ, Vueκ°€ λ‚΄λΆ€μ—μ„œ μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€μ— λŒ€ν•΄μ„œλŠ” 거의 μ•Œμ§€ λͺ»ν•˜κΈ° λ•Œλ¬Έμ— μΆ”μΈ‘ μΌλΏμž…λ‹ˆλ‹€.

이 λ²„κ·ΈλŠ” κ°€λŠ₯성이 ν¬λ°•ν•œ μΌ€μ΄μŠ€μ²˜λŸΌ λ³΄μ΄μ§€λ§Œ μ΅œκ·Όμ— λͺ‡ 번 λ‚˜μ—κ²Œ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. μ €λŠ” ꡬ체적인 κ΅¬ν˜„κ³Ό 짝을 이룰 μˆ˜μžˆλŠ” λ Œλ”λ¦¬μŠ€ ꡬ성 μš”μ†Œλ₯Ό μž‘μ„±ν•˜λŠ” νŒ¨ν„΄μ˜ μ—΄λ ¬ν•œ 팬이며,이 λ¬Έμ œκ°€ λ°œμƒν•  λ•Œ μ†ŒλΉ„μžμ˜ μ½˜ν…μΈ λ₯Ό ꡬ체적인 κ΅¬ν˜„μœΌλ‘œ μ „λ‹¬ν•˜λ €κ³ ν•©λ‹ˆλ‹€.

λͺ¨λ“  9 λŒ“κΈ€

μ•ˆλ…•ν•˜μ„Έμš” @ Kelin2025

V2.5μ—μ„œμ˜ μ•½κ°„μ˜ λ³€ν™”κ°€ μžˆμ—ˆλ‹€ scoped-slot -, 당신은 μ—¬κΈ°λ₯Ό 톡해 갈 수 https://gist.github.com/yyx990803/9bdff05e5468a60ced06c29c39114c6b#simplified -scoped 슬둯-μ‚¬μš©

이것은 λ‹Ήμ‹ μ˜ ν˜Όλž€μ„ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€

예, μ•Œκ³  μžˆμ§€λ§Œ μ™œμ΄ 였λ₯˜κ°€ λ°œμƒν•˜λŠ”μ§€ μ΄ν•΄ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€. μŠ¬λ‘―μ— __duplicates__κ°€μ—†κ³  rerender 만 μžˆμŠ΅λ‹ˆλ‹€.

λ²”μœ„κ°€ μ§€μ •λœ 슬둯 λ‚΄λΆ€μ˜ 슬둯이 두 번 이상 λ Œλ”λ§ 된 것 κ°™μŠ΅λ‹ˆλ‹€.

@Justineo λ³€κ²½ 사항에 λŒ€ν•΄ λ‹€μ‹œ λ Œλ”λ§λ˜κ³  μžˆμ§€λ§Œ 문제λ₯Ό μΌμœΌν‚€μ§€ μ•Šμ•„μ•Όν•©λ‹ˆλ‹€.

λ‚΄ 2 μ„ΌνŠΈ.

λ‹€μŒμ€μ΄ 문제의 또 λ‹€λ₯Έ μž¬ν˜„μž…λ‹ˆλ‹€ (https://codesandbox.io/s/m5kl6p97qx). λͺ¨λ‹¬μ΄ 두 번 이상 ν‘œμ‹œλœ κ²½μš°μ—λ§Œ κ²½κ³ κ°€ λ°œμƒν•©λ‹ˆλ‹€.

반면, λ™μΌν•œ ꡬ성 μš”μ†Œμ˜ JSX 버전은 κ²½κ³ λ₯Ό λ°œμƒμ‹œν‚€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ (https://codesandbox.io/s/k0wpj60z5r).

저도 같은 일을 κ²ͺκ³  μžˆμŠ΅λ‹ˆλ‹€. 슬둯 λ²”μœ„ λ‚΄μ—μ„œ λ‹€μ‹œ λ Œλ”λ§μ„ νŠΈλ¦¬κ±°ν•˜λŠ” λͺ¨λ“  ν•­λͺ©μ€ 쀑볡 슬둯 μ‘΄μž¬μ— λŒ€ν•œ κ²½κ³ λ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€.

λ¬Έμ œλŠ” 여기이 μ€„μ—μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€ . 슬둯이 ν•œ 번 λ Œλ”λ§λ˜λ©΄ ν•΄λ‹Ή λΈ”λ‘μ˜ 후속 싀행은 μ•„λ§ˆλ„ 첫 번째 λ Œλ”λ§μ—μ„œ slotNodes._rendered μ°ΈμœΌλ‘œλ©λ‹ˆλ‹€.

λ‹€μ‹œ λ Œλ”λ§μ΄ 트리거 될 λ•Œ 무언가가 λ‹€μ‹œ κ±°μ§“μœΌλ‘œ μ„€μ •λ˜μ–΄μ•Όν•œλ‹€κ³  μƒκ°ν•˜μ§€λ§Œ, Vueκ°€ λ‚΄λΆ€μ—μ„œ μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€μ— λŒ€ν•΄μ„œλŠ” 거의 μ•Œμ§€ λͺ»ν•˜κΈ° λ•Œλ¬Έμ— μΆ”μΈ‘ μΌλΏμž…λ‹ˆλ‹€.

이 λ²„κ·ΈλŠ” κ°€λŠ₯성이 ν¬λ°•ν•œ μΌ€μ΄μŠ€μ²˜λŸΌ λ³΄μ΄μ§€λ§Œ μ΅œκ·Όμ— λͺ‡ 번 λ‚˜μ—κ²Œ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. μ €λŠ” ꡬ체적인 κ΅¬ν˜„κ³Ό 짝을 이룰 μˆ˜μžˆλŠ” λ Œλ”λ¦¬μŠ€ ꡬ성 μš”μ†Œλ₯Ό μž‘μ„±ν•˜λŠ” νŒ¨ν„΄μ˜ μ—΄λ ¬ν•œ 팬이며,이 λ¬Έμ œκ°€ λ°œμƒν•  λ•Œ μ†ŒλΉ„μžμ˜ μ½˜ν…μΈ λ₯Ό ꡬ체적인 κ΅¬ν˜„μœΌλ‘œ μ „λ‹¬ν•˜λ €κ³ ν•©λ‹ˆλ‹€.

이 μ‹œλ„:
λ‚΄ ꡬ성 μš”μ†Œ :

<template>
    <slot :someprop="value"></slot>
</template>

μ•±:

<my-component>
    <template slot-scop="someprop">{{ prop }} ... and do something else</template>
</my-component>

특히 "v-for"의 "slot"이

Vue.js ≀v2.4.xλ₯Ό μ‚¬μš©ν•˜λŠ” 경우 slot-scope λ₯Ό μ‚¬μš©ν•˜λ €κ³ ν•˜λ©΄μ΄ 였λ₯˜κ°€ ν‘œμ‹œ 될 수 μžˆμŠ΅λ‹ˆλ‹€ (그게 μ €μ—κ²Œ μΌμ–΄λ‚œ μΌμž…λ‹ˆλ‹€).

해결책은 Vue.jsλ₯Ό β‰₯2.5둜 μ—…λ°μ΄νŠΈν•˜κ±°λ‚˜ "슬둯 λ²”μœ„"λŒ€μ‹  "λ²”μœ„"λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

image
_ https://vuejs.org/v2/api/#scope -replaced_

λ‚΄κ°€ ν•œ κ²ƒμ²˜λŸΌ λ‹€λ₯Έ μ‚¬λžŒμ΄ Googleμ—μ„œ 이것을 μ°ΎλŠ” 데 λ„μ›€μ΄λ˜κΈ°λ₯Ό λ°”λžλ‹ˆλ‹€.


μΆ”μ‹ . Vue.js ≀v2.4.xλ₯Ό μ‚¬μš©ν•˜λŠ” 경우 <template> μš”μ†Œλ₯Ό μ‚¬μš©ν•΄μ•Όν•©λ‹ˆλ‹€. β‰₯2.5κ°€ 될 λ•ŒκΉŒμ§€ 기타 μš”μ†Œμ— 슬둯 λ²”μœ„ 경계λ₯Ό 지정할 수 μ—†μŠ΅λ‹ˆλ‹€. .μ—‘μŠ€. μ‹€μ œ 사둀 :

      <div class="form-group col-md">
        <label>Autocomplete field 4 (w/ custom search results):</label>
        <autocomplete v-model="autocompleteExampleValue4" action="listGlobalSearchResults" :handle-formatting-response-data="handleFormattingDummySearchResults" placeholder="This one has a custom placeholder too">
          <template slot="search-result-item" scope="slotData"><!-- Note that you can use destructuring here, but it only works in modern browsers -- otherwise you have to define a separate variable -- like scope="slotData" and then use {{slotData.id}}... (see https://vuejs.org/v2/guide/components-slots.html#Destructuring-slot-scope) -->
            <!-- TODO: update to vue β‰₯ 2.5.0 to allow this slotData thing to be attached w/o using a template element.  Also when we do that, "scope" will become "slot-scope".  See https://vuejs.org/v2/guide/components-slots.html#Scoped-Slots for more info -->
            <span>{{slotData.searchResult.label}}</span>
          </template>
        </autocomplete>
      </div>

해결책은 Vue.jsλ₯Ό β‰₯2.5둜 μ—…λ°μ΄νŠΈν•˜κ±°λ‚˜ "슬둯 λ²”μœ„"λŒ€μ‹  "λ²”μœ„"λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

2.5.17 μ—μ„œ μ—¬μ „νžˆμ΄ λ¬Έμ œκ°€ λ°œμƒν•©λ‹ˆλ‹€.

λ Œλ”λ¦¬μŠ€ μ»΄ν¬λ„ŒνŠΈ 좔상화λ₯Ό λ§Œλ“€λ €κ³  ν•  λ•Œ 정말 μ§œμ¦μ΄λ‚©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰