React: ๋ฒ„๊ทธ: Firefox: ์ž๋™ ์™„์„ฑ/์ž๋™ ์™„์„ฑ์ด ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์Œ

์— ๋งŒ๋“  2020๋…„ 05์›” 23์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: facebook/react

์„ค๋ช…, ์žฌํ˜„ ๋‹จ๊ณ„ ๋ฐ ์ƒŒ๋“œ๋ฐ•์Šค ์˜ˆ๋Š” #17022๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”!
Firefox์˜ ๊ธฐ๋ณธ ์ž๋™ ์™„์„ฑ ๊ธฐ๋Šฅ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ(antd, material UI)์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

๋„ค์ดํ‹ฐ๋ธŒ ์ž๋™ ์™„์„ฑ์€ ๋งค์šฐ ์ค‘์š”ํ•œ UX ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— react ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ํ•œ ๋ฒˆ ์‹œ๋„ํ•ด ์ฃผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Unconfirmed

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

๋‚˜๋Š” ์ด๊ฒƒ์„ ์กฐ์‚ฌํ–ˆ๊ณ  React๊ฐ€ ์ œ์–ด๋œ ์ž…๋ ฅ์— ๋Œ€ํ•ด ์ž…๋ ฅ DOM ๋…ธ๋“œ์˜ defaultValue ๋ฅผ ํ˜„์žฌ value ๋กœ ์„ค์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. node.value === node.defaultValue Firefox์—์„œ ํ•ญ๋ชฉ์„ ์ œ์ถœํ•˜๋ฉด ์ž๋™ ์™„์„ฑ์„ ์œ„ํ•ด ์ €์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด๋””์—๋„ ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ ํ…Œ์ŠคํŠธ(React ์—†์ด)๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ""ํ•ด๊ฒฐ"" ์ œ๊ฑฐํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค.
https://github.com/facebook/react/blob/1d85bb3ce13401644a5e345f8bc84522c59a951c/packages/react-dom/src/client/ReactDOMInput.js#L420

๋ฐ˜์ž‘์šฉ ์ด์œ ๋Š” ์ง€์ •ํ•ฉ๋‹ˆ๊นŒ defaultValue ํ˜„์žฌ value ๋‹น์‹ ์ด ์ž…๋ ฅ์ด ์žˆ์œผ๋ฉด ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค type="reset" ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ํด๋ฆญ, ๋‹น์‹ ์ด ๋‹น์‹ ์˜ ํ†ต์ œ์—์„œ ๋นˆ ํ•„๋“œ๋ฅผ ์–ป์„ ๊ฒƒ ํ•ด๋‹น ๋ผ์ธ์„ ์ œ๊ฑฐํ•œ ๊ฒฝ์šฐ ์ž…๋ ฅ(๋‹ค์Œ์— ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๋ฉด ์ˆ˜์ •๋จ). ์ ์–ด๋„ ์ฝ”๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

defaultValue ๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜์—ฌ ์ œ์–ด๋œ ์ž…๋ ฅ์— ๋Œ€ํ•ด Firefox์—์„œ ์ž๋™ ์™„์„ฑ/์ž๋™ ์™„์„ฑ์ด ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  function handleChange(event) {
    Object.defineProperty(event.target, "defaultValue", {
      configurable: true,
      get() { return "" },
      set() {},
    });
    setValue(event.target.value);
  }

type="reset" ์ด ์—†๋Š” ํ•œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  ํ•„๋“œ๊ฐ€ ๊ณต๋ฐฑ์œผ๋กœ ์žฌ์„ค์ •๋จ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋‹ค์Œ์— ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๋ฉด ์ˆ˜์ •๋จ). ๋‚˜๋Š” ์ด๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ "ํ•ดํ‚น"์ด๋ฉฐ 100% ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์—์„œ๋Š” ์–ด๋””์—์„œ๋„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ์ด๊ฒƒ์€ ์•„๋งˆ๋„ Firefox ..์˜ ๋ฒ„๊ทธ ๋˜๋Š” ๊ธฐ๋Šฅ(๋ฒ„๊ทธ?)์ด์ง€๋งŒ ์‚ฌ์–‘, MDN ๋˜๋Š” ๋‹ค๋ฅธ ๊ณณ์—์„œ node.value === node.defaultValue ๊ฐ€ ์ž๋™ ์ฑ„์šฐ๊ธฐ๋ฅผ ์œ„ํ•ด ์ €์žฅ์—์„œ ๋น ์ ธ๋‚˜์™€์•ผ ํ•˜๋Š” ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์•„๋ฌด ๊ฒƒ๋„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿคทโ€โ™€๏ธ

์ €๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด PR ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Firefox์—์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ๐Ÿ™ˆ (๋ฒ„๊ทธ์ธ์ง€ ๋ถˆ๋ช…)
React ํ•ต์‹ฌ ํŒ€์˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ๋ฌธ์ œ ๋ฐ/๋˜๋Š” ์ด์— ๋Œ€ํ•ด ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์„ ์•Œ๊ณ  ์žˆ๋Š”์ง€ ์•„๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์ด๊ฒƒ์€ Firefox์˜ ๋ฌธ์ œ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐ๋ชจ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜ HTML + 3์ค„ JS ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
https://codesandbox.io/s/naughty-feather-vwl6v?file=/index.html
๋”ฐ๋ผ์„œ ๊ทธ๊ฒƒ์€ ๊ทธ ์ž์ฒด๋กœ React ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค ๐Ÿค”

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

