Vue: @click์€ ๋‹ค๋ฅธ vnode @click ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2017๋…„ 09์›” 11์ผ  ยท  4์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: vuejs/vue

๋ฒ„์ „

2.4.2

๋ณต์ œ ๋งํฌ

https://jsbin.com/qejofexedo/edit?html , js, output

์žฌํ˜„ ๋‹จ๊ณ„

์žฌ์ƒ์‚ฐ ๋งํฌ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋ฌด์—‡์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๊นŒ?

Expand is True ํด๋ฆญํ•˜๋ฉด expand ๋ฅผ ํด๋ฆญํ•˜๋ฉด false ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  countA ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

Expand is Ture ํด๋ฆญํ•ด๋„ ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
countA ๋ฐ countB ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
ํด๋ฆญํ•˜๋ฉด expand ์ด false ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์ง€๋งŒ ์ฆ‰์‹œ ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ vnode ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ™•์žฅ์ด true ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋”

  • ๋‘ ๋ฒˆ์งธ div์˜ ์ด๋ฆ„์„ p , section ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ํƒœ๊ทธ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊พธ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ i ํƒœ๊ทธ์—์„œ ์ฒซ ๋ฒˆ์งธ div์˜ ์ƒ์œ„ div ํƒœ๊ทธ๋กœ ์ด๋™ํ•ด๋„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
bug improvement

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋”ฐ๋ผ์„œ ์ด๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • <i> ์˜ ๋‚ด๋ถ€ ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ nextTick (๋งˆ์ดํฌ๋กœ ํƒœ์Šคํฌ)์— ๋Œ€ํ•œ ์ฒซ ๋ฒˆ์งธ ์—…๋ฐ์ดํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • ๋งˆ์ดํฌ๋กœ ํƒœ์Šคํฌ๋Š” ์ด๋ฒคํŠธ๊ฐ€ ์™ธ๋ถ€ div๋กœ ๋ฒ„๋ธ” ๋ง๋˜๊ธฐ ์ „์— ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค . ์—…๋ฐ์ดํŠธ ์ค‘์— ํด๋ฆญ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์™ธ๋ถ€ div์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.
  • DOM ๊ตฌ์กฐ๊ฐ€ ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ถ€ div์™€ ๋‚ด๋ถ€ ์š”์†Œ๊ฐ€ ๋ชจ๋‘ ์žฌ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฒคํŠธ๋Š” ๋งˆ์ง€๋ง‰์œผ๋กœ ์™ธ๋ถ€ div์— ๋„๋‹ฌํ•˜๊ณ  ์ฒซ ๋ฒˆ์งธ ์—…๋ฐ์ดํŠธ์—์„œ ์ถ”๊ฐ€ ํ•œ ๋ฆฌ์Šค๋„ˆ๋ฅผ ํŠธ๋ฆฌ๊ฑฐ ํ•œ ๋‹ค์Œ ๋‘ ๋ฒˆ์งธ ์—…๋ฐ์ดํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ˆ˜์ •์ด ๋งค์šฐ ๊นŒ๋‹ค ๋กญ๊ณ  ์—…๋ฐ์ดํŠธ ํ์ž‰์„ ์œ„ํ•ด ๋งˆ์ดํฌ๋กœ ํƒœ์Šคํฌ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„์ด ๋ฌธ์ œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : Preact). React๋Š” ํ•ฉ์„ฑ ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค (์•„๋งˆ๋„ ์ด์™€ ๊ฐ™์€ ์—ฃ์ง€ ์ผ€์ด์Šค๋กœ ์ธํ•ด).

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋‘ ๊ฐœ์˜ ์™ธ๋ถ€ div์— ์„œ๋กœ ๋‹ค๋ฅธ ํ‚ค๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์—…๋ฐ์ดํŠธ ์ค‘์— ๊ฐ•์ œ๋กœ ๊ต์ฒด๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋ฒ„๋ธ” ๋ง ๋œ ์ด๋ฒคํŠธ๊ฐ€ ์„ ํƒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

<div class="header" v-if="expand" key="1"> // block 1
  <i @click="expand = false, countA++">Expand is True</i> // element 1
</div>
<div class="expand" v-if="!expand" @click="expand = true, countB++" key="2"> // block 2
  <i>Expand is False</i> // element 2
</div>

๋ชจ๋“  4 ๋Œ“๊ธ€

