Vue: 제곡된 μ†Œν’ˆμ€ κΈ°λŠ₯ ꡬ성 μš”μ†Œμ— μ£Όμž…λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2017λ…„ 06μ›” 07일  Β·  16μ½”λ©˜νŠΈ  Β·  좜처: vuejs/vue

버전

2.3.3

볡제 링크

http://jsfiddle.net/p861bj9y/

μž¬ν˜„ 단계

ν…ŒμŠ€νŠΈν•˜λ €λŠ” λ™μž‘μ˜ μ΅œμ†Œν•œμ˜ μž¬ν˜„μ„ λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€. μ˜ˆμ œλŠ” JSXκ°€ μž‘λ™ν•˜κΈ° λ§Œν•˜λ©΄λ©λ‹ˆλ‹€.

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

μƒμœ„μ—μ„œ 전달 된 속성은 ctx.injections ν‘œμ‹œλ˜μ–΄μ•Όν•©λ‹ˆλ‹€.

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

Ctx.injections 이 (κ°€) μ‘΄μž¬ν•˜μ§€λ§Œ λΉ„μ–΄ μžˆμŠ΅λ‹ˆλ‹€. νŠΉμ„±μ΄ κΈ°λŠ₯ ꡬ성 μš”μ†Œ μ»¨ν…μŠ€νŠΈλ‘œ μ „λ‹¬λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

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

v3μ—μ„œμ΄ 문제λ₯Ό ν•΄κ²°ν•  κ³„νšμ΄ μžˆμŠ΅λ‹ˆκΉŒ?

예λ₯Ό λ“€μ–΄ v-forλ₯Ό λ Œλ”λ§ ν•¨μˆ˜λ‘œ μΆ”μƒν™”ν•˜λ €κ³ ν•˜μ§€λ§Œ λ‚΄ μžμ‹μ€ κΈ°λŠ₯적 ꡬ성 μš”μ†Œ 일 수 μžˆμŠ΅λ‹ˆλ‹€ (λ”°λΌμ„œ λ Œλ”λ§ ν•¨μˆ˜μ— λ“€μ–΄κ°ˆ λ•Œ 이미 λ Œλ”λ§λ˜μ–΄ 볡제 ν•  수 μ—†μŠ΅λ‹ˆλ‹€).

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

μ΄λŠ” parent λŒ€μ‹  child 이 vm μžμ‹μœΌλ‘œ κ°„μ£Όλ˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€ (문제 일 수 있음). λ”°λΌμ„œ provide 에 vm provide λ₯Ό 써야 ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

BTW, λ°”μ΄μ˜¬λ¦°μ΄ [email protected]을 μ‚¬μš©

provide injection에 λŒ€ν•œ 쑰회 μ•Œκ³ λ¦¬μ¦˜μ€ μžμ‹μ΄ 제곡된 속성을 ν™•μΈν•œ λ‹€μŒ 제곡된 propsκ°€ λ£¨νŠΈμ—μžˆμ„ λ•ŒκΉŒμ§€ $parent 계측 ꡬ쑰λ₯Ό λ°˜λ³΅ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.
https://github.com/vuejs/vue/blob/b182ac40697edbe8253d4bd68b6ac09e93259e1c/src/core/instance/inject.js#L59 -L59

λ°”μ΄μ˜¬λ¦°μ„ μ‹€ν–‰ν•  수 μ—†μ—ˆμ§€λ§Œ https://jsfiddle.net/Austio/vhgztp59/7/ 이 λ°”μ΄μ˜¬λ¦°μ„ μ‹€ν–‰ν–ˆμ„ λ•Œ 쑰회 μ»¨ν…μŠ€νŠΈμ— λ„λ‹¬ν–ˆμ„ λ•Œ μžμ‹ ꡬ성 μš”μ†Œμ—μ„œ $ parentκ°€ μ •μ˜λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. 적어도 이것이 슬둯으둜 λ Œλ”λ§ν•˜λŠ” λ¬Έμ œκ°€ μ•„λ‹ˆκ³  ꡬ성 μš”μ†Œ κ°„μ˜ 관계가 μ—†λ‹€λ©΄ μ‹œμž‘μž…λ‹ˆλ‹€.

슬둯이 ν•΄κ²°λ˜κΈ° 전에 κΈ°λŠ₯ ꡬ성 μš”μ†Œκ°€ λ Œλ”λ§ 된 κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€.

@Kingwl이 맞고 그것은 μΌμ’…μ˜ 기술적 μš”κ΅¬ μ‚¬ν•­μž…λ‹ˆλ‹€.

