Material-ui: [TextField] Chrome ์ž๋™ ์™„์„ฑ ์ฒ˜๋ฆฌ

์— ๋งŒ๋“  2019๋…„ 02์›” 06์ผ  ยท  57์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: mui-org/material-ui

์ดˆ๊ธฐ ํŽ˜์ด์ง€๋กœ๋“œ์‹œ ํฌ๋กฌ์ด ํ…์ŠคํŠธ ์ƒ์ž๋ฅผ ๋ฏธ๋ฆฌ ์ฑ„์šธ ๋•Œ TextField ๊ฐœ์š” ๋ณ€ํ˜•์— ํ‘œ์‹œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž๋™์œผ๋กœ ์ฑ„์›Œ์ง„ ํ…์ŠคํŠธ๊ฐ€ ๋ ˆ์ด๋ธ”์„ ๋ฎ์–ด ์”๋‹ˆ๋‹ค. ์•„๋ž˜ ์Šคํฌ๋ฆฐ ์ƒท์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
screenshot from 2019-02-06 08-37-05

๋˜ํ•œ ์ž๋™์œผ๋กœ ์ฑ„์›Œ์ง„ ํ…์ŠคํŠธ์˜ ๋…ธ๋ž€์ƒ‰ ๋ฐฐ๊ฒฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์žฌ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

MUI ๋ฒ„์ „ 3.9.2

bug ๐Ÿ› TextField important

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

๋˜ํ•œ ์ž๋™์œผ๋กœ ์ฑ„์›Œ์ง„ ํ…์ŠคํŠธ์˜ ๋…ธ๋ž€์ƒ‰ ๋ฐฐ๊ฒฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์žฌ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@garygrubb ํ…Œ๋งˆ ์žฌ์ •์˜๋ฅผ ํ†ตํ•ด์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

const theme = createMuiTheme({
  overrides: {
    MuiInputBase: {
      input: {
        '&:-webkit-autofill': {
          transitionDelay: '9999s',
          transitionProperty: 'background-color, color',
        },
      },
    },
  },
});

์ด์ƒ์ ์ด์ง€๋Š” ์•Š์ง€๋งŒ ๋ฌด์–ธ๊ฐ€์ž…๋‹ˆ๋‹ค.

๋Œ€์•ˆ์€ ์ƒ์ž ๊ทธ๋ฆผ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž…๋ ฅ์„ ์ฑ„์šฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค : https://stackoverflow.com/questions/2781549/removing-input-background-colour-for-chrome-autocomplete

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

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค! # 14453์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@garygrubb ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ง€์†์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์žฌํ˜„ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ด๊ฒƒ์€ Google ๊ธฐ๋ณธ ๋กœ๊ทธ์ธ ์–‘์‹๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

capture d ecran 2019-02-08 a 18 18 40

์‘๋‹ต์ด ์ง€์—ฐ๋˜์–ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋ฒˆ ์ฃผ ํ›„๋ฐ˜์— ์‹œ๊ฐ„์ด ํ—ˆ๋ฝ๋˜๋ฉด ์ž‘์€ ๋ณต์ œํ’ˆ์„ ๋งŒ๋“ค๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ๋™์•ˆ ์ž„์‹œ ์ˆ˜์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค. Textfield ์ค‘ ํ•˜๋‚˜์— autoFocus๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