qq20170911-185025
์ •์ƒ์ธ ๊ฒƒ ๊ฐ™๋‹ค

์žฌํ˜„์ด ์˜๋„ ํ•œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค ...

@Kingwl @ yyx990803 ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋ก€๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ณ  ๋‹ค์‹œ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค.

์ค‘์š”ํ•œ ์ฝ”๋“œ๋Š”

<div class="header" v-if="expand"> // block 1
  <i @click="expand = false, countA++">Expand is True</i> // element 1
</div>
<div class="expand" v-if="!expand" @click="expand = true, countB++"> // block 2
  <i>Expand is False</i> // element 2
</div>

๋„ค ๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํด๋ฆญ ์ด๋ฒคํŠธ๋Š” block 1 ๋ฐ block2 ์—์„œ ์ˆ˜์‹ ํ•˜๊ณ  ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋ฆญ ์ด๋ฒคํŠธ๋Š” element 1 ๋ฐ element 2 ์—์„œ ์ˆ˜์‹ ํ•˜๊ณ  ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋ฆญ ์ด๋ฒคํŠธ ์ˆ˜์‹  block 1 ๋ฐ element 2 , expand ๋ฅผ true๋กœ ๋ณ€๊ฒฝํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋˜๋Œ๋ฆด ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.
  • ํด๋ฆญ ์ด๋ฒคํŠธ๋Š” element 1 ๋ฐ block 2 ์—์„œ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค. expand ๋ฅผ false๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ expand ๋ฅผ true๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • <i> ์˜ ๋‚ด๋ถ€ ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ nextTick (๋งˆ์ดํฌ๋กœ ํƒœ์Šคํฌ)์— ๋Œ€ํ•œ ์ฒซ ๋ฒˆ์งธ ์—…๋ฐ์ดํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • ๋งˆ์ดํฌ๋กœ ํƒœ์Šคํฌ๋Š” ์ด๋ฒคํŠธ๊ฐ€ ์™ธ๋ถ€ div๋กœ ๋ฒ„๋ธ” ๋ง๋˜๊ธฐ ์ „์— ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค . ์—…๋ฐ์ดํŠธ ์ค‘์— ํด๋ฆญ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์™ธ๋ถ€ div์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.
  • DOM ๊ตฌ์กฐ๊ฐ€ ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ถ€ div์™€ ๋‚ด๋ถ€ ์š”์†Œ๊ฐ€ ๋ชจ๋‘ ์žฌ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฒคํŠธ๋Š” ๋งˆ์ง€๋ง‰์œผ๋กœ ์™ธ๋ถ€ div์— ๋„๋‹ฌํ•˜๊ณ  ์ฒซ ๋ฒˆ์งธ ์—…๋ฐ์ดํŠธ์—์„œ ์ถ”๊ฐ€ ํ•œ ๋ฆฌ์Šค๋„ˆ๋ฅผ ํŠธ๋ฆฌ๊ฑฐ ํ•œ ๋‹ค์Œ ๋‘ ๋ฒˆ์งธ ์—…๋ฐ์ดํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ˆ˜์ •์ด ๋งค์šฐ ๊นŒ๋‹ค ๋กญ๊ณ  ์—…๋ฐ์ดํŠธ ํ์ž‰์„ ์œ„ํ•ด ๋งˆ์ดํฌ๋กœ ํƒœ์Šคํฌ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„์ด ๋ฌธ์ œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : Preact). React๋Š” ํ•ฉ์„ฑ ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค (์•„๋งˆ๋„ ์ด์™€ ๊ฐ™์€ ์—ฃ์ง€ ์ผ€์ด์Šค๋กœ ์ธํ•ด).

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋‘ ๊ฐœ์˜ ์™ธ๋ถ€ div์— ์„œ๋กœ ๋‹ค๋ฅธ ํ‚ค๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์—…๋ฐ์ดํŠธ ์ค‘์— ๊ฐ•์ œ๋กœ ๊ต์ฒด๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋ฒ„๋ธ” ๋ง ๋œ ์ด๋ฒคํŠธ๊ฐ€ ์„ ํƒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

<div class="header" v-if="expand" key="1"> // block 1
  <i @click="expand = false, countA++">Expand is True</i> // element 1
</div>
<div class="expand" v-if="!expand" @click="expand = true, countB++" key="2"> // block 2
  <i>Expand is False</i> // element 2
</div>
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