λ‚΄κ°€ 그것에 μ—΄μ€‘ν–ˆκΈ° λ•Œλ¬Έμ— μš”μ μ„ 제기 ν•œ 것을 κΈ°μ–΅ν•©λ‹ˆλ‹€. κ²°κ΅­μ—λŠ” κΈ°λŠ₯적 ꡬ성 μš”μ†Œκ°€ λ Œλ”λ§λ˜λŠ” ꡬ성 μš”μ†Œμ— μ—°κ²°λ˜μ–΄ μŠ¬λ‘―μ—μ„œ μ‚¬μš©λ˜λ©΄ μ™ΈλΆ€ ꡬ성 μš”μ†Œμ— μ—°κ²°λ˜κΈ° λ•Œλ¬Έμ— μ •μƒμ μœΌλ‘œ λ³΄μ˜€μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μž‘λ™ν•˜μ§€ μ•ŠλŠ” ꡬ성 μš”μ†Œμ—λŠ” ν•΄λ‹Ήλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ»¨ν…Œμ΄λ„ˆλ₯Ό 뢄사 mode: 'foo' 및 λ Œλ”λ§ <div><slot/></div>

<!-- rendered in App -->
<container>
   <!-- parent is App, mode is undefined -->
  <functional></functional>
</container>

<container>
   <!-- parent is container, mode is foo -->
  <not-functional></not-functional>
</container>

http://jsfiddle.net/p861bj9y/

νŽΈμ§‘ : @alidcastano Vue 2λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— κ·€ν•˜μ˜ μ˜κ²¬μ—μ„œ λ°”μ΄μ˜¬λ¦°μ„ μ—…λ°μ΄νŠΈν–ˆμŠ΅λ‹ˆλ‹€.

Haha λ°”μ΄μ˜¬λ¦°μ—μ„œ 잘λͺ»λœ Vue 버전을 μ‚¬μš©ν•˜μ—¬ λ―Έμ•ˆν•©λ‹ˆλ‹€. λ‚΄κ°€ 깨닫지 λͺ»ν•œ JSXλ₯Ό ꡬ성 ν•  수 μ—†λ‹€λŠ” 것에 λ„ˆλ¬΄ μ‚¬λ‘œ μž‘ν˜”μŠ΅λ‹ˆλ‹€. @posva 예제λ₯Ό μˆ˜μ •

-

λ”°λΌμ„œ μ—¬κΈ°μ„œ λ¬Έμ œλŠ” κΈ°λŠ₯ ꡬ성 μš”μ†Œκ°€ 제곡된 속성을받을 수 μ—†λ‹€λŠ” 것이 μ•„λ‹ˆλΌ κΈ°λŠ₯ ꡬ성 μš”μ†Œκ°€ μŠ¬λ‘―λ³΄λ‹€ λ¨Όμ € λ Œλ”λ§λœλ‹€λŠ” κ²ƒμž…λ‹ˆκΉŒ?

@LinusBorg "기술적 μš”κ΅¬ 사항"μ΄λž€ ν•΄κ²° 방법이 μ—†κ±°λ‚˜ μ˜λ„ 된 λ™μž‘μž„μ„ μ˜λ―Έν•©λ‹ˆκΉŒ?

μ†Œν’ˆμ„ μ „λ‹¬ν•˜λŠ” vm μ—­ν• μ„ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆλ₯Ό λ§Œλ“€μ–΄μ•Όν•©λ‹ˆκΉŒ? 예λ₯Ό λ“€μ–΄ λ””μžμΈμ€ λ‹€μŒκ³Ό 같이 λ³€κ²½λ©λ‹ˆλ‹€.

// before
<parent-component>
  <child-component />
</parent-component>

// after
<vm-container>
   <parent-component>
     <child-component />
   </parent-component>
<vm-container>

κ·ΈλŸ¬λ‚˜ μœ„μ˜ μ˜ˆλŠ” λΆ€λͺ¨ ꡬ성 μš”μ†Œμ˜ 본질이 이미 μžμ‹μ—κ²Œ μ œκ³΅ν•˜λŠ” 데 ν•„μš”ν•œ λͺ¨λ“  데이터λ₯Ό μˆ˜λ°˜ν–ˆκΈ° λ•Œλ¬Έμ— λΆˆν•„μš”ν•˜κ²Œ λΆ€ν’€λ € λ³΄μž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ‚˜λŠ” ν† λ‘ μ˜ 여지가 μžˆμŠ΅λ‹ˆλ‹€. 이것이 λ„ˆν¬λ“€μ΄ μ œμ•ˆν•˜λŠ” κ²ƒμž…λ‹ˆκΉŒ?

vm-container 은 슬둯이 app μ»¨ν…μŠ€νŠΈμ—μ„œ λ Œλ”λ§λ˜κΈ° λ•Œλ¬Έμ— 아무것도 λ³€κ²½ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

