์ค๋ช
, ์ฌํ ๋จ๊ณ ๋ฐ ์๋๋ฐ์ค ์๋ #17022๋ฅผ ์ฐธ์กฐํ์ธ์!
Firefox์ ๊ธฐ๋ณธ ์๋ ์์ฑ ๊ธฐ๋ฅ์ ์ฌ์ ํ โโ์๋ํ์ง ์์ต๋๋ค.
์ด๊ฒ์ ๋ค๋ฅธ ํ๋ ์์ํฌ(antd, material UI)์๋ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
๋ค์ดํฐ๋ธ ์๋ ์์ฑ์ ๋งค์ฐ ์ค์ํ UX ๊ธฐ๋ฅ์ด๋ผ๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ react ์ปค๋ฎค๋ํฐ์ ๋๊ตฐ๊ฐ๊ฐ ํ ๋ฒ ์๋ํด ์ฃผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
๋๋ ์ด๊ฒ์ ์กฐ์ฌํ๊ณ 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์ ๋ณต์ ๋ณธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋๋ ์ด๊ฒ์ ์กฐ์ฌํ๊ณ 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์์ ์๋ ์์ฑ/์๋ ์์ฑ์ด ์๋ํ๋๋ก ํ ์ ์์ต๋๋ค.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 ๋ฌธ์ ๊ฐ ์๋๋๋ค ๐ค