๋‚˜๋Š” ์ด๊ฒƒ์„ ์กฐ์‚ฌํ–ˆ๊ณ  React๊ฐ€ ์ œ์–ด๋œ ์ž…๋ ฅ์— ๋Œ€ํ•ด ์ž…๋ ฅ DOM ๋…ธ๋“œ์˜ defaultValue ๋ฅผ ํ˜„์žฌ value ๋กœ ์„ค์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. node.value === node.defaultValue Firefox์—์„œ ํ•ญ๋ชฉ์„ ์ œ์ถœํ•˜๋ฉด ์ž๋™ ์™„์„ฑ์„ ์œ„ํ•ด ์ €์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด๋””์—๋„ ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ ํ…Œ์ŠคํŠธ(React ์—†์ด)๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ""ํ•ด๊ฒฐ"" ์ œ๊ฑฐํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค.
https://github.com/facebook/react/blob/1d85bb3ce13401644a5e345f8bc84522c59a951c/packages/react-dom/src/client/ReactDOMInput.js#L420

๋ฐ˜์ž‘์šฉ ์ด์œ ๋Š” ์ง€์ •ํ•ฉ๋‹ˆ๊นŒ defaultValue ํ˜„์žฌ value ๋‹น์‹ ์ด ์ž…๋ ฅ์ด ์žˆ์œผ๋ฉด ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค type="reset" ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ํด๋ฆญ, ๋‹น์‹ ์ด ๋‹น์‹ ์˜ ํ†ต์ œ์—์„œ ๋นˆ ํ•„๋“œ๋ฅผ ์–ป์„ ๊ฒƒ ํ•ด๋‹น ๋ผ์ธ์„ ์ œ๊ฑฐํ•œ ๊ฒฝ์šฐ ์ž…๋ ฅ(๋‹ค์Œ์— ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๋ฉด ์ˆ˜์ •๋จ). ์ ์–ด๋„ ์ฝ”๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

defaultValue ๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜์—ฌ ์ œ์–ด๋œ ์ž…๋ ฅ์— ๋Œ€ํ•ด Firefox์—์„œ ์ž๋™ ์™„์„ฑ/์ž๋™ ์™„์„ฑ์ด ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  function handleChange(event) {
    Object.defineProperty(event.target, "defaultValue", {
      configurable: true,
      get() { return "" },
      set() {},
    });
    setValue(event.target.value);
  }

type="reset" ์ด ์—†๋Š” ํ•œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  ํ•„๋“œ๊ฐ€ ๊ณต๋ฐฑ์œผ๋กœ ์žฌ์„ค์ •๋จ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋‹ค์Œ์— ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๋ฉด ์ˆ˜์ •๋จ). ๋‚˜๋Š” ์ด๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ "ํ•ดํ‚น"์ด๋ฉฐ 100% ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์—์„œ๋Š” ์–ด๋””์—์„œ๋„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ์ด๊ฒƒ์€ ์•„๋งˆ๋„ Firefox ..์˜ ๋ฒ„๊ทธ ๋˜๋Š” ๊ธฐ๋Šฅ(๋ฒ„๊ทธ?)์ด์ง€๋งŒ ์‚ฌ์–‘, MDN ๋˜๋Š” ๋‹ค๋ฅธ ๊ณณ์—์„œ node.value === node.defaultValue ๊ฐ€ ์ž๋™ ์ฑ„์šฐ๊ธฐ๋ฅผ ์œ„ํ•ด ์ €์žฅ์—์„œ ๋น ์ ธ๋‚˜์™€์•ผ ํ•˜๋Š” ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์•„๋ฌด ๊ฒƒ๋„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿคทโ€โ™€๏ธ

์ €๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด PR ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Firefox์—์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ๐Ÿ™ˆ (๋ฒ„๊ทธ์ธ์ง€ ๋ถˆ๋ช…)
React ํ•ต์‹ฌ ํŒ€์˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ๋ฌธ์ œ ๋ฐ/๋˜๋Š” ์ด์— ๋Œ€ํ•ด ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์„ ์•Œ๊ณ  ์žˆ๋Š”์ง€ ์•„๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์ด๊ฒƒ์€ Firefox์˜ ๋ฌธ์ œ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐ๋ชจ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜ HTML + 3์ค„ JS ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
https://codesandbox.io/s/naughty-feather-vwl6v?file=/index.html
๋”ฐ๋ผ์„œ ๊ทธ๊ฒƒ์€ ๊ทธ ์ž์ฒด๋กœ React ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค ๐Ÿค”

๊ด€์‹ฌ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด ๋‹ค์Œ์„ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.
https://bugzilla.mozilla.org/show_bug.cgi?id=1642570
๐Ÿ˜‚

๋‚˜๋Š” ์ด๊ฒƒ์ด # 15739์˜ ๋ณต์ œ๋ณธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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