# ์ปดํฌ๋ํธ์ ์ฝ๋๋ง์ ์ฌ์ฌ์ฉํ๋ ํ์ด ์ค๋ ์ปดํฌ๋ํธ
# ์ ์
๋ทฐ์ ํ์ด ์ค๋ ์ปดํฌ๋ํธ๋ ๋ฆฌ์กํธ์ ํ์ด ์ค๋ ์ปดํฌ๋ํธ์์ ๊ธฐ์๋ ๊ฒ์ ๋๋ค. ๋ฆฌ์กํธ์ ํ์ด ์ค๋ ์ปดํฌ๋ํธ ์๊ฐ ํ์ด์ง (opens new window)๋ฅผ ๋ณด๋ฉด ์๋์ ๊ฐ์ด ์ ํํ ์ ์๊ฐ ๋์ ์์ต๋๋ค. A higher-order component (HOC) is an advanced technique in React for reusing component logic. ์ด ๋ง์ ์ ๋ฆฌํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ์ด ์ค๋ ์ปดํฌ๋ํธ๋ ์ปดํฌ๋ํธ์ ๋ก์ง(์ฝ๋)์ ์ฌ์ฌ์ฉํ๊ธฐ ์ํ ๊ณ ๊ธ ๊ธฐ์ ์ ๋๋ค
# ๋ฐ๋ณต๋๋ ์ปดํฌ๋ํธ ๋ก์ง
์ฌ๊ธฐ์ ์ปดํฌ๋ํธ์ ๋ก์ง์ ์ฌ์ฌ์ฉํ๋ค๋ ๋ง์ด ๋ฌด์จ ์๋ฏธ์ผ๊น์? ์ด ํํ์์ ๊ฐ๋ฆฌํค๊ณ ์๋ ์ปดํฌ๋ํธ ๋ก์ง์ด๋ ๋ทฐ์์ ์ธ์คํด์ค ์ต์ ์ ์๋ฏธํฉ๋๋ค. ์ฝ๋๋ก ๋ฐ๋ก ์ดํด๋ณด๊ฒ ์ต๋๋ค.
<!-- ProductList.vue -->
<template>
<section>
<ul>
<li v-for="product in products">
...
</li>
</ul>
</section>
</template>
<script>
import bus from './bus.js';
export default {
name: 'ProductList',
mounted() {
bus.$emit('off:loading');
},
// ...
}
</script>
<!-- UserList.vue -->
<template>
<div>
<div v-for="product in products">
...
</div>
</div>
</template>
<script>
import bus from './bus.js';
export default {
name: 'UserList',
mounted() {
bus.$emit('off:loading');
},
// ...
}
</script>
์ ์ฝ๋๋ ProductList ๋ผ๋ ์ปดํฌ๋ํธ์ UserList ์ปดํฌ๋ํธ์ ๋ก์ง์ ์ ์ํ ์ฝ๋์ ๋๋ค. ๋ ์ปดํฌ๋ํธ๊ฐ ๊ฐ๊ฐ ์ํ๊ณผ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์๋ฒ์์ ๋ฐ์์ ํ์ํด์ฃผ๋ ์ปดํฌ๋ํธ๋ผ๊ณ ๊ฐ์ ํ์ ๋, ๊ณตํต์ ์ผ๋ก ๋ค์ด๊ฐ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
name: '์ปดํฌ๋ํธ ์ด๋ฆ',
mounted() {
bus.$emit('off:loading');
},
name
์ ์ปดํฌ๋ํธ์ ์ด๋ฆ์ ์ ์ํด์ฃผ๋ ์์ฑ์ด๊ณ , mounted()
์์ ์ฌ์ฉํ ์ด๋ฒคํธ ๋ฒ์ค๋ ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๋ค ๋ฐ์์์ ๋ ์คํผ๋๋ ํ๋ก๊ทธ๋ ์ค ๋ฐ์ ๊ฐ์ ๋ก๋ฉ ์ํ๋ฅผ ์๋ฃํด์ฃผ๋ ์ฝ๋์
๋๋ค. ์ด ๋ ์ปดํฌ๋ํธ ์ด์ธ์๋ ์๋ฒ์์ ๋ฐ์ดํฐ ๋ชฉ๋ก์ ๋ฐ์์ ํ์ํด์ฃผ๋ ์ปดํฌ๋ํธ๊ฐ ์๋ค๋ฉด ๋ ๋น์ทํ ๋ก์ง์ด ๋ฐ๋ณต๋ ๊ฒ์
๋๋ค.
์ด ๋ ์ด ๋ฐ๋ณต๋๋ ์ฝ๋๋ฅผ ์ค์ฌ์ค ์ ์๋ ํจํด์ด ๋ฐ๋ก ํ์ด ์ค๋ ์ปดํฌ๋ํธ์ ๋๋ค.
# ํ์ด ์ค๋ ์ปดํฌ๋ํธ๋ก ๋ฐ๋ณต ์ฝ๋ ์ค์ด๊ธฐ
์ด ๋ฐ๋ณต๋๋ ์ฝ๋๋ฅผ ์ค์ด๊ธฐ ์ํด ํ์ด ์ค๋ ์ปดํฌ๋ํธ๋ฅผ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค.
// CreateListComponent.js
import bus from './bus.js'
import ListComponent from './ListComponent.vue';
export default function createListComponent(componentName) {
return {
name: componentName,
mounted() {
bus.$emit('off:loading');
},
render(h) {
return h(ListComponent);
}
}
}
์ ์ฝ๋๋ CreateListComponent๋ผ๋ ํ์ด ์ค๋ ์ปดํฌ๋ํธ๋ฅผ ๊ตฌํํ ์ฝ๋์ ๋๋ค. ํ์ด ์ค๋ ์ปดํฌ๋ํธ๋ฅผ ์ ์ฉํ ์ปดํฌ๋ํธ๋ค์ ๊ณตํต ์ฝ๋๋ค(mounted, name ๋ฑ)์ ๋ฏธ๋ฆฌ ์ ์ํ์ต๋๋ค. ๊ทธ๋ผ ์ด์ ์ด ํ์ด ์ค๋ ์ปดํฌ๋ํธ๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ ๊น์? ์๋๋ฅผ ๋ณด๊ฒ ์ต๋๋ค.
// router.js
import createListComponent from './createListComponent.js';
new VueRouter({
routes: [
{
path: 'products',
component: createListComponent('ProductList')
},
{
path: 'users',
component: createListComponent('UserList')
},
...
]
})
์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ํ์ด ์ค๋ ์ปดํฌ๋ํธ๋ฅผ ์ํฌํธ ํ๊ณ , ๊ฐ ์ปดํฌ๋ํธ์ ์ด๋ฆ๋ง ์ ์๋ฅผ ํด์ฃผ๋ฉด ์ปดํฌ๋ํธ์ ๊ธฐ๋ณธ ๊ณต์ฉ ๋ก์ง์ธ mounted()
, name
๋ฅผ ๊ฐ์ง๊ณ ์ปดํฌ๋ํธ๊ฐ ์์ฑ๋ฉ๋๋ค. ๋ฐ๋ผ์, ์ปดํฌ๋ํธ๋ง๋ค ๋ถ ํ์ํ๊ฒ ๋ฐ๋ณต๋๋ ์ฝ๋๋ฅผ ์ ์ํ์ง ์์๋ ๋ฉ๋๋ค.
โ Renderless Components Overview โ