"기술적 μš”κ΅¬ 사항"μ΄λž€ ν•΄κ²° 방법이 μ—†κ±°λ‚˜ μ˜λ„ 된 λ™μž‘μž„μ„ μ˜λ―Έν•©λ‹ˆκΉŒ?

이 λ™μž‘μ€ κΈ°λŠ₯ ꡬ성 μš”μ†Œκ°€ μž‘λ™ν•˜λŠ” λ°©μ‹μ˜ κ²°κ³Όμž…λ‹ˆλ‹€. λ‹€μŒ ꡬ성 μš”μ†Œ μ„ΈνŠΈλ₯Ό κ³ λ €ν•˜μ‹­μ‹œμ˜€.

<!-- template of a `parent` component -->
<template>
  <Child>
    <functional />
  </Child>
</template>

κΈ°λŠ₯적 ꡬ성 μš”μ†Œλ₯Ό λ‹€λ₯Έ ꡬ성 μš”μ†Œμ˜ μŠ¬λ‘―μ— 전달할 λ•Œ ν•˜μœ„ ꡬ성 μš”μ†Œκ°€ κ²°κ³Ό vNodeλ₯Ό 슬둯 μ½˜ν…μΈ λ‘œλ°›μ„ 수 μžˆλ„λ‘ ν•˜μœ„ ꡬ성 μš”μ†Œλ‘œ μ „λ‹¬λ˜κΈ° 전에 λ Œλ”λ§ν•΄μ•Όν•©λ‹ˆλ‹€. (*)

μœ„μ˜ μ˜ˆμ—μ„œ μ΄λŠ” <functional> ꡬ성 μš”μ†Œκ°€ λ Œλ”λ§λ˜λŠ” μˆœκ°„μ— μ‚¬μš© κ°€λŠ₯ν•œ λΆ€λͺ¨κ°€ <child> κ°€ μ•„λ‹ˆλΌ μ™ΈλΆ€ ꡬ성 μš”μ†Œ ( <parent> )μž„μ„ μ˜λ―Έν•©λ‹ˆλ‹€.

결과적으둜 κΈ°λŠ₯적 ꡬ성 μš”μ†Œμ— μ‚¬μš©ν•  μˆ˜μžˆλŠ” μœ μΌν•œ μ£Όμž…μ€ <parent> μ—μ„œλ„ μ‚¬μš©ν•  μˆ˜μžˆλŠ” μ£Όμž…μž…λ‹ˆλ‹€.


(*) : 이것이 λ°”λ‘œ Virtualdom의 ν˜„μž¬ κ΅¬ν˜„μ΄ κΈ°λŠ₯적 ꡬ성 μš”μ†Œμ™€ ν•¨κ»˜ μž‘λ™ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. 이λ₯Ό λ³€κ²½ν•˜λ €λ©΄ λ‚΄λΆ€ λ©”μ»€λ‹ˆμ¦˜μ„ μƒλ‹Ήνžˆ 많이 λ³€κ²½ν•΄μ•Όν•©λ‹ˆλ‹€.

@posva @LinusBorg μ•Œκ² μŠ΅λ‹ˆλ‹€. μ„€λͺ…ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ μ΄λŸ¬ν•œ μš”κ΅¬ μ‚¬ν•­μœΌλ‘œ 인해 κΈ°λŠ₯ ꡬ성 μš”μ†Œμ™€ ν•¨κ»˜ 제곡 / μ£Όμž…μ„ μ‚¬μš©ν•˜λŠ” μœ μΌν•œ 방법은 app μ»¨ν…μŠ€νŠΈμ—μ„œ μ œκ³΅λ˜λŠ” propsλ₯Ό κ°–λŠ” κ²ƒμž…λ‹ˆλ‹€.

이 μ œμ•½μ€ λ¬Έμ„œμ—μ„œ λͺ…ν™•ν•΄μ§ˆ 것이라고 ν™•μ‹ ν•©λ‹ˆλ‹€. μˆ˜ν–‰ν•˜κ±°λ‚˜ λͺ…ν™•νžˆν•΄μ•Ό ν•  λ‹€λ₯Έ 사항이 μ—†μœΌλ©΄ 계속 μ§„ν–‰ν•˜μ—¬μ΄ 문제λ₯Ό μ’…λ£Œν•˜μ‹­μ‹œμ˜€. λ‹€μ‹œ ν•œλ²ˆ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€!

