Vue: ์—ฌ๋Ÿฌ ์ธ์ˆ˜๊ฐ€ ์žˆ๋Š” $emit์€ $event๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ธ๋ผ์ธ ๋ฆฌ์Šค๋„ˆ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์žƒ์Šต๋‹ˆ๋‹ค.

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

๋ฒ„์ „

2.2.6

์žฌ์ƒ์‚ฐ ๋งํฌ

https://jsfiddle.net/psycketom/50wL7mdz/29927/

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

  • ๊ตฌ์„ฑ ์š”์†Œ ๋Š” ๋ฌธ์„œ์— ๋”ฐ๋ผ ํŽ˜์ด๋กœ๋“œ์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ์ธ์ˆ˜ $emit('event', first, second, arbitrary) ์™€ ํ•จ๊ป˜ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค .
  • ๋ถ€๋ชจ๋Š” ์ธ๋ผ์ธ ๋ฌธ @event="listener($event)" ํ†ตํ•ด ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์ „์ฒด ํŽ˜์ด๋กœ๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๊ณ  ์ฒซ ๋ฒˆ์งธ ๊ฐ’๋งŒ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์— ์ฃผ๋ชฉํ•˜์„ธ์š”.

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

์ „์ฒด ์ด๋ฒคํŠธ ํŽ˜์ด๋กœ๋“œ(๋ฐฐ์—ด ๋˜๋Š” ๊ธฐํƒ€ ์ˆ˜๋‹จ).

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

์ฒซ ๋ฒˆ์งธ ๊ฐ’๋งŒ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.


v-for ๋กœ ๊ตฌ์„ฑ ์š”์†Œ ๋ชฉ๋ก์„ ์ƒ์„ฑํ•˜์—ฌ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  index ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๋ฆฌ์Šค๋„ˆ์— ์ „๋‹ฌํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. @event="listener(index, $event) .

๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ํ•ด๊ฒฐ๋˜์–ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(๋ฐ”์ธ๋”ฉ๋œ ๋ฐ์ดํ„ฐ ์†์„ฑ?!). ๊ทธ๋ ‡๋‹ค๋ฉด ๋ช‡ ๊ฐ€์ง€ ์ง€์นจ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

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

arguments : https://jsfiddle.net/50wL7mdz/30115/

์Šคํ”„๋ ˆ๋“œ ๊ตฌ๋ฌธ์€ *.vue ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ณ€ํ™˜๋˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ € ๋‚ด ์ปดํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ณ€ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

arguments : https://jsfiddle.net/50wL7mdz/30115/

์Šคํ”„๋ ˆ๋“œ ๊ตฌ๋ฌธ์€ *.vue ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ณ€ํ™˜๋˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ € ๋‚ด ์ปดํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ณ€ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

...arguments ์—ฌ์ „ํžˆ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? @myevent="$emit('myevent', ...arguments)" ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋‹ค์‹œ ๋‚ด๋ณด๋‚ด๊ณ  ์ด๋ฒคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ตœ์‹  vue-template-compiler ๋ฐ vue๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ TypeError: "vm is undefined" ์ฝ˜์†”์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์˜ค๋ฅ˜์˜ ์†Œ์Šค์ธ ๋‚ด ํŠธ๋žœ์ŠคํŒŒ์ผ๋œ ์ฝ”๋“œ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

            on: {
              myevent: function($event) {
                var i = arguments.length,
                  argsArray = Array(i)
                while (i--) argsArray[i] = arguments[i]
                return _vm.$emit.apply(
                  void 0,
                  ["myevent"].concat(argsArray)
                )
              }
            }

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ 5๋ฒˆ์งธ ์ค„ vm._events[lowerCaseEvent] ์—์„œ TypeError๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” Vue ์ฝ”๋“œ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. ์œ„์˜ void 0 ๊ฐ€ undefined ๋ฅผ ์•„๋ž˜์˜ vm ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ์–ด๋””์—์„œ ์˜ค๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

Vue.prototype.$emit = function (event) {
    var vm = this;
    if (process.env.NODE_ENV !== 'production') {
      var lowerCaseEvent = event.toLowerCase();
      if (lowerCaseEvent !== event && vm._events[lowerCaseEvent]) {
        tip(
          "Event \"" + lowerCaseEvent + "\" is emitted in component " +
          (formatComponentName(vm)) + " but the handler is registered for \"" + event + "\". " +
          "Note that HTML attributes are case-insensitive and you cannot use " +
          "v-on to listen to camelCase events when using in-DOM templates. " +
          "You should probably use \"" + (hyphenate(event)) + "\" instead of \"" + event + "\"."
        );
      }
    }
    var cbs = vm._events[event];
    if (cbs) {
      cbs = cbs.length > 1 ? toArray(cbs) : cbs;
      var args = toArray(arguments, 1);
      var info = "event handler for \"" + event + "\"";
      for (var i = 0, l = cbs.length; i < l; i++) {
        invokeWithErrorHandling(cbs[i], vm, args, vm, info);
      }
    }
    return vm
  };

@yyx990803 ...์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ @rightaway ์™€ ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€

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