`                            <TextField
                                required
                                **autoFocus**
                                variant="outlined"
                                id="username"
                                label="mobile number"
                                defaultValue=""
                                margin="normal"
                                name="username"
                                type="tel"
                                onChange={this.handleChange}
                                error={!this.state.validMobile}
                                autoComplete="tel-national username"
                            />

ํ…์ŠคํŠธ ํ•„๋“œ ์ค‘ ํ•˜๋‚˜์— autoFocus๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ž๋™์œผ๋กœ ์ฑ„์›Œ์ง„ ํ…์ŠคํŠธ์˜ ๋…ธ๋ž€์ƒ‰ ๋ฐฐ๊ฒฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์žฌ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@garygrubb ํ…Œ๋งˆ ์žฌ์ •์˜๋ฅผ ํ†ตํ•ด์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

const theme = createMuiTheme({
  overrides: {
    MuiInputBase: {
      input: {
        '&:-webkit-autofill': {
          transitionDelay: '9999s',
          transitionProperty: 'background-color, color',
        },
      },
    },
  },
});

์ด์ƒ์ ์ด์ง€๋Š” ์•Š์ง€๋งŒ ๋ฌด์–ธ๊ฐ€์ž…๋‹ˆ๋‹ค.

๋Œ€์•ˆ์€ ์ƒ์ž ๊ทธ๋ฆผ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž…๋ ฅ์„ ์ฑ„์šฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค : https://stackoverflow.com/questions/2781549/removing-input-background-colour-for-chrome-autocomplete

@oliviertassinari ์ด๊ฒƒ์€ ํŠธ๋ฆญ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค : https://stackoverflow.com/a/41530164/396889

๋˜ํ•œ ์ฐธ๊ณ  : https://github.com/facebook/react/issues/1159

@MarkMurphy ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ์žฌํ˜„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€

@MarkMurphy ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ์žฌํ˜„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€

๋‚˜๋ฅผ ์œ„ํ•ด ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ ์–‘์‹์„ ๋งŒ๋“ค๊ณ  Chrome์ด ๋‚ด ์ž๊ฒฉ ์ฆ๋ช…์„ ๊ธฐ์–ตํ•˜๋„๋ก ํ—ˆ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

MacOS High Sierra 10.13.6์—์„œ Chrome 72.0.3626.119 ์‚ฌ์šฉ

@ material-ui / core ๋ฒ„์ „ "3.8.1"
@ material-ui / styles ๋ฒ„์ „ "3.0.0-alpha.6"

@MarkMurphy https://material-ui.com/getting-started/page-layout-examples/sign-in/์œผ๋กœ ์žฌํ˜„ ํ•  ์ˆ˜

feb-27-2019 13-13-39

์ด๊ฒƒ์€ ํ…์ŠคํŠธ ํ•„๋“œ ํ‘œ์ค€ ๋ณ€ํ˜•์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ํฌ์ปค์Šค ํ™œ์„ฑ ์ƒํƒœ๊ฐ€ ๊ฐ์ง€๋˜์ง€ ์•Š๊ณ  # 14132์— ์ˆ˜์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์ฑ„์šฐ๊ธฐ ์ƒํƒœ๋Š” ํŽ˜์ด์ง€๋กœ ํฌ์ปค์Šค๋ฅผ ์ด๋™ํ•  ๋•Œ๋งŒ ๊ฐ์ง€๋ฉ๋‹ˆ๋‹ค.

์ง€๊ธˆ ์„ค๋ช… ๋œ ๋ณ€ํ˜•์„ ์‚ฌ์šฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ํŽ˜์ด์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค : https://deploy-preview-14499--material-ui.netlify.com/getting-started/page-layout-examples/sign-in-side/

feb-27-2019 13-24-10

ํฌ๋กฌ ์ž๋™ ์™„์„ฑ ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํฌ๋กฌ์˜ ์ž๋™ ์™„์„ฑ์„ ๊ฐ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ œ๊ณต ๋˜์—ˆ๋‹ค๋ฉด ์‰ฝ๊ฒŒ ๊ณ ์น  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•ด๊ฒฐ์ฑ…์„ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์œ ์ผํ•œ ํ•ด๊ฒฐ์ฑ…์€ ๋ชจ๋“  ํ…์ŠคํŠธ ํ•„๋“œ์— ๋Œ€ํ•ด ์ž๋™ ์™„์„ฑ / ์ž๋™ ์™„์„ฑ์„ ๋„๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ ymoon715 ์œ„์— ๋งํฌ๋ฅผ ๊ฒŒ์‹œ ํ•œ ๋‹ค๋ฅธ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์ด ํ•˜๋‚˜

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ๋ฌธ์„œ :

input:-webkit-autofill,
.my-class:-webkit-autofill {
    -webkit-transition-delay: 9999999s;
}

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @cezarderevlean , ๋…ธ๋ž€์ƒ‰ ๋ฐฐ๊ฒฝ์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ํšŒ์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋œ ๋„์šฐ๋ฏธ ํ…์ŠคํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„ ๋‚ด๋ฉด๋ฉ๋‹ˆ๋‹ค.
Screenshot from 2019-04-22 11-14-45

์œ„์— ๋„ฃ์€ ์ฒซ ๋ฒˆ์งธ ๋งํฌ์— ์„ค๋ช… ๋œ๋Œ€๋กœ ์ž๋™ ์™„์„ฑ์„ "๋น„ํ™œ์„ฑํ™”"ํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ์ž๋™ ์™„์„ฑ ํ›„์—๋Š” ์ฝ”๋“œ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ํŽ˜์ด์ง€๊ฐ€ ์ƒˆ๋กœ ๊ณ ์ณ์ง„ ๊ฒฝ์šฐ์—๋งŒ ์Šคํฌ๋ฆฐ ์ƒท์ฒ˜๋Ÿผ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ (๋‚ด๊ฐ€ ํ…Œ์ŠคํŠธ ํ•œ ํ•œ). ์ •์ƒ์ ์ธ ๋ธŒ๋ผ์šฐ์ €๋กœ๋“œ / ์ƒˆ๋กœ ๊ณ ์นจ์€ ๊ดœ์ฐฎ์„ ๊ฒƒ์ด๋ฉฐ ์ž๋ฆฌ ํ‘œ์‹œ์ž๊ฐ€ ์ค„์–ด๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ์œ„์—์„œ ๋งํ•œ ๊ฒƒ์ด ์‚ฌ์‹ค์ด ์•„๋‹ˆ๋ผ๋ฉด ๊ตฌํ˜„ํ•  ์ˆ˜์žˆ๋Š” ํ•œ ๊ฐ€์ง€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ํ•ญ์ƒ TextField ์—์„œ์ด ์†Œํ’ˆ์œผ๋กœ ์ž๋ฆฌ ํ‘œ์‹œ์ž๋ฅผ ์ถ•์†Œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

InputLabelProps={{
    shrink: true,
}}

@cezarderevlean ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์˜ณ์Šต๋‹ˆ๋‹ค. ์ •์ƒ์ ์ธ ๋ธŒ๋ผ์šฐ์ € ์ƒˆ๋กœ ๊ณ ์นจ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋†“์นœ ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด์ง€๋งŒ @MarkMurphy ๋Š” ๋น„์Šทํ•œ ํ•ด๊ฒฐ์ฑ…์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๊ณ  ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ์•ฝ๊ฐ„ ๋” ๊นจ๋—ํ•œ ์žฌ๋ฃŒ ํ…Œ๋งˆ ์žฌ์ •์˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๋งˆํฌ.

์œ„์— ๋„ฃ์€ ์ฒซ ๋ฒˆ์งธ ๋งํฌ์— ์„ค๋ช… ๋œ๋Œ€๋กœ ์ž๋™ ์™„์„ฑ์„ "๋น„ํ™œ์„ฑํ™”"ํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ์ž๋™ ์™„์„ฑ ํ›„์—๋Š” ์ฝ”๋“œ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ํŽ˜์ด์ง€๊ฐ€ ์ƒˆ๋กœ ๊ณ ์ณ์ง„ ๊ฒฝ์šฐ์—๋งŒ ์Šคํฌ๋ฆฐ ์ƒท์ฒ˜๋Ÿผ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ (๋‚ด๊ฐ€ ํ…Œ์ŠคํŠธ ํ•œ ํ•œ). ์ •์ƒ์ ์ธ ๋ธŒ๋ผ์šฐ์ €๋กœ๋“œ / ์ƒˆ๋กœ ๊ณ ์นจ์€ ๊ดœ์ฐฎ์„ ๊ฒƒ์ด๋ฉฐ ์ž๋ฆฌ ํ‘œ์‹œ์ž๊ฐ€ ์ค„์–ด๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ์œ„์—์„œ ๋งํ•œ ๊ฒƒ์ด ์‚ฌ์‹ค์ด ์•„๋‹ˆ๋ผ๋ฉด ๊ตฌํ˜„ํ•  ์ˆ˜์žˆ๋Š” ํ•œ ๊ฐ€์ง€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ํ•ญ์ƒ TextField ์—์„œ์ด ์†Œํ’ˆ์œผ๋กœ ์ž๋ฆฌ ํ‘œ์‹œ์ž๋ฅผ ์ถ•์†Œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

InputLabelProps={{
    shrink: true,
}}

๊ณ ๋งˆ์›Œ, ์ด๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ–ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ด๋ฆ„ ํ•„๋“œ์— autoFocus ์„ ์„ค์ •ํ•˜๊ณ  ์•”ํ˜ธ ํ•„๋“œ์— autoComplete='new-password' ์„ค์ •ํ•˜๋Š” ๊ฒƒ๋„ ๋‚˜์—๊ฒŒ ํŠธ๋ฆญ์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ : ์—ฌ๊ธฐ์„œ ์ด์„ ์œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ฐ’์˜ ์กด์žฌ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋Œ€์‹  (https://github.com/mui-org/material-ui/issues/14427#issuecomment-466054906 ์ฐธ์กฐ) ์ž…๋ ฅ์˜ ์‹ค์ œ ๊ฐ’์„ ์–ป๊ณ  ์žํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด, I ' ์ด SO ๋ฌธ์„œ์— ์ž์„ธํžˆ ์„ค๋ช… ๋œ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. https://stackoverflow.com/questions/35049555/chrome-autofill-autocomplete-no-value-for-password/56157489#56157489. ๋งํฌ์—๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ Chrome์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ด ์ „๋ฐ˜์ ์ธ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ข‹์€ ๊ธฐ๋ก์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  componentDidMount() {
    var evt = new MouseEvent("click", {
      view: window,
      clientX: 0
    });
    window.dispatchEvent(evt);
    let iterations = 0;

    const interval = setInterval(() => {
      const value = this.inputs.email.value;
      // plain js alternative:
      // const value = document.getElementById("email").value;
      if (!!value || iterations > 20) {
        console.log(value);
        return clearInterval(interval);
      }

      iterations++;
      console.log("not found -> repeat");
    }, 100);
  }

๊ธฐ๋ณธ์ ์œผ๋กœ ์ž…๋ ฅ์— ๋งˆ์šฐ์Šค๋ฅผ ๊ฐ•์ œ๋กœ ํด๋ฆญํ•˜์—ฌ Chrome์ด ์ž…๋ ฅ์— ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‚˜์ค‘์— ๊ฐ’์ด ์ค€๋น„๋˜๋ฉด ๊ฐ’์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ํ•ดํ‚ค์ด์ง€๋งŒ Chrome์€ ์˜ต์…˜์ด ์—†์Šต๋‹ˆ๋‹ค ... (SO ๊ธฐ์‚ฌ์—์„œ Chrome์˜ ์ž์„ธ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ ์ฐธ์กฐ).

์š”์•ฝ : ์ด๊ฒƒ์€ ๋ธŒ๋ผ์šฐ์ € ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์–‘์‹์„ ์ž๋™์œผ๋กœ ์ฑ„์šธ ๋•Œ ์ž…๋ ฅ ์ด๋ฒคํŠธ๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

ํด๋ง๋˜์—ˆ์„ ๋•Œ ์ž๋™์œผ๋กœ ์ฑ„์›Œ์ง€๋”๋ผ๋„ ์ž…๋ ฅ ๊ฐ’์ด ์—ฌ์ „ํžˆ ๋น„์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€์กฐ์ฐจ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ํฌ๋กฌ๋งŒ์„์œ„ํ•œ ๊น”๋”ํ•œ ํŠธ๋ฆญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Chrome์—๋งŒ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”์ง€ ์กฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@ eps1lon Chromium๊ณผ ๊ด€๋ จ๋œ ๊ฒฝ์šฐ Chromium์—์„œ ๋ฒ„๊ทธ๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค : https://github.com/mui-org/material-ui/issues/718#issuecomment -529064043.
์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค : InputLabelProps = {{shrink : true}}, ๋น„๋ก ํ•ญ์ƒ ์ถ•์†Œ ๋œ ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฐจ์ด์ ์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

diff --git a/packages/material-ui/src/InputBase/InputBase.js b/packages/material-ui/src/InputBase/InputBase.js
index d258e5b71d..a7aebb1288 100644
--- a/packages/material-ui/src/InputBase/InputBase.js
+++ b/packages/material-ui/src/InputBase/InputBase.js
@@ -311,6 +311,10 @@ const InputBase = React.forwardRef(function InputBase(props, ref) {
     }
   };

+  // Check the input state on mount, in case it was filled by the user
+  // or auto filled by the browser before the hydration (for ssr).
+  React.useEffect(() => {
+    checkDirty(inputRef.current);
+  }, []);
+
   const handleClick = event => {
     if (inputRef.current && event.currentTarget === event.target) {
       inputRef.current.focus();

๋ˆ„๊ตฌ๋“ ์ง€ ์ˆ˜์ •์˜ ํ’ˆ์งˆ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@oliviertassinari ๋จธํ‹ฐ๋ฆฌ์–ผ UI์— ์ž‘๋™ํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ์–ด์•ผํ•˜์ง€๋งŒ ์œ„์—์„œ ์–ธ๊ธ‰ ํ•œ @ eps1lon ๊ณผ ๊ฐ™์€ Chromium ๋ฒ„๊ทธ ์ธ ๊ฒฝ์šฐ์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์ผ์‹œ์ ์œผ๋กœ ๋งŒ ์ˆ˜์ •ํ•ด์•ผํ•˜๋ฉฐ ๋ฌธ์ œ๋Š” Chromium ๋‚ด์—์„œ ์ˆ˜์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Chromium์˜ ๋ฒ„๊ทธ์ธ์ง€ ์•„๋‹ˆ๋ฉด MUI ๋ฒ„๊ทธ์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

Chromium ๋ฒ„๊ทธ ์ธ ๊ฒฝ์šฐ์ด๋ฅผ ์œ„ํ•ด ํฌ๋กฌ์—์„œ ์—ด๋ฆฐ ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์œ ์‚ฌ : ํฌ๋กฌ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ

(https://github.com/mui-org/material-ui/issues/14427#issuecomment-524535710)

์ด ์‹œ์ ์—์„œ Chrome์˜ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. React์™€ ์„œ๋ฒ„ ์ธก ๋ Œ๋”๋ง ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅ์— ์ฝ˜ํ…์ธ ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด React hydrate ์ „์—๋Š” ์ด์— ๋Œ€ํ•œ ์•Œ๋ฆผ์„๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค : https://github.com/facebook/react/issues/12955

@oliviertassinari ํ•˜์ง€๋งŒ create-react-app ๊ฐœ๋ฐœ ์„œ๋ฒ„์—์„œ ์„œ๋ฒ„ ์ธก ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋ฌธ์ œ๋Š” onInput ๋˜๋Š” onChange ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ์„ค์ •๋˜์–ด์•ผ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๊ฐ€์žฅ ๋†’์Šต๋‹ˆ๋‹ค. ํฌ๋กฌ ์ž๋™ ์™„์„ฑ ํ›„์— ์ด๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•˜๋ฉด ์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ๊ฐ€ ์†์‹ค๋ฉ๋‹ˆ๋‹ค. ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋งŽ์„์ˆ˜๋ก ์ด๋ฒคํŠธ๋ฅผ ์žƒ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค. React๋Š” ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ์œ„ํ•œ ๋…ธ๋ ฅ์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ˆ˜ํ™” ๋œ UI์— ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ๊ฐ’์ด ์ž๋™์œผ๋กœ ์ฑ„์›Œ์ ธ๋„ input.value ๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜๋„ํ•˜์ง€ ์•Š์€ ๋ถ€์ž‘์šฉ (์˜ˆ : ์–‘์‹ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ)์ด์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด์žˆ๋Š” ์ž…๋ ฅ์„ ์ง‘์ค‘ / ํ๋ฆฌ๊ฒŒ ํ•œ ํ›„์— ๋งŒ.

์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ์˜ˆ๊ฐ€ ๊ฑฐ์˜์—†๋Š” ๋ณด๊ณ ์„œ๊ฐ€ ๊ฑฐ์˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ฌธ์ œ๋ฅผ ์ œ๋Œ€๋กœ ์กฐ์‚ฌํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ด๋ก ์ ์œผ๋กœ @oliviertassinari https://github.com/mui-org/material-ui/issues/14427#issuecomment -530145849์˜ ์ˆ˜์ •์ด ์ ์–ด๋„ ์ปค๋ฒ„ํ•ด์•ผํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋ฌธ์ œ๋ฅผ ์ œ๋Œ€๋กœ ์‹๋ณ„ ํ•  ๋•Œ๊นŒ์ง€ ์ˆ˜์ •์„ ์ ์šฉํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์‚ญ์ œ ๋œ ์ด๋ฒคํŠธ.

@ eps1lon ํฅ๋ฏธ https://material-ui.com/getting-started/page-layout-examples/sign-in/ (๊ฐœ๋ฐœ ๋ชจ๋“œ, ๋‚ด ๋กœ์ปฌ ํ™˜๊ฒฝ)์—์„œ ์žฌํ˜„ ํ•  ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ๋ฌธ์ œ์— ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ํ…Œ์ŠคํŠธ (๋™ ๊ธฐ์ ์œผ๋กœ ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ ์ˆ˜์‹ )๋ฅผ ์‹คํ–‰ํ•˜์—ฌ "์ˆ˜ํ™” ์ „์— ํŠธ๋ฆฌ๊ฑฐ ๋œ ์ด๋ฒคํŠธ"๊ฐ€ ๋ฌธ์ œ์˜ ์›์ธ์ธ์ง€ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ ์–ด๋„ React๊ฐ€ https://github.com/facebook/react/issues/12955์— ๊ด€์‹ฌ์„ ๋ณด์ผ ๋•Œ๊นŒ์ง€ ์ฒ˜๋ฆฌ ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@croraf CRA๋กœ ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ์žฌํ˜„ํ•ฉ๋‹ˆ๊นŒ?

"์ˆ˜ํ™” ์ „์— ํŠธ๋ฆฌ๊ฑฐ ๋œ ์ด๋ฒคํŠธ"๋ฌธ์ œ๊ฐ€ https://github.com/mui-org/material-ui/issues/14132#issuecomment -453657016์—์„œ๋„ ์šฐ๋ฆฌ์—๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@oliviertassinari CRA๋Š” ์—ฌ๊ธฐ์„œ๋Š” ๊ด€๋ จ์ด ์—†์ง€๋งŒ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ CRA์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์ด ์ฝ”๋“œ ์ƒŒ๋“œ ๋ฐ•์Šค๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ CRA๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋„ํ•ฉ๋‹ˆ๋‹ค) : https://codesandbox.io/s/textinput-bug-hsv9m

A)์ด ์ฝ”๋“œ ์ƒŒ๋“œ ๋ฐ•์Šค์—์„œ ์žฌํ˜„ํ•˜๋ ค๋ฉด :
1) ์ƒˆ ์ฐฝ์—์„œ์ด ์ƒŒ๋“œ ๋ฐ•์Šค์˜ ์•ฑ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์—ฝ๋‹ˆ ๋‹ค.
2) ์ž๊ฒฉ ์ฆ๋ช… ์ž…๋ ฅ ๋ฐ ์ €์žฅ (Chrome ๋Œ€ํ™” ์ƒ์ž์—์„œ ์ €์žฅ์„ ์š”์ฒญํ•œ ํ›„)
3) ์ฐฝ์„ ์ƒˆ๋กœ ๊ณ ์นจํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค (Chrome์ด ์ž๋™ ์™„์„ฑ์„ ์ ์šฉํ•˜๋ฏ€๋กœ). ์ƒˆ๋กœ ๊ณ ์นจ์‹œ ๋ฌธ์ œ๊ฐ€ ์ผ๊ด€๋˜๊ฒŒ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์ง€๋งŒ F5 (๋น ๋ฅธ ์ด์ค‘ ์ƒˆ๋กœ ๊ณ ์นจ)๋ฅผ ๋‘ ๋ฒˆ ํด๋ฆญํ•˜๋ฉด ๊ฑฐ์˜ ์ผ๊ด€๋˜๊ฒŒ ์žฌํ˜„๋ฉ๋‹ˆ๋‹ค.

B) ๋˜ํ•œ ๋น„์Šทํ•œ ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค
1) codesandbox ์•ฑ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์—์„œ (๋ณ„๋„์˜ ์•ฑ ์ฐฝ์— ์žˆ์ง€ ์•Š์Œ).
2) ์–‘์‹ ์ž‘์„ฑ ๋ฐ ์ œ์ถœ (Chrome์— ์‚ฌ์šฉ์ž ์ด๋ฆ„ / ๋น„๋ฐ€๋ฒˆํ˜ธ ์กฐํ•ฉ ์ €์žฅ)
3) ์•ฑ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋งŒ ๋‹ค์‹œ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์–‘์‹์€ ์ฆ‰์‹œ ์ž๋™์œผ๋กœ ์ฑ„์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (material-ui sandbox์—์„œ ์ž๋™์œผ๋กœ ์ฑ„์›Œ์ง„ ํ•„๋“œ ๋‚ด์šฉ์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค)
4) ์‚ฌ์šฉ์ž ์ด๋ฆ„ ํ…์ŠคํŠธ ํ•„๋“œ๋ฅผ ํด๋ฆญํ•˜์‹ญ์‹œ์˜ค. Chrome์€ ์‚ฌ์šฉ์ž๋ฅผ ์„ ํƒํ•˜๋„๋ก ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.
5) ์‚ฌ์šฉ์ž๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์•”ํ˜ธ ํ•„๋“œ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

image

@ eps1lon ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์„ค์ •๋˜๊ธฐ ์ „์— Chrome์ด ์ž๋™ ์™„์„ฑ ๊ด€๋ จ ์ด๋ฒคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฌธ์ œ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ React๊ฐ€ DOM์— ์ž…๋ ฅ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ธฐ ์ „์— Chrome์€ ์–ด๋–ป๊ฒŒ ์ž๋™ ์™„์„ฑ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, JavaScript๊ฐ€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์„ค์ •ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜๊ธฐ ์ „์— React๊ฐ€ DOM์—์„œ์ด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์ˆ˜์ƒํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ SSR์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ). ๊ทธ๋Ÿฌ๋‚˜ CRA ๊ฐœ๋ฐœ ์„œ๋ฒ„๋Š” SSR์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@ eps1lon ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์„ค์ •๋˜๊ธฐ ์ „์— Chrome์ด ์ž๋™ ์™„์„ฑ ๊ด€๋ จ ์ด๋ฒคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฌธ์ œ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ฐ˜์‘์— ์˜ํ•ด ์ˆ˜ํ™”๋˜๊ณ  ํ˜„์žฌ ์žฌ์ƒ์‚ฐ์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ก ์ ์œผ๋กœ ๋งŒ ๊ตฌ์„ฑ๋œ ์ •์  html์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด์ œ ์‹ค์ œ ๋ฌธ์ œ๋ฅผ ์กฐ์‚ฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Chrome v76.0.3809.132, macOS v10.14.6์—์„œ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค .
Chrome v76.0.3809.87, Windows 10์—์„œ ๋ฌธ์ œ์˜ ์ผ๋ถ€๋ฅผ ์žฌํ˜„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

๋™์ผํ•œ ์„ค์ • ์ธ Chrome v76.0.3809.132, macOS v10.14.6์—์„œ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

๋‚ด ์†”๋ฃจ์…˜ :

import { isChrome, osName} from "react-device-detect";
.....
.....

  const isChromeOSX = osName === 'Mac OS' && isChrome

  const [shrink, setShrink] = useState(isChromeOSX ? true : undefined)

  useEffect(() => {
    if(isChromeOSX) {
      const listen = () => {
        setShrink(undefined)
        window.removeEventListener('click',listen)
      }
      window.addEventListener('click', listen);
      return () => {
        window.removeEventListener('click',listen)
      };
    }
  }, [])

  return  <TextField
          .....
          variant="outlined"
          InputLabelProps={{ shrink }}
        />

๋‹ค์Œ diff๋Š” ๋‚ด๊ฐ€ ์žฌํ˜„ ํ•  ์ˆ˜์žˆ๋Š” ๋ฌธ์ œ์˜ ๋ฐœ์ƒ์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

diff --git a/packages/material-ui/src/FormControl/FormControl.js b/packages/material-ui/src/FormControl/FormControl.js
index 0ede7ca404..c7cb22aeb9 100644
--- a/packages/material-ui/src/FormControl/FormControl.js
+++ b/packages/material-ui/src/FormControl/FormControl.js
@@ -145,6 +145,14 @@ const FormControl = React.forwardRef(function FormControl(props, ref) {
     };
   }

+  const onFilled = React.useCallback(() => {
+    setFilled(true);
+  }, []);
+
+  const onEmpty = React.useCallback(() => {
+    setFilled(false);
+  }, []);
+
   const childContext = {
     adornedStart,
     disabled,
@@ -156,16 +164,8 @@ const FormControl = React.forwardRef(function FormControl(props, ref) {
     onBlur: () => {
       setFocused(false);
     },
-    onEmpty: () => {
-      if (filled) {
-        setFilled(false);
-      }
-    },
-    onFilled: () => {
-      if (!filled) {
-        setFilled(true);
-      }
-    },
+    onEmpty,
+    onFilled,
     onFocus: () => {
       setFocused(true);
     },
diff --git a/packages/material-ui/src/InputBase/InputBase.js b/packages/material-ui/src/InputBase/InputBase.js
index d258e5b71d..9cb6c94f43 100644
--- a/packages/material-ui/src/InputBase/InputBase.js
+++ b/packages/material-ui/src/InputBase/InputBase.js
@@ -116,6 +116,13 @@ export const styles = theme => {
       '&$disabled': {
         opacity: 1, // Reset iOS opacity
       },
+      '&:-webkit-autofill': {
+        animationDuration: '5000s',
+        animationName: '$auto-fill',
+      },
+    },
+    '<strong i="6">@keyframes</strong> auto-fill': {
+      from: {},
     },
     /* Styles applied to the `input` element if `margin="dense"`. */
     inputMarginDense: {
@@ -239,17 +246,20 @@ const InputBase = React.forwardRef(function InputBase(props, ref) {
     }
   }, [muiFormControl, disabled, focused, onBlur]);

+  const onFilled = muiFormControl && muiFormControl.onFilled;
+  const onEmpty = muiFormControl && muiFormControl.onEmpty;
+
   const checkDirty = React.useCallback(
     obj => {
       if (isFilled(obj)) {
-        if (muiFormControl && muiFormControl.onFilled) {
-          muiFormControl.onFilled();
+        if (onFilled) {
+          onFilled();
         }
-      } else if (muiFormControl && muiFormControl.onEmpty) {
-        muiFormControl.onEmpty();
+      } else if (onEmpty) {
+        onEmpty();
       }
     },
-    [muiFormControl],
+    [onFilled, onEmpty],
   );

   useEnhancedEffect(() => {
@@ -311,6 +321,12 @@ const InputBase = React.forwardRef(function InputBase(props, ref) {
     }
   };

+  // Check the input state on mount, in case it was filled by the user
+  // or auto filled by the browser before the hydration (for SSR).
+  React.useEffect(() => {
+    checkDirty(inputRef.current);
+  }, []); // eslint-disable-line react-hooks/exhaustive-deps
+
   const handleClick = event => {
     if (inputRef.current && event.currentTarget === event.target) {
       inputRef.current.focus();
@@ -354,6 +370,10 @@ const InputBase = React.forwardRef(function InputBase(props, ref) {
     };
   }

+  const handleAutoFill = () => {
+    // Provide a fake value as Chrome might not let you access it for security reasons.
+    checkDirty({ value: 'x' });
+  };
+
   return (
     <div
       className={clsx(
@@ -399,6 +419,7 @@ const InputBase = React.forwardRef(function InputBase(props, ref) {
           defaultValue={defaultValue}
           disabled={fcs.disabled}
           id={id}
+          onAnimationStart={handleAutoFill}
           name={name}
           onBlur={handleBlur}
           onChange={handleChange}

ํ•œ ๋ถ€๋ถ„์€ https://github.com/tocco/tocco-client/commit/cb3b9b59994380f17c6650ffe4b63f96948072b6์—์„œ ์˜๊ฐ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค

material-ui sandbox (๋ฌธ์„œ ํŽ˜์ด์ง€)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์ด ์ˆ˜์ • ์‚ฌํ•ญ์„ ๋กœ์ปฌ์—์„œ ํ…Œ์ŠคํŠธํ–ˆ์œผ๋ฉฐ ์ ์šฉ ํ•  ๋•Œ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์ด ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค.
image


์ด ์ˆ˜์ •์œผ๋กœ https://github.com/mui-org/material-ui/issues/14427#issuecomment -530503051์˜ ํŒŒํŠธ B์— ์–ธ๊ธ‰ ๋œ ์œ ์‚ฌํ•œ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์—์„œ ๋ณธ ๊ฒƒ :image

@oliviertassinari @ eps1lon ๋น„์ฆˆ๋‹ˆ์Šค ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ v4.4.3์„ ํ…Œ์ŠคํŠธํ–ˆ๋Š”๋ฐ ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. (์–ด์ฉŒ๋ฉด ๊ฐ€์žฅ ์šฐ์•„ํ•œ๋˜์ง€๋Š” ์•Š์ง€๋งŒ) ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ํ•ญ์ƒ ๋ ˆ์ด๋ธ” ์ œ๊ธฐ์— ๋‚ด๊ฐ€ ํ•ดํ‚น์„ ์ œ๊ฑฐ ๊ทธ๊ฒƒ์€ ํŒจ์น˜๋ฅผ ๋ณด์ธ๋‹ค ๊ทธ๋ž˜์„œ ( InputLabelProps={{ shrink: true }} ์ •๋ง ์ข‹์€ ํ•ดํ‚น์ด ๋ ˆ์ด๋ธ”๋กœ๋„ ์ž…๋ ฅ์ด ๊ฒฝ์šฐ ์˜ค๋ฅด์ง€๋˜์—ˆ๋‹ค๋˜์ง€ ์•Š์€ ํ•„๋“œ๊ฐ€ ๋น„์–ด ์žˆ์Œ).

ํŠธ์œ— ๋‹ด์•„ ๊ฐ€๊ธฐ
๋ถˆํ–‰ํžˆ๋„ ์ด์ œ ์‚ฌ์†Œํ•œ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž๋™ ์™„์„ฑ์œผ๋กœ ์žฌ์ƒํ•  ๋•Œ. ์‚ฌ์šฉ์ž๋ฅผ ์„ ํƒํ•œ ๋‹ค์Œ ์•”ํ˜ธ๋ฅผ ์‚ญ์ œ ํ•œ ๋‹ค์Œ ํ•„๋“œ๊ฐ€ ๋น„์–ด ์žˆ์–ด๋„ ๋ ˆ์ด๋ธ”์ด ๊ณ„์† ์˜ฌ๋ผ๊ฐ„ ์ƒํƒœ๋กœ ๋‹ค์‹œ ์„ ํƒํ•ด๋ณด์‹ญ์‹œ์˜ค.
image
->
image

ํฌ๋กฌ : 77
Ubuntu : 18.04

@oliviertassinari @ eps1lon @croraf ๋‚˜๋Š” ๋˜ํ•œ ๋ฌธ์ œ๊ฐ€ ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋‚ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ๋„์›€์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@garygrubb ์œ„์˜ ๊ฒŒ์‹œ๋ฌผ์—์„œ ์–ธ๊ธ‰ ํ•œ ๋ฏธ๋ฌ˜ํ•œ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

@coraf ์˜ˆ ๋ฐ์Šคํฌํ†ฑ Chrome ๋ฒ„์ „ 76.0.3809.132 (๊ณต์‹ ๋นŒ๋“œ) (64 ๋น„ํŠธ)์—์„œ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ ํ•  ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋ฐ”์ผ ๋ฒ„์ „๊ณผ ํŒŒ์ด์–ด ํญ์Šค๋Š” ๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๋‹ค.
์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ์—ด๋ฉด ๋”ฐ๋ผ๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ๋‚˜๋ฅผ ํƒœ๊ทธ ํ•ด์ฃผ์„ธ์š”.

๋‹ค์Œ์ด ๋„์›€์ด ๋ ๊นŒ์š”?

diff --git a/packages/material-ui/src/InputBase/InputBase.js b/packages/material-ui/src/InputBase/InputBase.js
index 439e8afa7..f0ab8bb66 100644
--- a/packages/material-ui/src/InputBase/InputBase.js
+++ b/packages/material-ui/src/InputBase/InputBase.js
@@ -373,6 +373,12 @@ const InputBase = React.forwardRef(function InputBase(props, ref) {
   }

   const handleAutoFill = () => {
+    // The change event is correcty triggered when the input is focused.
+    // There is no need to detect autofill.
+    if (fcs.focused) {
+      return;
+    }
+
     // Provide a fake value as Chrome might not let you access it for security reasons.
     checkDirty({ value: 'x' });
   };

@oliviertassinari ์ข‹์•„์š”, mui ๋ฌธ์„œ ํŽ˜์ด์ง€์—์„œ ๋‚˜๋จธ์ง€ ๋ฌธ์ œ๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ์žฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ฐธ๊ณ  :์ด ๋‚˜๋จธ์ง€ ๋ฌธ์ œ๋Š” ์›๋ž˜ ๋ฌธ์ œ์™€ ๋น„๊ตํ•  ๋•Œ ๋งค์šฐ ์‚ฌ์†Œํ•œ ๋ฌธ์ œ์ด๋ฉฐ ์•„๋งˆ๋„ ๊ทธ๋‹ค์ง€ ๋†’์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  1. localhost : 3000์— ๋Œ€ํ•œ ํฌ๋กฌ ์ €์žฅ์†Œ ์ž๊ฒฉ ์ฆ๋ช… (์‚ฌ์šฉ์ž ์ด๋ฆ„ ๋ฐ ์•”ํ˜ธ) ๋งŒ๋“ค๊ธฐ
  2. http : // localhost : 3000 / components / text-fields # outlined ์ƒˆ๋กœ ๊ณ ์นจ
    ๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์–ป๋Š”๋‹ค.
    image

  3. ์ด๋ฉ”์ผ ํ•„๋“œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์‚ญ์ œํ•˜์ง€๋งŒ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์—ฌ์ „ํžˆ ์ž๋™์œผ๋กœ ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค.
    image

  4. ์ด๋ฉ”์ผ ํ•„๋“œ๋ฅผ ํด๋ฆญํ•˜์‹ญ์‹œ์˜ค. Chrome์€ ํ•ด๋‹น ํŽ˜์ด์ง€ ( localhost:3000 )์˜ ์ €์žฅ๋œ ์‚ฌ์šฉ์ž๊ฐ€์žˆ๋Š” ๋“œ๋กญ ๋‹ค์šด์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  5. ๋“œ๋กญ ๋‹ค์šด์—์„œ ์ œ๊ณต๋œ ์‚ฌ์šฉ์ž ์ค‘ ํ•œ ๋ช… ์œ„๋กœ ๋งˆ์šฐ์Šค๋ฅผ ๊ฐ€์ ธ ๊ฐ€์ง€๋งŒ ์„ ํƒํ•˜์ง€๋Š” ๋งˆ์‹ญ์‹œ์˜ค. Chrome์€ ํ•„๋“œ์—์„œ ํ•ด๋‹น ์‚ฌ์šฉ์ž ์„ ํƒ์˜ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  6. ๋“œ๋กญ ๋‹ค์šด์„ ํด๋ฆญํ•˜์—ฌ ๋‹ซ์Šต๋‹ˆ๋‹ค.

์ด ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
image

@oliviertassinari ๊ท€ํ•˜์˜ ์ถ”๊ฐ€ ์ˆ˜์ •์€ ์ œ๊ฐ€ ์„ค๋ช…ํ•œ ๋‚˜๋จธ์ง€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋ฌธ์ œ์˜ ๋˜ ๋‹ค๋ฅธ ๋ง›์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค : D
๋ณต์ œ ๋‹จ๊ณ„๋Š” ์œ„์™€ ๋น„์Šทํ•˜์ง€๋งŒ 3 ๋‹จ๊ณ„์—์„œ ์ˆ˜๋™์œผ๋กœ ์•”ํ˜ธ๋ฅผ ์ง€ ์›๋‹ˆ๋‹ค.

  1. ์‚ฌ์šฉ์ž ์ด๋ฆ„ ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ํ•„๋“œ๋ฅผ ๋ชจ๋‘ ์‚ญ์ œํ•˜์‹ญ์‹œ์˜ค.

์ด๊ฒƒ์€ ๋งˆ์ง€๋ง‰์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ ๋ฌธ์ œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
image

์ด๊ฒƒ์€ ๋งˆ์ง€๋ง‰์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ ๋ฌธ์ œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

@croraf ์˜ค ์ด๋Ÿฐ, ๋‚˜๋Š” ์ด๊ฒƒ์ด ์˜ค๋Š” ๊ฒƒ์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค! ๋„ค, ๋ง์ด ๋˜๋„ค์š”.

diff --git a/packages/material-ui/src/InputBase/InputBase.js b/packages/material-ui/src/InputBase/InputBase.js
index 763ab105c..9dce66f9d 100644
--- a/packages/material-ui/src/InputBase/InputBase.js
+++ b/packages/material-ui/src/InputBase/InputBase.js
@@ -86,6 +86,7 @@ export const styles = theme => {
       // Make the flex item shrink with Firefox
       minWidth: 0,
       width: '100%', // Fix IE 11 width issue
+      animationName: '$auto-fill-cancel',
       '&::-webkit-input-placeholder': placeholder,
       '&::-moz-placeholder': placeholder, // Firefox 19+
       '&:-ms-input-placeholder': placeholder, // IE 11
@@ -123,6 +124,9 @@ export const styles = theme => {
     '<strong i="9">@keyframes</strong> auto-fill': {
       from: {},
     },
+    '<strong i="10">@keyframes</strong> auto-fill-cancel': {
+      from: {},
+    },
     /* Styles applied to the `input` element if `margin="dense"`. */
     inputMarginDense: {
       paddingTop: 4 - 1,
@@ -380,9 +384,11 @@ const InputBase = React.forwardRef(function InputBase(props, ref) {
     };
   }

-  const handleAutoFill = () => {
+  const handleAutoFill = event => {
     // Provide a fake value as Chrome might not let you access it for security reasons.
-    checkDirty({ value: 'x' });
+    checkDirty(
+      event.animationName.indexOf('auto-fill-cancel') !== -1 ? inputRef.current : { value: 'x' },
+    );
   };

   return (

์—์„œ:

4.4.2
Sep-23-2019 22-48-19

4.4.3
Sep-23-2019 22-48-26

์ œ์•ˆ ๋œ ํŒจ์น˜
Sep-23-2019 22-47-06

@oliviertassinari , @croraf- ํ”„๋กœ๋•์…˜์—์„œ ํ…Œ์ŠคํŠธ๋˜์—ˆ์œผ๋ฉฐ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌ.
๋‚ด๊ฐ€ ํ…Œ์ŠคํŠธํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฒ„๊ทธ ์ˆ˜์ •์— ๋‚˜๋ฅผ ํƒœ๊ทธ ํ•ด์ฃผ์„ธ์š”. ๊ธฐ๊บผ์ด ๋„์™€ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์„ ๋“ฃ๊ณ  ํ–‰๋ณตํ•ฉ๋‹ˆ๋‹ค.

์–ด๋‘์šด ํ…Œ๋งˆ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

unsupported

@MAkerboom ์ƒ‰์ƒ์„ ๋” ์ง„ํ•œ ํŒŒ๋ž€์ƒ‰์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹คํ—˜ ํ•ด๋ณด๊ณ  ์‹ถ์€ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@oliviertassinari ์œค๊ณฝ์„ ์ด ํ‘œ์‹œ๋˜๊ณ  ์—ฌ์ „ํžˆ ํ…์ŠคํŠธ์™€ ์ถฉ๋ถ„ํ•œ ๋Œ€๋น„๊ฐ€์žˆ๋Š” ํ•œ ๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๋‹ค.

@MAkerboom ๋‚ด๊ฐ€ ์ƒ๊ฐ

diff --git a/packages/material-ui/src/FilledInput/FilledInput.js b/packages/material-ui/src/FilledInput/FilledInput.js
index 71d0bcc94..4b681cba1 100644
--- a/packages/material-ui/src/FilledInput/FilledInput.js
+++ b/packages/material-ui/src/FilledInput/FilledInput.js
@@ -106,6 +106,12 @@ export const styles = theme => {
     /* Styles applied to the `input` element. */
     input: {
       padding: '27px 12px 10px',
+      '&:-webkit-autofill': {
+        WebkitBoxShadow: theme.palette.type === 'dark' ? '0 0 0 100px #266798 inset' : null,
+        WebkitTextFillColor: theme.palette.type === 'dark' ? '#fff' : null,
+        borderTopLeftRadius: 'inherit',
+        borderTopRightRadius: 'inherit',
+      },
     },
     /* Styles applied to the `input` element if `margin="dense"`. */
     inputMarginDense: {
diff --git a/packages/material-ui/src/OutlinedInput/OutlinedInput.js b/packages/material-ui/src/OutlinedInput/OutlinedInput.js
index f60c4e5d5..376e37ba8 100644
--- a/packages/material-ui/src/OutlinedInput/OutlinedInput.js
+++ b/packages/material-ui/src/OutlinedInput/OutlinedInput.js
@@ -65,6 +65,11 @@ export const styles = theme => {
     /* Styles applied to the `input` element. */
     input: {
       padding: '18.5px 14px',
+      '&:-webkit-autofill': {
+        WebkitBoxShadow: theme.palette.type === 'dark' ? '0 0 0 100px #266798 inset' : null,
+        WebkitTextFillColor: theme.palette.type === 'dark' ? '#fff' : null,
+        borderRadius: theme.shape.borderRadius,
+      },
     },
     /* Styles applied to the `input` element if `margin="dense"`. */
     inputMarginDense: {

๋„ˆ๋Š” ๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ๊ฒƒ์ด ๊ดœ์ฐฎ ๋‹ˆ? ํ’€ ์š”์ฒญ์„ ์ œ์ถœ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? :)

Capture dโ€™eฬcran 2019-10-13 aฬ€ 12 10 55
Capture dโ€™eฬcran 2019-10-13 aฬ€ 12 11 12

ํ›จ์”ฌ ๋‚ซ๋‹ค! ๊ณ ๋งˆ์›Œ. PR์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค
test akerboom app_(Pixel 2)

<AutoComplete/> ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ์ด ๋ฒ„๊ทธ๋ฅผ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ํ…์ŠคํŠธ ํ•„๋“œ์— ์ดˆ์ ์„ ๋งž์ถœ ๋•Œ ๋ ˆ์ด๋ธ”์ด "์ถ•์†Œ"๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Firefox์™€ Chrome์—์„œ ์ด๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค (๋‹ค๋ฅธ ๋ธŒ๋ผ์šฐ์ €๋Š” ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค). v4.5.0์—์„œ v4.5.2๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์™€ ๊ด€๋ จ๋œ PR์ด ์ฑ…์ž„์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

FWIW๋Š” ํฌ๋กฌ์ด ์ž๋™์œผ๋กœ ์ฑ„์›Œ์ง„ ์ž…๋ ฅ์— ์‚ฌ์šฉ์ž ์ •์˜ ์ƒ‰์ƒ์„ ํ‘œ์‹œํ•˜์ง€ ์•Š๋„๋กํ•˜๋Š” ํ…Œ๋งˆ ์žฌ์ •์˜์ž…๋‹ˆ๋‹ค.

theme = {
    overrides: {
        MuiInputBase: {
            root: {
                fontFamily: '"Lato", serif',
                "& input": {
                    "&:-webkit-autofill": {
                        transition:
                            "background-color 50000s ease-in-out 0s, color 50000s ease-in-out 0s",
                    },
                    "&:-webkit-autofill:focus": {
                        transition:
                            "background-color 50000s ease-in-out 0s, color 50000s ease-in-out 0s",
                    },
                    "&:-webkit-autofill:hover": {
                        transition:
                            "background-color 50000s ease-in-out 0s, color 50000s ease-in-out 0s",
                    },
                },
            },
        },
    }
}

@armellarcier ๊ณต์œ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ์ƒ‰์ƒ์„ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ด๊ณ , ์‚ฌ์šฉ์ž๋ฅผ ๋•๊ธฐ์œ„ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ณด์•ˆ ๊ด€์ ์—์„œ ํฅ๋ฏธ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ๋„๋ฉ”์ธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ๋” ์ž˜ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ž๋™ ์™„์„ฑ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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