슬둯의 κΈ°λŠ₯적 ꡬ성 μš”μ†Œλ₯Ό κ°œμ„ ν•˜λŠ” 방법을 찾을 μˆ˜μžˆμ„ κ²ƒμž…λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ μ§€κΈˆμ€ @posva 및 @LinusBorgκ°€ λ§ν•œ κ²ƒμ²˜λŸΌν•΄μ•Όν•©λ‹ˆλ‹€.

@Kingwl μ—΄μ–΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

λ‚˜λŠ” λ§ˆμΉ¨λ‚΄ μœ„μ˜ 쑰언을 μ‚¬μš©ν•˜μ—¬ 이것을 vue-mobiledoc-editor ν”ŒλŸ¬κ·ΈμΈμ— ν†΅ν•©ν•˜λ €κ³  μ‹œλ„ν–ˆμŠ΅λ‹ˆλ‹€. app μΈμŠ€ν„΄μŠ€μ—μ„œ ꡬ성 μš”μ†Œλ₯Ό μ‚¬μš©ν•΄μ•Όν•˜λŠ” 경우 λ‚΄κ°€ μ˜ˆμƒν•˜λŠ” ν•œ 가지 λ¬Έμ œλŠ” μ‚¬μš© 된 쀑첩 ꡬ성 μš”μ†Œμ— μœ μ—°μ„±μ„ ν—ˆμš©ν•˜κΈ°κ°€ 더 μ–΄λ ΅λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ μ•± μΈμŠ€ν„΄μŠ€μ— 이미 등둝 된 ꡬ성 μš”μ†Œλ₯Ό λ‚΄ λ³΄λ‚΄μ•Όν•©λ‹ˆλ‹€.

...

export default Vue.extend({
  render (h) {
    return (
      <div>
        <ParentComp>
          <ChildFuncComp/>
        </ParentComp>
      </div>
    )
  },

  provide () { // data that needs to be injected into functional components 
    return {
       msg: 'hello'
    }
  },

  components: {
    ParentComp,
    ChildFuncComp
  }
})

그런 λ‹€μŒ λ‚΄ μ΄ν•΄μ—μ„œ μ‚¬μš©μžκ°€ ν”ŒλŸ¬κ·ΈμΈμ„ μ‚¬μš©ν•  λ•Œ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

// template
<div id="app">
   <div id="#someWhereInApp" />
</div>

// script 
import SuperCoolComponent from 'SuperCoolComponent' 

export default {
   mounted () {
    this.$once('mounted', () => new SuperCoolComponent().$mount('#someWhereInApp'))
    this.$emit('mounted')
  }
}

λ‚΄ κ΅¬ν˜„μ΄ μ •ν™•ν•˜λ©΄ μ‚¬μš©ν•˜λ €λŠ” ꡬ성 μš”μ†Œλ₯Ό κ°œλ³„μ μœΌλ‘œ κ°€μ Έμ˜€κ³  등둝 ν•  수 μ—†κΈ° λ•Œλ¬Έμ— κΈ°λŠ₯ ꡬ성 μš”μ†Œμ™€ ν•¨κ»˜ 제곡 / μ£Όμž…μ˜ μ‚¬μš©μ΄ μ‹¬κ°ν•˜κ²Œ μ œν•œλ©λ‹ˆλ‹€.

λŒ€μ‹  전체 ꡬ성 μš”μ†Œλ₯Ό μ‚¬μš©ν•˜μ—¬ 제곡 / μ£Όμž…μ„ μ§€μ›ν•©λ‹ˆλ‹€.

λ‚˜λŠ” 이것을 ν•΄κ²°ν•˜λ €κ³  λ…Έλ ₯ν•˜κ³ μžˆλ‹€
κΈ΄ κ³Όμ • 일 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€ 🌚

@Kingwl ν•΄κ²°ν•  수 μžˆμ—ˆμŠ΅λ‹ˆκΉŒ?

v3μ—μ„œμ΄ 문제λ₯Ό ν•΄κ²°ν•  κ³„νšμ΄ μžˆμŠ΅λ‹ˆκΉŒ?

예λ₯Ό λ“€μ–΄ v-forλ₯Ό λ Œλ”λ§ ν•¨μˆ˜λ‘œ μΆ”μƒν™”ν•˜λ €κ³ ν•˜μ§€λ§Œ λ‚΄ μžμ‹μ€ κΈ°λŠ₯적 ꡬ성 μš”μ†Œ 일 수 μžˆμŠ΅λ‹ˆλ‹€ (λ”°λΌμ„œ λ Œλ”λ§ ν•¨μˆ˜μ— λ“€μ–΄κ°ˆ λ•Œ 이미 λ Œλ”λ§λ˜μ–΄ 볡제 ν•  수 μ—†μŠ΅λ‹ˆλ‹€).

λͺ¨λ“  μ—…λ°μ΄νŠΈ?

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