νμ€ κ΅¬μ± μμμ λμΌν λ°©μμΌλ‘ κΈ°λ₯ κ΅¬μ± μμμ λν ν
νλ¦Ώ λ° .vue
νμΌμ μμ±ν μ μκΈ°λ₯Ό μν©λλ€.
μ΄ λ°μ΄μ¬λ¦° μμ κ°λ
μ¦λͺ
μ λ§λ€μμ§ λ§ κ½€ ν΄ν€ν©λλ€. ν
νλ¦Ώ μ»΄νμΌλ¬λ κ²°κ³Ό ν¨μλ₯Ό this
μλ context
κ°μ²΄μ λ μ ν©νκ² λ§λ€κΈ° μν΄ functional
μ΅μ
μ κ°μ§ μ μμ΅λλ€.
λ€μκ³Ό κ°μ΄ λ³΄μΌ κ²μ λλ€.
Vue.component('test', {
functional: true',
props: ['msg'],
template: `<div>
<h1>{{props.msg}}</h1>
<h2>Static content</h2>
<span v-for="n in 10">{{n}} </span>
<button @click="console.log('click', props.msg)"><slot></slot></button>
</div>`,
});
λλ:
<template>
<div class="test">
<h1>{{props.msg}}</h1>
<h2>Static content</h2>
<span v-for="n in 10">{{n}} </span>
<button @click="console.log('click', props.msg)"><slot></slot></button>
</div>
</template>
<script>
export default {
functional: true,
props: ['msg'],
}
</script>
<style scoped>
.test {
margin: 12;
}
</style>
μ°λ¦¬λ μ΄λ―Έ μ΄κ²μ λ‘λ맡μ μ΅μ μΌλ‘ κ°μ§κ³ μμ΅λλ€. κ·Έλ¬λ μ°λ¦¬λ 2.0μ΄ νμ¬ μΆμ ν λ¨κ³λ₯Ό λ²μ΄λκ³ 2.0μ λν μνκ³μ λ¨κ²¨μ§ λͺ¨λ μμ μ΄ μλ£λ λκΉμ§ μ΄λ₯Ό μ°κΈ°ν κ²μ λλ€. , vue-loader/vueifyκ° κ·Έκ²κ³Ό ν¨κ» μλνκ² λ§λλ κ² λ± pp.)
PoC κ°μ¬ν©λλ€. λμμ΄ λ κ² κ°μ΅λλ€!
μ, λΆνν©λλ€.
λ°λ‘ κ·Έκ²μ λ°λΌλ³΄κ³ μμμ΅λλ€. λμκ² λ λ κΈ°λ₯μ λ무 μλμ μ΄λ©° λ¨μΌ νμΌ κ΅¬μ± μμμ μ λ°μ μΈ λλμμ "λκ»΄μ§λλ€".
λμκ² κ°μ₯ μ μ©ν κ²μ CSSμ λ²μλ₯Ό κΈ°λ₯μ κ΅¬μ± μμλ‘ μ§μ νλ κ²μ λλ€.
μ΄ κΈ°λ₯μ μΈ λ¨μΌ νμΌ κ΅¬μ± μμμ λν μν μ λ°μ΄νΈλ₯Ό λ°μ μ μμ΅λκΉ? λλ Reactμμ μμΌλ©° μ΄κ²μ κ½€ λμΉκ³ μμ΅λλ€.
곧 μΆμλ μμ μ λλ€.
n00bμ λν΄ μ°λ¦¬κ° μ§κΈ κ°μ§κ³ μλ κ²κ³Ό λΉκ΅νμ¬ μ΄κ²μ μλ‘μ΄ μ μ μ€λͺ ν μ μμ΅λκΉ?
λ€μκ³Ό κ°μ΄ .vue
νμΌμ μ¬μ©νμ¬ κΈ°λ₯μ κ΅¬μ± μμλ₯Ό μμ±ν μ μμ΅λλ€.
<template functional>
<div class="test">
<h1>{{props.msg}}</h1>
<h2>Static content</h2>
<span v-for="n in 10">{{n}} </span>
<button @click="console.log('click', props.msg)"><slot></slot></button>
</div>
</template>
<script>
export default {
props: ['msg'],
}
</script>
<style scoped>
.test {
margin: 12;
}
</style>
μ κ·Έλ κ΅°μ κ°μ¬ν©λλ€!!
μ λ§ μ’μ보μ΄λ€μ. μ΄ κΈ°λ₯μ΄ μΈμ μΆμλ μ§ μ μ μμ΅λκΉ?
μ΄λ κ² νλ©΄ κΈ°λ₯μ κ΅¬μ± μμλ₯Ό ν¨μ¬ λ μ½κ² μ¬μ©ν μ μμ΅λλ€!
μ΄ μ£Όμ μ λν μ λ°μ΄νΈκ° μμ΅λκΉ? 2.3 릴리μ€μ μΌλΆκ° λ κΉμ?
@Akryum μ΄ λ¬Έμ μ μν©μ μκ³ μμ΅λκΉ? λͺ κ°μ λμ 침체μ λΉ μ§ κ² κ°μ΅λλ€. μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ μ°λ¦¬κ° ν μ μλ μΌμ΄ μμ΅λκΉ?
/ping @blake-newman
μ΄ κΈ°λ₯μ λν μμμ΄ μμ΅λκΉ?
2μμ μ΄μ λν μμ μ΄ μμλ κ² κ°μ΅λλ€: https://github.com/vuejs/vue/tree/feature/fn-templates
μ΄μ λν μ λ°μ΄νΈκ° μμ΅λκΉ? μ€νν μ§ μΌλ§ λμ§ μμμ΅λλ€. μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ ν μ μλ μΌμ΄ μμ΅λκΉ?
@Akryum μ§λ 2μ ν°μ μ΄νλ‘ λ¬Όμ
μ΄κ²μ΄ μ±κ°μ μΌμ΄λΌλ©΄ μ£μ‘ν©λλ€. μ΄λ»κ² νλ©΄ μ΄λ° μΌμ΄ μΌμ΄λκ² ν μ μλμ§ μκ³ μΆμ΅λλ€. :)
@scottbedard μ κ° μμ νκ³ μμλλ° λͺ κ°μ§ μ¨κ²¨μ§ λ¬Έμ κ° μμμ΅λλ€. κ·Έλ¬λ μ΄λ¬ν κΈ°λ₯μ μ¬μ©ν μ μλ κΈ°λ₯μΌλ‘ λ¬Έμνλ μ μμ΅λλ€. μμ μ κ½€ μ€λ μ μ μλ£λμμΌλ©° λΆννκ²λ λ λλ§ μμ€ν μ νμ¬ μνμ 맀νλμ§ μμΌλ―λ‘ μμ μ μλ£ν΄μΌ ν©λλ€.
@vuejs/collaborators μ΄ κΈ°λ₯μ λν΄ μ λ°μ μΌλ‘ μ΄λ»κ² μκ°νμλκΉ? κ°λ° λ Έλ ₯κ³Ό μ½μ΄μ λν μΆκ° λΉμ©μ΄ μ΄ κΈ°λ₯μ μ¬μ©ν κ°μΉκ° μμ΅λκΉ?
μ»΄ν¬λνΈλ₯Ό μμ±νλ κΈ°λ³Έ λ°©λ²μ ν νλ¦Ώμ μ¬μ©νλ κ²μ΄κΈ° λλ¬Έμ κΈ°λ₯μ΄ μμΌλ©΄ μ’μ κ² κ°μμ. κ·Έλ¦¬κ³ (ν νλ¦Ώ μ»΄νμΌλ¬μμ μ¬μ©λλ) κ΅¬μ± μμμμ λͺ¨λ λ λλ§ κΈ°λ₯μ λΆλ¦¬νλ IMHOλ νλ₯ν κ²μ λλ€.
λ¬Έμ λ ν νλ¦Ώμ κΈ°λ₯μ μΌλ‘ μ¬μ©νλ λ²μκ° JSX/Render κΈ°λ₯μ μ¬μ©νλ κ²λ³΄λ€ ν¨μ¬ λ μ νμ μ΄λΌλ κ²μ λλ€. NS
κΈ°λ₯μ μ»΄ν¬λνΈλ₯Ό ꡬμΆνλ μμ μμ μ μ½ μ‘°κ±΄κ³Ό λμμΈ ν¨ν΄μ΄ ν νλ¦Ώ λͺ¨λΈμ λ§μ§ μλλ€κ³ μκ°ν©λλ€. μ΄ κΈ°λ₯μ μ½κ°μ μΆκ° λ°νμμ΄ νμν©λλ€(https://github.com/vuejs/vue/commit/f63203310f01e9f0813e0316c308f9f21d0ee717#diff-4d479bb000ed54582de8e4cd8158ef64μ λμΌν μ±λ₯μ κ°μ§).
μ΄ κΈ°λ₯μ νμ±ννλ©΄ λ λμ μ±λ₯μ κ°μ νμ§λ§ μμ λ λ κΈ°λ₯μ λΉν΄ μ΄λ μ¬μ€μ΄ μλλλ€. νμ¬ μ΄ κΈ°λ₯μ λν μ μ μ₯μ ν νλ¦Ώμ΄ κΈ°λ₯μ μ¬μ©ν μ μλλ‘ κΆνμ λΆμ¬ν λΏ μ§μ ν 보μμ μ 곡νμ§ μλλ€λ κ²μ λλ€.
λν κΈ°λ₯μ κ΅¬μ± μμμ λν λ²μ μ€νμΌ μ§μμ΄ μμΌλ©΄ μ’κ² μ§λ§ κ΄λ ¨μ΄ μμ μ μμ΅λλ€.
κ·Έκ²μ κ΄λ ¨μ΄ μμ΅λλ€. λλ κ·Έκ²μ΄ ν¨κ³Όκ° μλ€κ³ λ―Ώμ΅λλ€. λλ μ μ κ·Έκ²μ λν΄ μμ νμ΅λλ€. νκ·κ° μλ€λ©΄?
Vueμ κΈ°λ₯μ κ΅¬μ± μμλ Reactμ λΉν΄ μ½κ° μΆν©λλ€. template
jsx
λ³΄λ€ ν¨μ¬ λ κΈ°λ₯μ μ
λλ€. μλ§λ λ€μκ³Ό κ°μ΄ λ³ν μ²λ¦¬λ₯Ό μν΄ vue-loader
λ₯Ό λΉλ¦΄ μ μμ΅λλ€.
<script functional>
const DumbCmp = props => (
<Button>{props.label}</Button>
);
export default DumbCmp;
</script>
μ€μ λ‘, μΌλΆ μ¬λλ€μ λͺ λ¬ μ μμ΄ servalμ μννμ΅λλ€. https://github.com/nickmessing/babel-plugin-jsx-vue-functional
μ΄κ²μ΄ μ°λ¦¬κ° κΈ°λ€λ¦¬λ κ²μ λκΉ? https://github.com/vuejs/vue/commit/ea0d227d2ddfa5fc5e1112acf9cd485b4eae62cb
μ, Vue 2.5 + vue-loader 13.3μ ν νλ¦Ώ μ»΄νμΌ, λ²μκ° μ§μ λ CSS λ° κΈ°λ₯ κ΅¬μ± μμμ λν ν« λ¦¬λ‘λλ₯Ό μ μ νκ² μ§μν©λλ€. :)
κΈ°λ₯μ κ΅¬μ± μμμμ $emitμ΄ κ°λ₯ν©λκΉ?
λ΄κ° νλ¦¬μ§ μλ ν, 짧μ λλ΅μ μλμ€μ λλ€. κΈ°λ₯ κ΅¬μ± μμλ μΈμ€ν΄μ€κ° μλλ―λ‘ λ©μλκ° μμ΅λλ€.
μΌλΆ ν΄μ»€λ₯Ό ν΅ν΄ μ€μ λ‘ λ°©μΆν μ μλ€κ³ μκ°ν©λλ€. λ λ fnμ΄ μμ νλ 컨ν
μ€νΈ κ°μ²΄μλ νμ vue μΈμ€ν΄μ€μ¬μΌ νλ parent
κ° ν¬ν¨λμ΄ μμ΅λλ€. context.parent.$emit()
λλ context.parent.$root.$emit()
λ₯Ό μ ννμ¬ λ³΄λ€ κΈλ‘λ²ν μ κ·Ό λ°©μμ μ·¨ν μ μμ΅λλ€. 보μλ€μνΌ μ΄κ²μ κΈ°λ₯ κ΅¬μ± μμμμ λ°μνλ μ΄λ²€νΈκ° μλλ―λ‘ μ¬μ© μ¬λ‘μ λ°λΌ μ΅μμ μ루μ
μ΄ μλ μ μμ΅λλ€.
μλ
νμΈμ, μ λ λμ보λ μμ μ€ μΌλΆλ₯Ό μ΅μ ννκ³ SFC κ΅¬μ± μμκ° κΈ°λ₯μ μΌλ‘ λ©μ§κ² λ€λ¦¬λλ‘ νλ λ°©λ²μ μ°κ΅¬νκ³ μμμ§λ§ κ±°κΈ°μλ λ©μλλ κ³μ°λ μνμ΄ μμ κ²μ
λλ€. κ·Έλ μ£ ?
λ λ κΈ°λ₯μ΄λ JSXλ₯Ό μ¬μ©νλ κ²½μ° μ΅μν λ λ κΈ°λ₯ λ΄λΆμμ μ체μ μΌλ‘ μ μν μ μμ΅λλ€. λ§μ΅λκΉ?
κΈ°λ₯μ κ΅¬μ± μμμμ $emitμ΄ κ°λ₯ν©λκΉ?
κΈ°λ₯ 컨ν
μ€νΈ μμ listeners
κ°μ²΄μ μ‘μΈμ€ν μ μμ΅λλ€. μλ₯Ό λ€μ΄:
<my-functional-component @request-something="onRequestSomething" />
my-functional-component
λ΄λΆμ λ©μλμ²λΌ 리μ€λλ₯Ό νΈμΆν©λλ€.
listeners['request-something'](42)
λ λ κΈ°λ₯μ΄λ JSXλ₯Ό μ¬μ©νλ κ²½μ° μ΅μν λ λ κΈ°λ₯ λ΄λΆμμ μ체μ μΌλ‘ μ μν μ μμ΅λλ€. λ§μ΅λκΉ?
μ.
@Akryum κ°μ¬ν©λλ€. νμ€ λ λ κΈ°λ₯μ΄ λ΄μ©μ μ½κΈ° μ΄λ ΅κ² λ§λ€κΈ° λλ¬Έμ λ ν¬κ³ ν νλ¦Ώμ΄ λ§μ κΈ°λ₯ κ΅¬μ± μμκ° JSXλ₯Ό μ¬μ©νλ κ²μ΄ λ λμ μ μμ΅λλ€. μ΄κ²μ λν κ³ κΈ νν 리μΌμ μ λ§ λ¬μ½€ν κ²μ λλ€. :)
λ μ΄μ κΈ°λ₯ κ΅¬μ± μμμ ν¨κ» λ λλ§ κΈ°λ₯μ μ¬μ©ν νμκ° μμ΅λλ€.
ν
νλ¦Ώμ μ¬μ©ν μ μμ΅λλ€
2018λ
1μ 5μΌ κΈμμΌ μ€μ 4μ 53λΆ, Dobromir Hristov [email protected]
μΌλ€:
@Akryum https://github.com/akryum κ°μ¬ν©λλ€. λ ν¬κ³ λ λ¬΄κ±°μ΄ ν νλ¦Ώ
func κ΅¬μ± μμλ νμ€ λ λλ§ λλ¬Έμ JSXλ₯Ό μ¬μ©νλ κ²μ΄ λ λμ μ μμ΅λλ€.
ν¨μλ₯Ό μ¬μ©νλ©΄ μ½κΈ°κ° μ‘°κΈ λ μ΄λ €μμ§λλ€. κ³ κΈ νν 리μΌ
μ΄κ²λ€μ μ λ§ λ¬μ½€ν κ²μ λλ€ :)β
λΉμ μ΄ λκΈμ λ¬μκΈ° λλ¬Έμ μ΄κ²μ λ°λ κ²μ λλ€.
μ΄ μ΄λ©μΌμ μ§μ λ΅μ₯νκ³ GitHubμμ νμΈ
https://github.com/vuejs/vue/issues/3977#issuecomment-355514921 λλ μμκ±°
μ€λ λ
https://github.com/notifications/unsubscribe-auth/AACouk0kTLUHRjQDnXj2vn2v4Rq7maXOks5tHfExgaJpZM4KaIfu
.
@blocka ν¨μλ₯Ό μ¬μ©νμ¬ μμ μ μννλ λ°©λ²μ 무μμ λκΉ? μλ₯Ό λ€μ΄ μ°¨νΈλ₯Ό μΈμ€ν΄μ€ννμκ² μ΅λκΉ?
vnodeλ‘ μ°¨νΈλ₯Ό μμ ν λ λλ§νμ§ μλ ν
μ΄λ₯Ό μννλ μλͺ
μ£ΌκΈ° λ©μλκ° μλ μΌλ° κ΅¬μ± μμ
2018λ
1μ 5μΌ κΈμμΌ μ€μ 5:41 Dobromir Hristov μλ¦Ό @github.com
μΌλ€:
@blocka https://github.com/blocka ν¨μλ₯Ό μ¬μ©νμ¬ μννλ λ°©λ²
무μ? μλ₯Ό λ€μ΄ μ°¨νΈλ₯Ό μΈμ€ν΄μ€ννμκ² μ΅λκΉ?β
λΉμ μ΄ μΈκΈλμκΈ° λλ¬Έμ μ΄κ²μ λ°λ κ²μ λλ€.
μ΄ μ΄λ©μΌμ μ§μ λ΅μ₯νκ³ GitHubμμ νμΈ
https://github.com/vuejs/vue/issues/3977#issuecomment-355524605 λλ μμκ±°
μ€λ λ
https://github.com/notifications/unsubscribe-auth/AACouvWQNer0XUjuzBDHgePpZQ-D2DAWks5tHfx2gaJpZM4KaIfu
.
@Akryum κ·νμ μ루μ
μ ν¨κ³Όκ° μμ§λ§ κΈ°λ₯μ μΈ sfc ν
νλ¦Ώμ΄ μ‘°κΈ λ λ§μ μ¬λμ μ¬μ©ν μ μλ€λ λλμ μ€λλ€. μ λ μ²μλΆν° μλν μ μμλ μ¬λ¬ κ΅¬μ± μμλ₯Ό λ€μ μμ±νλ κ³Όμ μ μμΌλ©° κ²½νμ μ½κ° μ€λ§νμ΅λλ€. sfcμλ props
λ° listeners
ν
νλ¦Ώμμ μ‘μΈμ€ν μ μλ 컨ν
μ€νΈκ° μ΄λ―Έ μμ΅λλ€. μ΄λ¬ν μμ±μ propsμ κ²½μ° 'root'μ 맀ννκ³ λ¦¬μ€λμ κ²½μ° '$emit'μ 맀ννμ¬ κ° μ νμ sfcκ° λμΌν APIλ‘ μλνλλ‘ ν μ μμμ΅λκΉ?
<template functional>
<div @click="listeners['request-something'](42)">
{{props.hello}}
{{props.world}}
</div>
</template>
<script>
export default {
props: ["hello", "world"]
}
</script>
λ μ μμλ€
<template functional>
<div @click="$emit('request-something', 42)">
{{hello}}
{{world}}
</div>
</template>
<script>
export default {
props: ["hello", "world"]
}
</script>
κ°μ₯ μ μ©ν λκΈ
곧 μΆμλ μμ μ λλ€.