Vue: ๋น„๋™๊ธฐ๋กœ๋“œ ๋œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ Œ๋”๋งํ•˜๋ฉด ์†์„ฑ์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

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

๋ฒ„์ „

2.6.10

๋ณต์ œ ๋งํฌ

https://codesandbox.io/s/vue-template-7hwty

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

  1. ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ Œ๋”๋ง ํ•  ์ˆ˜์žˆ๋Š” ๋ Œ๋”๋ง ๊ธฐ๋Šฅ์ด์žˆ๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  2. ์•ฝ์† ํ•ด๊ฒฐ / ์‹œ๊ฐ„ ์ดˆ๊ณผ ํ›„ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ Œ๋”๋งํ•˜๋ฉด ์ž์‹ ๊ตฌ์„ฑ ์š”์†Œ์— attr๊ณผ ๋™์ผํ•œ ํ‚ค๊ฐ€์žˆ๋Š” ์†Œํ’ˆ์ด์žˆ๋Š” ๊ฒฝ์šฐ ๋‘ ๋ฒˆ ๋ Œ๋”๋ง๋˜๊ณ  $attrs ๋ฉ๋‹ˆ๋‹ค.
  3. targetComponent์˜ prop์— ์ฃผ์„์„ ๋‹ฌ๊ณ  ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  4. ๋ชจ๋“  ์†์„ฑ์ด ๋‹ค์‹œ ์ •์ƒ์ž…๋‹ˆ๋‹ค.

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

Render ํ•จ์ˆ˜๋Š” ํ•œ ๋ฒˆ ํ˜ธ์ถœ๋˜๋ฉฐ $attrs ์ปดํฌ๋„ŒํŠธ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

Render๊ฐ€ ๋‘ ๋ฒˆ ํ˜ธ์ถœ๋˜๊ณ  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์˜ props ์™€ ๋™์ผํ•œ ํ‚ค๋ฅผ ๊ฐ€์ง„ attrs ๊ฐ€ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.


https://vuejs.org/v2/guide/components-dynamic-async.html#Handling -Loading์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ง€์—ฐ๋กœ๋“œ ๋œ ๊ตฌ์„ฑ ์š”์†Œ์˜๋กœ๋“œ ๋ฐ ๋„คํŠธ์›Œํ‚น ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š” ํ”„๋กœ์ ํŠธ ์‚ฌ์šฉ์ž ์ง€์ • ๋กœ๋” ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. -๋‚ด ๊ฒฝ์šฐ์—๋Š” ์ƒํƒœ. ์ด ๋ฒ„๊ทธ๋Š” ๋‹ค์šด๋กœ๋“œ ๋œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ฐ˜์‘์„ฑ์— ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Œ์œผ๋กœ์จ ์ƒ๋žต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€์ˆ˜๋กœ).

bug has workaround

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

$attrs : {...this.$attrs} ์˜ ๋ณต์‚ฌ๋ณธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์†Œํ’ˆ์„ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  render(h) {
    console.log("Attributes of loader:", this.$attrs);
    if (this.targetComponent) {
      return h(this.targetComponent, {
        props: this.$attrs  // Change attrs to props๏ผŒnot `attrs: this.$attrs`
      });
    } else {
      return h("div", "Component is loading");
    }
  }

์†Œํ’ˆ์„ ๊ฐ€์ ธ ์˜ค๋ ค๊ณ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—

const targetComponent = {
  props: {
    // COMMENT PROP
    someProp: {
      type: String
    }
  },
  render(h) {
    console.log("Props of target", this.$props); // You can not get $props when render params only has attrs
    return h("div", "WITH PROP:" + this.someProp);
  }
};

์†์„ฑ์„ ๋ณต์‚ฌํ•˜๊ณ  props๋กœ ์ „๋‹ฌํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€๋งŒ ๋™์ผํ•œ ํ‚ค๋ฅผ ๊ฐ€์ง„ props๋ฅผ ํฌํ•จํ•˜๋Š” ์ž์‹์„ ๋ Œ๋”๋งํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋ชจ ๊ตฌ์„ฑ ์š”์†Œ $attrs ์ด ์™œ ๋ณ€๊ฒฝ๋˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

$attrs ๊ฐœ์ฒด๊ฐ€ ์žฌ ํ• ๋‹น ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋ฏธ ๋‹ค๋ฅธ ๊ณณ์—์„œ์ด ๋ฌธ์ œ๋ฅผ ๋ณด์•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์—ˆ๋‹ค.
https://github.com/vuejs/vue/issues/10115์˜ ์ค‘๋ณต

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