Ant-design: ์—…๋กœ๋“œ file.status๊ฐ€ ํ•ญ์ƒ ์—…๋กœ๋“œ ์ค‘์ž…๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2016๋…„ 07์›” 18์ผ  ยท  90์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: ant-design/ant-design

์ง€์—ญ ํ™˜๊ฒฝ

  • antd ๋ฒ„์ „ : 1.6.5
  • ์šด์˜ ์ฒด์ œ ๋ฐ ๋ฒ„์ „ : mac 10.11.5
  • ๋ธŒ๋ผ์šฐ์ € ๋ฐ ๋ฒ„์ „ : 50.0.2661.102

๋ฌด์Šจ ์ง“์„ ํ•œ๊ฑฐ์•ผ?

๋ฒ„์ „ 1.6.5์—์„œ Upload ์ปจํŠธ๋กค์˜ onChange ๋ฉ”์„œ๋“œ๋Š” ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๋ฉฐ info.file.status๋Š” ํ•ญ์ƒ ์—…๋กœ๋“œ ์ค‘์ด๋ฉฐ http ์š”์ฒญ์€ ์ •์ƒ์ด๋ฉฐ 200์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
1.6.4๋กœ ๋‹ค์šด ๊ทธ๋ ˆ์ด๋“œ ํ›„ ์ •์ƒ์ ์ธ ์‚ฌ์šฉ, ์—…๋กœ๋“œ ํ›„ info.file.status ์™„๋ฃŒ

๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์‹ค์ œ ๊ฒฐ๊ณผ:

์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ์˜จ๋ผ์ธ ๋ฐ๋ชจ

์•„๋‹ˆ

Question Usage โ“FAQ

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

์ œ์–ด ๋ชจ๋“œ์˜ ๊ฒฝ์šฐ, ๋‹น์‹ ์€ ํ•ญ์ƒ setState๋ฅผํ•ด์•ผ fileList ์—์„œ onChange ๋ชจ๋“  ๊ตญ๊ฐ€๊ฐ€ ์—…๋กœ๋“œ์— ๋™๊ธฐํ™”๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์žˆ๋Š” ๋ฌธ๊ตฌ์™€ ์œ ์‚ฌ : http://ant.design/components/upload/#components -upload-demo-fileList

// good

onFileChange(fileList) {
  if ( ... ) {
    ...
  } else {
    ...
  }
  // always setState
  this.setState({ fileList: [...fileList] });
}

...

<Upload fileList={this.state.fileList} onChange={this.onFileChange} />
// bad

onFileChange(fileList) {
  if ( ... ) {
    this.setState({ fileList: [...fileList] });
  } else {
    ...
  }
}

...

<Upload fileList={this.state.fileList} onChange={this.onFileChange} />

์ œ์–ด ๋œ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ฐœ๋…์„ ์—ฐ๊ตฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. https://facebook.github.io/react/docs/forms.html#controlled -components


Upload๊ฐ€ ์–ด๋ ˆ์ด์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ ํ•  ์ˆ˜ ์žˆ๋„๋ก fileList ๋ฅผ ๋ณต์ œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

- this.setState({ fileList });
+ this.setState({ fileList: [...fileList] });

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

์‹ค์ œ ํ…Œ์ŠคํŠธ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๋Š”๋ฐ ๋ฌธ์ œ์˜ ์™„์ „ํ•œ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์‰ฝ๊ฒŒ ์žฌํ˜„ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?

์ฃผ์†Œ ๋ณ€๊ฒฝ :
http://codepen.io/xiongying/pen/jAGRvx?editors=0011

์ œ์–ด ๋ชจ๋“œ์˜ ๊ฒฝ์šฐ, ๋‹น์‹ ์€ ํ•ญ์ƒ setState๋ฅผํ•ด์•ผ fileList ์—์„œ onChange ๋ชจ๋“  ๊ตญ๊ฐ€๊ฐ€ ์—…๋กœ๋“œ์— ๋™๊ธฐํ™”๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์žˆ๋Š” ๋ฌธ๊ตฌ์™€ ์œ ์‚ฌ : http://ant.design/components/upload/#components -upload-demo-fileList

// good

onFileChange(fileList) {
  if ( ... ) {
    ...
  } else {
    ...
  }
  // always setState
  this.setState({ fileList: [...fileList] });
}

...

<Upload fileList={this.state.fileList} onChange={this.onFileChange} />
// bad

onFileChange(fileList) {
  if ( ... ) {
    this.setState({ fileList: [...fileList] });
  } else {
    ...
  }
}

...

<Upload fileList={this.state.fileList} onChange={this.onFileChange} />

์ œ์–ด ๋œ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ฐœ๋…์„ ์—ฐ๊ตฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. https://facebook.github.io/react/docs/forms.html#controlled -components


Upload๊ฐ€ ์–ด๋ ˆ์ด์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ ํ•  ์ˆ˜ ์žˆ๋„๋ก fileList ๋ฅผ ๋ณต์ œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

- this.setState({ fileList });
+ this.setState({ fileList: [...fileList] });

e0a986ed71cd87e506fb8e4ee5e2e0130fc70ae1

์—…๋กœ๋“œ ์ปจํŠธ๋กค์„ ์‚ฌ์šฉํ•  ๋•Œ ํ•ญ์ƒ ์—…๋กœ๋“œ์— ์‹คํŒจํ•˜๊ณ  ํ•ญ์ƒ ์˜ค๋ฅ˜๋ฅผ๋ณด๊ณ ํ•˜๋Š” ์ด์œ  : POST http : // localhost : 8081 / api / nes / 2 / uploadMusic / r_ty 404 (Not Found)

์ œํ•œ๋œ URL์— ID ํ•„๋“œ ๋ฐ ํ† ํฐ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ์ด๋ฅผ ์ „์†กํ•˜๋Š” ์ž‘์—…์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ž‘์—…์€ ์ฃผ์†Œ ๋งŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?

React.PureComponent๊ฐ€ ์ตœ์ ํ™” ํŒ๋‹จ ๋ ˆ์ด์–ด๋ฅผ ๋งŒ๋“ค์–ด ๋ƒˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ React.PureComponent์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ๋ชฉ๋ก์—๋Š” ์ฐธ์กฐ๊ฐ€ ์บ์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ๊ฐ์ฒด์ด๋ฉด ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค .React์—์„œ ์ฆ‰์‹œ ์ƒˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. PureComponent.
handleChange = ({fileList}) => {
// ๋ฒ„๊ทธ ์ˆ˜์ •
this.setState ({fileList : fileList.slice ()});
}

๋ฟก๋ฟก

@yongningfu ํŒ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํŠน๋ณ„ ์•Œ๋ฆผ : ์–•์€ ๋น„๊ต๋ฅผ ์œ„ํ•ด React shouldComponentUpdate๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ œ์–ด ๋ชจ๋“œ์—์„œ ์ƒํƒœ๊ฐ€ Upload์™€ ๋™๊ธฐํ™” ๋˜๋”๋ผ๋„ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ์ฐธ์กฐ๊ฐ€ ํ•ฉ๋™ ===์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ์‚ฌ์ง„ ์—…๋กœ๋“œ, beforeUpload๋Š” ์—…๋กœ๋“œ ์‚ฌ์ง„ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์ œํ•œ์„ ์„ค์ •ํ•˜๊ณ , onChange๋Š” ์„ฑ๊ณต์ ์œผ๋กœ ์—…๋กœ๋“œ ๋œ ์‚ฌ์ง„ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋ช‡ ์žฅ์˜ ์‚ฌ์ง„์„ ์„ฑ๊ณต์ ์œผ๋กœ ์—…๋กœ๋“œ ํ•œ ํ›„ ์ž˜๋ชป๋œ ์‚ฌ์ง„์„ ์—…๋กœ๋“œํ•˜๋ฉด ์ด์ „์— ์„ฑ๊ณต์ ์œผ๋กœ ์—…๋กœ๋“œ ๋œ ๋ชจ๋“  ์‚ฌ์ง„์ด ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๊นŒ? ??

์ฝœ๋ฐฑ ํ•  ๋•Œ this.setState ({fileList});์™€ ๊ฐ™์ด ์ƒํƒœ๋ฅผ ์žฌ์„ค์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

handleChange = (์ •๋ณด) => {
console.log (์ •๋ณด);

    //ๆŠŠfileListๆ‹ฟๅ‡บๆฅ
    let {fileList} = info;

    const status = info.file.status;
    if (status !== 'uploading') {
        console.log(info.file, info.fileList);
    }
    if (status === 'done') {
        message.success(`${info.file.name} file uploaded successfully.`);
    } else if (status === 'error') {
        message.error(`${info.file.name} file upload failed.`);
    }

    //้‡ๆ–ฐ่ฎพ็ฝฎstate
    this.setState( {fileList});
}

onChange๊ฐ€ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•œ Upload๋Š” ํ•ญ์ƒ ๋‚ด๋ถ€์ ์œผ๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์˜ค๋žซ๋™์•ˆ ์›€ํ‘น ๋“ค์–ด ๊ฐ”์œผ๋ฉฐ setState๋กœ ํŒ๋ช…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ด๋ ‡๊ฒŒ ์„ค๊ณ„๋˜์–ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์™œ ๊ฒŒ์œผ๋ฅธ ์™ธ๋ถ€ ์ƒํƒœ์— ์˜์กดํ•ฉ๋‹ˆ๊นŒ?

base64 ์ฝ”๋“œ ๋งŒ ์›ํ•˜๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์š”์ฒญ์„ ์ž๋™์œผ๋กœ ๋ณด๋‚ด๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋ž˜ ์กฐ๊ฐํ’ˆ์ž…๋‹ˆ๊นŒ?

์—…๋กœ๋“œ์— ์‹คํŒจํ•˜๊ณ  ์ด์ „ ๊ธฐ๋ณธ ์ด๋ฏธ์ง€๋ฅผ ํ‘œ์‹œํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

์—…๋กœ๋“œ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์—์„œ
this.setState ({
fileList : intial_list
})
์ด์ „ ๊ธฐ๋ณธ ์‚ฌ์ง„์„ ํ‘œ์‹œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปดํฌ๋„ŒํŠธ ์—…๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์ฝœ๋ฐฑ ์‹คํ–‰ ํƒ€์ด๋ฐ์— ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ์š”์†Œ ๊ด€๊ณ„ ์˜์‚ฌ ์ฝ”๋“œ :

<Controller>
  <Upload fileList={controller.state.fileList} onUpload={controller.onUpload} />
</Controller>

onUpload ํ†ตํ•ด ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋„๋ก ์ƒ์œ„ ๊ตฌ์„ฑ ์š”์†Œ Controller ์— ์•Œ๋ฆผ์ด ์ „์†ก๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ React์˜ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋Š” ๋น„๋™๊ธฐ์‹์ด๋ฏ€๋กœ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ๊ฐ€ ์ถฉ๋ถ„ํžˆ ๋น ๋ฅด๋ฉด ์‹คํ–‰ ์ˆœ์„œ๊ฐ€
constroller.onUpload(ไผš่ฐƒ็”จ controller.setState) -> upload.onSuccess -> upload.componentWillReceiveProps
์ƒํ™ฉ์—์„œ upload.onSuccess ์‹คํ–‰์‹œ ์—…๋กœ๋“œ ์ƒํƒœ์— ํ•ด๋‹นํ•˜๋Š” ์—…๋กœ๋“œ ํŒŒ์ผ์ด ์—†์Šต๋‹ˆ๋‹ค. ์—…๋กœ๋“œ์˜ ๊ฐฑ์‹ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— state.fileList ์— ๋”ฐ๋ผ componentWillReceiveProps .

๋”ฐ๋ผ์„œ์ด ๊ตฌ์„ฑ ์š”์†Œ์˜ ํ˜„์žฌ ์ œ์–ด ๋ชจ๋“œ๋Š” ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ํ•ด๊ฒฐ์ฑ…:

  1. ์ œ์–ด ๋ชจ๋“œ์—์„œ onSuccess ์‹ค์ œ ์ฒ˜๋ฆฌ ๋…ผ๋ฆฌ ๋ฐ ๊ธฐํƒ€ ์ด๋ฒคํŠธ๋Š” componentDidUpdate ์ˆ˜ํ–‰
  2. ํ”ผ state.fileList ์— ์™„์ „ํžˆ ์˜์กด props.fileList , ๊ตฌ์„ฑ ์š”์†Œ ์ธ์Šคํ„ด์Šค ์ธ์Šคํ„ด์Šค (๊ตฌ์„ฑ ์š”์†Œ ์ธ์Šคํ„ด์Šค instance.state์˜ ์ƒํƒœ๊ฐ€ ์•„๋‹Œ) ์ƒ๋Œ€์ ์œผ๋กœ ํŒŒ์ผ ๋ชฉ๋ก์˜ ๋…๋ฆฝ ์œ ์ง€, ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ์˜ ์šฉ์ด์„ฑ ์—…๋กœ๋“œ

let {file, fileList} = ์ •๋ณด;
if (file.size / 1024 / 1024> 10) {
๋ฐ˜ํ™˜
}
console.log (file.status)
if (file.status! = "์™„๋ฃŒ") {
fileList = []
}
this.setState ({
fileList,
}, console.log (
this.state.fileList,
this.props.form.getFieldValue ( 'upload')
))
ๅฝ“ ๆˆ‘ ๆทปๅŠ 

let {file, fileList} = ์ •๋ณด;
if (file.size / 1024 / 1024> 10) {
๋ฐ˜ํ™˜
}
console.log (file.status)
if (file.status! = "์™„๋ฃŒ") {
fileList = []
}
this.setState ({
fileList,
}, console.log (
this.state.fileList,
this.props.form.getFieldValue ( 'upload')
))
๋‚ด๊ฐ€ ์ถ”๊ฐ€ ํ•  ๋•Œ
if (file.status! = "์™„๋ฃŒ") {
fileList = []
}
onchange๋ฅผ ํ•œ ๋ฒˆ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์ œ๊ฑฐํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด ๋ฌธ์ œ๋Š” ์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆผ์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด componentWillReceiveProps ์ˆ˜๋ช…์ฃผ๊ธฐ ๋™์•ˆ setState๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

componentWillReceiveProps = (nextProps) => {
    this.setState(() => ({ 
      fileList: [...nextProps.fileList] 
    }));
  }  
// ...
<Upload FileList={this.state.fileList} ...>
//...

@ afc163 ์—…๋กœ๋“œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ์—…๋กœ๋“œ ํ•  ๋•Œ ํ•˜๋‚˜์˜ ํŒŒ์ผ ๋งŒ ์„ฑ๊ณต์ ์œผ๋กœ ์—…๋กœ๋“œ ๋  ์ˆ˜ ์žˆ์œผ๋ฉด ์–ด๋–ป๊ฒŒ๋ฉ๋‹ˆ๊นŒ? ๋กœ๊ทธ๋ฅผ ์‚ดํŽด๋ณด๊ณ  info.fileList์˜ ์ƒํƒœ๊ฐ€ ์—…๋กœ๋“œ ์ค‘์ด๊ณ  ๋ฐฑ๋ถ„์œจ๊ณผ ์‘๋‹ต์ด ๋ชจ๋‘ ์ •์˜๋˜์ง€ ์•Š์•˜์ง€๋งŒ http ์š”์ฒญ์€ 200์ž…๋‹ˆ๋‹ค. ๋„์™€์ฃผ์„ธ์š”

@PTGuan ๋‹น์—ฐํžˆ์ด ์ปดํฌ๋„ŒํŠธ๋Š” ํ•˜๋‚˜์”ฉ ์—…๋กœ๋“œ๋˜๊ณ  ๋ฐฑ์—”๋“œ API๋„ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ์ˆ˜์‹ ๋ฉ๋‹ˆ๋‹ค. ์—…๋กœ๋“œ๊ฐ€ ์„ฑ๊ณตํ•œ ํ›„ ์ฝœ๋ฐฑ์—์„œ ์—…๋กœ๋“œ๋ฅผ ์žฌ๊ท€ ์ ์œผ๋กœ ํ˜ธ์ถœํ•ด์•ผ ์ผ๊ด„ ์—…๋กœ๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์งˆ๋ฌธ์„ ๋๋‚ด๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค +1

antd 3.8 ์ด์ƒ์—์„œ๋Š” ์—ฌ์ „ํžˆ status = 'loading'๋งŒ ์žˆ๊ณ  ์™„๋ฃŒ ์ƒํƒœ๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ• ๊นŒ์š”?

ํ•ญ์ƒ ์—…๋กœ๋“œ์— ๋Œ€ํ•œ ๊ณต์‹ ์†”๋ฃจ์…˜์ด ์žˆ์ง€๋งŒ onSuccess๋Š” ์˜ฌ๋ฐ”๋ฅธ http200 ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. this.setState ({fileList : [... fileList]});์ด ๋ฌธ์žฅ์€ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉด์ด ๋ถ€๋ถ„์— ์ง‘์ค‘ํ•˜์„ธ์š”.

@EnixCoda , ์„ค๋ช…ํ•˜์‹  ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐ€๋” ์—…๋กœ๋“œํ•˜๋ฉด ํ•ญ์ƒ "์—…๋กœ๋“œ ์ค‘"์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

@withzhaoyu ์‚ฌ์‹ค, ์—ฌ๊ธฐ์—์žˆ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€์ด ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ตฌ์„ฑ ์š”์†Œ๋Š” React ์ƒํƒœ๋ฅผ ํ†ตํ•ด ์—…๋กœ๋“œ ์ง„ํ–‰ ์ƒํ™ฉ์„ ์ €์žฅํ•˜๋Š” ๋ฐ ๊ทธ๋‹ค์ง€ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•! ! ! ! ! ! ! ! ! ! ์—…๋กœ๋“œ ์ค‘

๋งŒ๋‚จ +1

handleUploaderChange = ({file, fileList}) => {
  console.log('file vo =>', file, fileList);
  if (file.status === 'done') {
    fileList = fileList.map((item, index) => {
      // ็›ธๅ…ณๆ–‡ไปถๅฏน่ฑกๆ•ฐๆฎๆ ผๅผๅŒ–ๅค„็†
      return item;
    });
  }
   // ้ฟๅ…ๅŽŸๆฅ็š„ๆ–‡ไปถไธขๅคฑ๏ผŒ่ฟ™ๆ ทๅญๅ†™ๅฐฑๅฏไปฅไบ†
  this.setState({ fileList: file.status ? [...fileList] : this.state.fileList });
};

// ไธŠไผ ่ฟ›ๅบฆๅฏไปฅ้€š่ฟ‡onProgressไธญ็š„percentๆฅๆŽงๅˆถๆ ทๅผ๏ผŒ่€Œไธๆ˜ฏfile.status
handleProgress = (event, file) => {
  let {fileList} = this.state;
  fileList = fileList.map(item => {
    if (item.uid === file.uid) {
      item.percent = event.percent;
    }
    return item;
  });
  this.setState({fileList});
};

ํŒŒ์ผ์˜ base64๋ฅผ ์ฝ๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ํ•„์š”๊ฐ€์—†๋Š” ํ•œ ์–ด๋–ป๊ฒŒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

๋ฟก ๋นต๋€จ

handleChange = ({ file, fileList }) => {
  const { dispatch, nickname } = this.props;
  const reader = new FileReader();
  reader.onload = e => {
    const base64 = e.target.result;
  };
  reader.readAsDataURL(file.originFileObj);
}
<Upload
  onChange={this.handleAvatarChange}
/>

@AngryPowman ,์ด ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ง์ ‘ ์บก์Šํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๊ธฐ๋Šฅ ์ธก๋ฉด์—์„œ ๋งŒ์กฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์•ฝํ•˜๊ฒŒ ๋ฌป์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ ์—…๋กœ๋“œ ๋œ ํŒŒ์ผ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ URL์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋„๋ก ์˜๋„์ ์œผ๋กœ ์„ค๊ณ„ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

image

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

ํŒŒ์ผ ์—…๋กœ๋“œ ์‹คํŒจ ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ฐฑ์—”๋“œ-> file.response.status์—์„œ ๋ฐ˜ํ™˜๋˜๋Š”์ง€ ๋ฌผ์–ด๋ด๋„ ๋˜๋‚˜์š”?์ด ์‹œ์ ์—์„œ ์ปดํฌ๋„ŒํŠธ๋Š” ๊ฐ€๋กœ ์ฑ„์ง€ ์•Š์•˜๊ณ  ์™„๋ฃŒํ•˜๋ฉด ํŒŒ์ผ ๋ชฉ๋ก์ด ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ์—์„œ ๋ฐ˜ํ™˜ ํ•œ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ†ตํ•ด ํŒŒ์ผ ๋ชฉ๋ก์„ ์–ด๋–ป๊ฒŒ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๊นŒ?

// ๊ตฌ๋ฉ์ด๋ฅผ ๋ฐŸ๊ณ  ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณธ ๊ฒฐ๊ณผ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•œ ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
// 1. ์ƒํƒœ ๋ณ€์ˆ˜ ์ด๋ฆ„ ์ง€์ •
// ๋‚˜์จ

/*
่ฟ™้‡Œไธบไบ†ๆ–นไพฟ ไฝฟ็”จไบ†ไธŽๅŽ็ซฏ่ฟ”ๅ›žๅŒๆ ท็š„ๅญ—ๆฎต ๅฏผ่‡ดๅ‡บไบ†้—ฎ้ข˜ ่ฟ™้‡Œๅฟ…้กป็”จfileList๏ผŒไธ็„ถๆบ็ ไธญ this.state.fileList่Žทๅ–ๆ˜ฏ็ฉบ ๅฐฑไผšๅฏผ่‡ดๅœจonSuccessไธญๅŒน้…ๅคฑ่ดฅ๏ผŒไปŽ่€Œไธไผšๅœจ่งฆๅ‘็ฌฌไบŒๆฌกonChangeไบ‹ไปถ
*/
state = {imgList:[]} 
<Upload fileList={this.state.imgList} onChange={this.onFileChange} />

// ์ƒํ’ˆ

state = {fileList:[]} 
<Upload fileList={this.state.fileList} onChange={this.onFileChange} />

// 2. onFileChange์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” obj (file ๋ฐ fileList์˜ ๋‘ ์†์„ฑ ํฌํ•จ)์ด๊ณ  this.setState ({fileList : [... fileList]})๋Š” onFileChange ํ•จ์ˆ˜์—์„œ ํ˜ธ์ถœํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

state = {fileList:[]} 
onFileChange({file,fileList}) {
  if ( ... ) {
    ...
  } else {
    ...
  }
  // always setState
  this.setState({ fileList: [...fileList] });
}
<Upload fileList={this.state.fileList} onChange={this.onFileChange} />

์šฐ์—ฐํžˆ ์˜์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@developdeez ๋‹น์‹ ์˜ ๋ฌธ์ œ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์–ด๋–ค ๋ฒ„์ „์˜ Ant Design์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?
์ด์ „์— AntD 3.0์„ ์‚ฌ์šฉํ–ˆ๊ณ  ๋ช‡ ๋‹ฌ ๋™์•ˆ์ด ์—…๋กœ๋“œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ž‘์—…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์ž˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์–ด๋–ค ๋ฌธ์ œ๋„ ๋‚จ์•„ ์žˆ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ๊ฒฐ๊ตญ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” ๋ชจ๋“  ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ• ๋งŒํผ ์ž์‹ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@swordguard , Ant 3.9.3

๋ฌธ์ œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ UI์˜ ํŒŒ์ผ ๋ชฉ๋ก์„ ์ œ์–ด ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—…๋กœ๋“œ ๋ฐ ์ด๋ฏธ์ง€ํ™”ํ•˜๊ณ  ์šด์ด์—†๋Š” ๋ฒ„ํŠผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ญ์ œํ•˜๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ƒ˜ํ”Œ ์ฝ”๋“œ๋กœ ์—ฌ๊ธฐ์—์„œ๋„ ํ‹ฐ์ผ“์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค : https://github.com/ant-design/ant-design/issues/12722#event -1913716771

๋‹น์‹ ์€ ์ด๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ?

pit +1์˜ ๊ฒฝ์šฐ this.setState({ fileList: [...fileList] }) ์‹œ๋„ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. PureComponent๊ฐ€ Component๋กœ ๋ฐ”๋€Œ๊ณ  ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. fileList๊ฐ€ props์— ๋“ค์–ด ๊ฐ€์ง€ ์•Š๋Š” ํ•œ ์ƒํƒœ๋Š” ์—…๋กœ๋“œ ๋งŒ ๋ฉˆ ์ถฅ๋‹ˆ ๋‹ค. ๋งŽ์ด ๋ฌผ์–ด๋ณด์„ธ์š”.

pit +1์˜ ๊ฒฝ์šฐ this.setState({ fileList: [...fileList] }) ์‹œ๋„ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. PureComponent๊ฐ€ Component๋กœ ๋ฐ”๋€Œ๊ณ  ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. fileList๊ฐ€ props์— ๋“ค์–ด ๊ฐ€์ง€ ์•Š๋Š” ํ•œ ์ƒํƒœ๋Š” ์—…๋กœ๋“œ ๋งŒ ๋ฉˆ ์ถฅ๋‹ˆ ๋‹ค. ๋งŽ์ด ๋ฌผ์–ด๋ณด์„ธ์š”.

์‹œ๋„ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. fileList๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ •์˜ํ•˜์‹ญ์‹œ์˜ค ~~ == ~~
// ํ•ญ์ƒ setState
this.setState ({fileList : JSON.stringify ([info.file])});

๋ฟก ๋นต๋€จ

handleChange = ({ file, fileList }) => {
  const { dispatch, nickname } = this.props;
  const reader = new FileReader();
  reader.onload = e => {
    const base64 = e.target.result;
  };
  reader.readAsDataURL(file.originFileObj);
}
<Upload
  onChange={this.handleAvatarChange}
/>

์ด ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ๊ฐ์ฒด์— originFileObj ์†์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.์ด ์†์„ฑ์€ ์—…๋กœ๋“œ ํ›„์— ๋งŒ โ€‹โ€‹ํ‘œ์‹œ๋ฉ๋‹ˆ๊นŒ?ํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์—…๋กœ๋“œํ•˜์—ฌ base64 ์ฝ˜ํ…์ธ ๋ฅผ ์ง์ ‘ ๊ฐ€์ ธ์˜ฌ ๊ณ„ํš์ด ์—†์Šต๋‹ˆ๋‹ค.

this.setState({ fileList: [...fileList] }); ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ‘œ์‹œํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ

ํ•˜์ง€๋งŒ ์š”์ฒญ์— ๋”ฐ๋ผ ํŒŒ์ผ์ด ์—…๋กœ๋“œ๋˜๋ฉด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ํŒŒ์ผ ID๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ œ์ถœ์„ ํด๋ฆญํ•˜๋ฉด ID๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผํ•˜์ง€๋งŒ ์ƒํƒœ๋Š” ํ•ญ์ƒ ์—…๋กœ๋“œ ์ค‘์ด๋ฉฐ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์‘๋‹ต์„๋ฐ›์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๋ฟก๋ฟก

์—ฌ๊ธฐ์—๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Upload ๊ตฌ์„ฑ ์š”์†Œ์—์„œ action ์†์„ฑ์˜ ์ฝœ๋ฐฑ์ด ํ˜ธ์ถœ๋˜์ง€๋งŒ UploadFile ์ธ์ˆ˜์—๋Š” ๋นˆ originFileObj ie undefined ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ๋ฐฑ์—”๋“œ์— ์—…๋กœ๋“œํ•˜์ง€ ์•Š๊ณ  Upload ๊ฐœ๋ฏธ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ ์ฝ˜ํ…์ธ ๋ฅผ ์ฝ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋‹จ์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฌ๊ธฐ์—๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Upload ๊ตฌ์„ฑ ์š”์†Œ์—์„œ action ์†์„ฑ์˜ ์ฝœ๋ฐฑ์ด ํ˜ธ์ถœ๋˜์ง€๋งŒ UploadFile ์ธ์ˆ˜์—๋Š” ๋นˆ originFileObj ie undefined ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ๋ฐฑ์—”๋“œ์— ์—…๋กœ๋“œํ•˜์ง€ ์•Š๊ณ  Upload ๊ฐœ๋ฏธ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ ์ฝ˜ํ…์ธ ๋ฅผ ์ฝ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋‹จ์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์‹ค์ œ๋กœ originFileObj๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ณ  ํŒŒ์ผ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๋‚˜๋Š” ๊ทธ๋“ค์ด originFileObj๋ฅผ ์ œ๊ฑฐํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์—…๋กœ๋“œ์— ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ•œ ํŒŒ์ผ์„ ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์—ˆ ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋‚ด file.status === "error" ํ•ด๋‹น ํŒŒ์ผ์„ UI์— ํ‘œ์‹œํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค (ํ™•์‹คํžˆ ์š”์ฒญ์— ์ž˜๋ชป๋œ ํŒŒ์ผ์„ ์ œ์ถœํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Œ). ๋‚ด ์ž์‹ ์˜ ์ œ์–ด ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์ž‘์—…ํ•˜๊ณ  fileList ํ™œ์šฉํ•˜์—ฌ์ด๋ฅผ ์ œ์–ดํ•˜๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค. "์—…๋กœ๋“œ ์ค‘"์—์„œ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ํŒŒ์ผ ์ƒํƒœ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ์ด ๋ฌธ์ œ ๋•Œ๋ฌธ์— ์ œ์–ด ๋œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋Œ์•„๊ฐ”์Šต๋‹ˆ๋‹ค. normFile ๊ฐ€ "์˜ค๋ฅ˜"๊ฐ€ ์•„๋‹Œ ํŒŒ์ผ ๋งŒ ์ถ”๊ฐ€ํ•˜๋„๋กํ•˜์—ฌ ์›ํ•˜๋Š” ์š”์ฒญ์„ ์–ป์„ ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

normFile = (e) => {
    if (Array.isArray(e)) {
      return e.filter(x => x.status !== "error");
    }
    return e && e.fileList.filter(x => x.status !== "error");
  };
const generationRequestDecorator = getFieldDecorator('generationRequest', {
      rules: [
        {
          required: true,
          message: 'Please upload your config'
        }
      ],
      valuePropName: 'fileList',
      getValueFromEvent: this.normFile,
    });
const props = {
      name: 'file',
      action: '/api/to/upload',
      multiple: true,
      onChange(info) {
        if (info.file.status !== 'uploading') {
          console.log(info.file, info.fileList);
        }
        if (info.file.status === 'done') {
          message.success(`${info.file.name} file uploaded successfully`);
        } else if (info.file.status === 'error') {
          message.error(`${info.file.name} file upload failed.`);
        }
      },
    };
const generationRequestArea = generationRequestDecorator(
      <Upload {...props}>
        <Button>
          <Icon type="upload"/> Click to Upload
        </Button>
      </Upload>
    );

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, antd ํŒ€์ด ๋‚ด ์ œ์•ˆ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์ง„์‹ฌ์œผ๋กœ ๋ฐ”๋ž๋‹ˆ๋‹ค (์ด์ „์— ์—ฌ๊ธฐ ์— ์ผ์Šต๋‹ˆ๋‹ค).

์ธ์Šคํ„ด์Šค์˜ ์ƒํƒœ๊ฐ€ ์•„๋‹Œ Upload ์ธ์Šคํ„ด์Šค์—์„œ ํŒŒ์ผ ์—…๋กœ๋“œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. BC ์ƒํƒœ๊ฐ€ ํ•ญ์ƒ ๋™ ๊ธฐ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค!

๋‚ด ๋’ค์—๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋ฐ˜ํ™˜ ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ํŽ˜์ด์ง€์— ๋ณ„๋„๋กœ ๋ Œ๋”๋ง๋˜๊ณ  Upload ์—๋Š” ํ•ญ์ƒ ์ตœ์‹  ์—…๋กœ๋“œ๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

ํ—‰ํ—‰
`handleChange = (์ •๋ณด) => {
let fileList = info.fileList;
this.setState ({fileList : fileList.slice ()});
if (info.file.status === '์™„๋ฃŒ') {
message.success (info.file.name + "์—…๋กœ๋“œ ์„ฑ๊ณต");
fileList = fileList.slice (-1);
fileList = fileList.map ((ํŒŒ์ผ) => {
if (file.response) {
file.url = file.response. # respone์„ ํ™•์ธํ•˜๊ณ  ์„œ๋ฒ„์—์„œ ์ž์‹ ์˜ URL์„ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค #;
}
๋ฐ˜ํ™˜ ํŒŒ์ผ;
});

  fileList = fileList.filter((file) => {
    if (file.response) {
      return file.response.#check your respone and choose your own respone status code back from server# === 200;
    }
    return false;
  });

  this.setState({ fileList });
} else if (info.file.status === 'error') {
  message.error(info.file.name + " upload failed");
}

}`

์ด ์‹œ๋„.

๋‚˜๋Š” ๋˜ํ•œ์ด ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ๊ณ , ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์นœ ํ›„ ๋ฌธ์ œ๊ฐ€ ๋ฐœ๊ฒฌ๋˜์—ˆ๋‹ค๊ณ  ๋Š๊ผˆ๋‹ค.

handleChange = info => {
    let fileList = info.fileList;
    fileList.filter(file => file.status === 'done');
    this.setState({fileList});
}

ํ…Œ์ŠคํŠธ ์ƒํ™ฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. handleChange์—์„œ ์ง์ ‘ this.setState({fileList}) ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

ํ•„์ž์˜ ์ด์ „ ๊ธ€์€ ์ด์™€ ๋น„์Šทํ•˜๋ฉฐ, ํ•„ํ„ฐ๋ง ํ›„ ์ฒซ ๋ฒˆ์งธ ์‹คํ–‰์œผ๋กœ ์ด์–ด์ง€๊ณ  fileList๋ฅผ ๋นˆ ๋ฐฐ์—ด๋กœ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ญ์ƒ ์—…๋กœ๋“œ ์ƒํƒœ๋Š” ํ•˜๋‚˜๋ฟ์ž…๋‹ˆ๋‹ค.
๋ฌธ์ œ๋Š” ์—…๋กœ๋“œ ํ›„ fileList๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋นˆ ๋ฐฐ์—ด๋กœ ์„ค์ •ํ•˜๋ฉด onChange ์ด๋ฒคํŠธ๊ฐ€ ๊ณ„์† ์‹คํ–‰๋˜๋Š” ๋ฐ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•„ํ„ฐ ์กฐ๊ฑด์„ ์•ฝ๊ฐ„ ์ˆ˜์ •ํ•˜๋ฉด ์‹ค์ œ๋กœ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๊ณต์‹์ ์ธ ์œ ์ง€ ๊ด€๋ฆฌ ํ•˜์—์ด ๋‘ ์†์„ฑ ์‚ฌ์ด์— ๊ตฌ์†๋ ฅ์žˆ๋Š” ๊ด€๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ ๊ณต์‹์ ์ธ ๊ฒฝ์šฐ์—๋Š” ํ•„ํ„ฐ๋ง (์ „์ฒด ์ œ์–ด ์—…๋กœ๋“œ ๋ชฉ๋ก)๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.์ด ๊ฒฝ์šฐ์—๋„ ์ด๋Ÿฐ ์ƒํ™ฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ์ด ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ๊ณ , ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์นœ ํ›„ ๋ฌธ์ œ๊ฐ€ ๋ฐœ๊ฒฌ๋˜์—ˆ๋‹ค๊ณ  ๋Š๊ผˆ๋‹ค.

handleChange = info => {
    let fileList = info.fileList;
    fileList.filter(file => file.status === 'done');
    this.setState({fileList});
}

ํ…Œ์ŠคํŠธ ์ƒํ™ฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. handleChange์—์„œ ์ง์ ‘ this.setState({fileList}) ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

ํ•„์ž์˜ ์ด์ „ ๊ธ€์€ ์ด์™€ ๋น„์Šทํ•˜๋ฉฐ, ํ•„ํ„ฐ๋ง ํ›„ ์ฒซ ๋ฒˆ์งธ ์‹คํ–‰์œผ๋กœ ์ด์–ด์ง€๊ณ  fileList๋ฅผ ๋นˆ ๋ฐฐ์—ด๋กœ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ญ์ƒ ์—…๋กœ๋“œ ์ƒํƒœ๋Š” ํ•˜๋‚˜๋ฟ์ž…๋‹ˆ๋‹ค.
๋ฌธ์ œ๋Š” ์—…๋กœ๋“œ ํ›„ fileList๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋นˆ ๋ฐฐ์—ด๋กœ ์„ค์ •ํ•˜๋ฉด onChange ์ด๋ฒคํŠธ๊ฐ€ ๊ณ„์† ์‹คํ–‰๋˜๋Š” ๋ฐ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•„ํ„ฐ ์กฐ๊ฑด์„ ์•ฝ๊ฐ„ ์ˆ˜์ •ํ•˜๋ฉด ์‹ค์ œ๋กœ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๊ณต์‹์ ์ธ ์œ ์ง€ ๊ด€๋ฆฌํ•˜์—์ด ๋‘ ์†์„ฑ๊ฐ„์— ๊ตฌ์†๋ ฅ์ด์žˆ๋Š” ๊ด€๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? @imxiongying

๋˜ํ•œ ๊ณต์‹์ ์ธ ๊ฒฝ์šฐ์—๋Š” ํ•„ํ„ฐ๋ง (์ „์ฒด ์ œ์–ด ์—…๋กœ๋“œ ๋ชฉ๋ก)๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.์ด ๊ฒฝ์šฐ์—๋„ ์ด๋Ÿฐ ์ƒํ™ฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ์–ด ๋œ ์ƒํ™ฉ์—์„œ onChange ์ฝœ๋ฐฑ์—์„œ fileList๋ฅผ ๋น„์›Œ๋‘๋ฉด Upload ๊ตฌ์„ฑ ์š”์†Œ ๋‚ด๋ถ€์˜ fileList๊ฐ€ ๋นˆ ๋ฐฐ์—ด๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ๋‚ด๋ถ€ onSuccess, onProgress ๋ฐ ๊ธฐํƒ€ ๋กœ์ง์—์„œ ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐ ํ•œ ํŒŒ์ผ์€ onChange ์ฝœ๋ฐฑ ํŠธ๋ฆฌ๊ฑฐ

@luruozhou ์œผ ์œผ์œผ์œผ ์œผ์œผ์œผ ์œผ์œผ์œผ ์œผ์œผ์œผ ์œผ์œผ์œผ ์œผ์œผ์œผ ์œผ์œผ์œผ ์œผ์œผ์œผ ์œผ์œผ์œผ ์œผ์œผ์œผ!

@yidianier handleProgress์ด ํ•จ์ˆ˜๋Š” ์–ด๋””์—์„œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๊นŒ?

@yidianier handleProgress์ด ํ•จ์ˆ˜๋Š” ์–ด๋””์—์„œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๊นŒ?

onProgress = {this.handleProgress}

์ œ์–ด ๋œ ๊ตฌ์„ฑ ์š”์†Œ์™€ ์ˆœ์ „ํžˆ ์™ธ๋ถ€์— ์ข…์† ๋œ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๊ฐ๊ฐ์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ œ์–ด ๋œ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๊ณต๋ฐฑ์„ ํด๋ฆญํ•˜์—ฌ ๋“œ๋กญ ๋‹ค์šด ์ƒ์ž๋ฅผ ์ทจ์†Œํ•˜๋Š” ๋“ฑ ant์—์„œ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ œ์–ด๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋ชจ๋‘ ์™ธ๋ถ€์—์„œ ์ œ์–ด๋˜๋Š” ๊ฒฝ์šฐ ํŠน๋ณ„ํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ œ์–ด ๋œ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๊ตฌ์„ฑ ์š”์†Œ ์„ค๊ณ„์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹Œ ๊ธฐ๋ณธ ๋…ผ๋ฆฌ์˜ ์ผ๋ถ€๋ฅผ ํฌํ•จํ•˜๋ฏ€๋กœ ๋ถˆํ‰ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. . .

@๋ชจ๋‘

๋ฟก๋ฟก

@yidianier handleProgress์ด ํ•จ์ˆ˜๋Š” ์–ด๋””์—์„œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๊นŒ?

onProgress = {this.handleProgress}

๊ฐ์‚ฌ

์ด ๋ฌธ์ œ๋Š” 3.13.1 @ afc163 ์—์„œ๋„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

@ xiaolong1024 # 14780

์ด ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. rc-form๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

handleUploaderChange = ({file, fileList}) => {
  console.log('file vo =>', file, fileList);
  if (file.status === 'done') {
    fileList = fileList.map((item, index) => {
      // ็›ธๅ…ณๆ–‡ไปถๅฏน่ฑกๆ•ฐๆฎๆ ผๅผๅŒ–ๅค„็†
      return item;
    });
  }
   // ้ฟๅ…ๅŽŸๆฅ็š„ๆ–‡ไปถไธขๅคฑ๏ผŒ่ฟ™ๆ ทๅญๅ†™ๅฐฑๅฏไปฅไบ†
  this.setState({ fileList: file.status ? [...fileList] : this.state.fileList });
};

// ไธŠไผ ่ฟ›ๅบฆๅฏไปฅ้€š่ฟ‡onProgressไธญ็š„percentๆฅๆŽงๅˆถๆ ทๅผ๏ผŒ่€Œไธๆ˜ฏfile.status
handleProgress = (event, file) => {
  let {fileList} = this.state;
  fileList = fileList.map(item => {
    if (item.uid === file.uid) {
      item.percent = event.percent;
    }
    return item;
  });
  this.setState({fileList});
};

์ด ๋Œ€๋‹ต์ด ๋‚ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค!

3.13.0 ๋ฒ„์ „์—์„œ๋Š” ํŒจํ‚ค์ง• ํ›„ onChange์—์„œ this.setState ({fileList})๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์—…๋กœ๋“œ ์š”์ฒญ์ด ์ทจ์†Œ๋˜๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๋ฉฐ ์ด๋Š” ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ์ •์ƒ์ด๋ฉฐ ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@tsuijie 3.13.5๊ฐ€ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ž‘์„ฑ์ž์—๊ฒŒ ๋ฌผ์–ด๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์—…๋กœ๋“œ ํ›„ fileOBJ ๋ฐ ๋ฐฑ์—”๋“œ์—์„œ ๋ฐ˜ํ™˜ ํ•œ fileid์—์„œ ์‘๋‹ต์„๋ฐ›์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•. ๋‚˜๋Š” ๊ฐ™์€ ์ƒํ™ฉ์— ์ฒ˜ํ•ด์žˆ๋‹ค. status === uploading

'react'์—์„œ`import React, {Component};
import {Upload, Icon} from 'antd';
'@ / utils / utils'์—์„œ {urlMapToFileList, fileListTourlMap} ๊ฐ€์ ธ ์˜ค๊ธฐ;
'@ / services / api'์—์„œ {upLoadFile} ๊ฐ€์ ธ ์˜ค๊ธฐ;

class UploadForm extends Component {
static defaultProps = {
hideCheckAll : ๊ฑฐ์ง“,
};

constructor (props) {
์Šˆํผ (์†Œํ’ˆ);
console.log (urlMapToFileList (props.value));
this.state = {
filesList : urlMapToFileList (props.value) || urlMapToFileList (props.defaultValue) || [],
// ๊ฐ’ : urlMapToFileList (props.value) || urlMapToFileList (props.defaultValue) || [],
};
}

onChange = ๊ฐ’ => {
const {onChange} = this.props;
if (onChange) {
const selfValue = fileListTourlMap (value);
onChange (selfValue.length? selfValue : null);
}
};
handleChange = (๋ฐ์ดํ„ฐ) => {
const {ํŒŒ์ผ} = ๋ฐ์ดํ„ฐ;
const {fileList} = ๋ฐ์ดํ„ฐ;
console.log ( 'handleChange', file.status);
if (file.status === '์™„๋ฃŒ') {
๋””๋ฒ„๊ฑฐ
const {response} = ํŒŒ์ผ;
if (response && response.success) {
file.url = response.result.url;
fileList.pop ();
fileList.push (ํŒŒ์ผ);
}
}
if (file.status === '์˜ค๋ฅ˜') {
fileList.pop ();
}

if(!file.status) {
  fileList = fileList.filter(ele => ele.url)
}
this.setState({filesList: fileList});
this.onChange(fileList);

}

render () {
const {filesList} = this.state;
๋ฐ˜ํ™˜ (

accept = "์ด๋ฏธ์ง€ / *"
headers = {{ 'x-Access-Token': localStorage.getItem ( 'token')}}
action = "/ api / admin / file / upload"
listType = "๊ทธ๋ฆผ ์นด๋“œ"
fileList = {filesList}
onChange = {this.handleChange}
{... this.porps}
>
{filesList.length> = 1? ์—†๋Š”:

ไธŠไผ 
}


);
}
}

๊ธฐ๋ณธ UploadForm ๋‚ด๋ณด๋‚ด๊ธฐ;
`
่ฟ™็ง ๆŽงๅˆถ ไธŠไผ  ๆ•ฐ้‡ ๏ผŒ ไฝ† ไธŠไผ  ็Šถๆ€ ไธ€็›ด ไธบ uploading ๆ˜ฏ ๅ•ฅ ๅŽŸๅ› ๏ผŸ
๋ฟก๋ฟก

๋ช‡ ๋…„ ์ „์—๋Š” ์˜ค๋ž˜๋œ ๋ฌธ์ œ ์˜€์ง€๋งŒ ์˜ค๋Š˜์€ ๊ตฌ๋ฉ์ด๋ฅผ ๋ฐŸ์•„ ๋‚ด๊ฐ€ ๋งŒ๋‚œ ๊ตฌ๋ฉ์ด์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. React.PureComponent๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ shouldComponentUpdate ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ํ†ต๊ณผํ•œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. ์–•์€ ๋น„๊ต, ํŒŒ์ผ ๋ชฉ๋ก์˜ ์ƒํƒœ ์ฐธ์กฐ ์ฃผ์†Œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์—…๋กœ๋“œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

let fileList = info.fileList;
/ * ์—ฌ๊ธฐ์—์„œ fileList ์ฐธ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค * /
fileList = JSON.parse (JSON.stringify (fileList));
this.setState ({fileList : fileList});

3.16.1 ์—…๋กœ๋“œ์— ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉฐ ๋ณ€๊ฒฝ์€ ํ•œ ๋ฒˆ๋งŒ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

this.setState ({fileList : fileList.slice ()})์ด ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

3.16.2 React Hook์„ ์‚ฌ์šฉํ•  ๋•Œ ์—…๋กœ๋“œ์˜ onChange์—์„œ fileList๋ฅผ ๋”ฅ ์นดํ”ผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. lodash _.cloneDeep (fileList)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

mobx๋ฅผ ํ†ตํ•ฉํ•˜๊ณ  Modal์—์„œ ๋‘ ๊ฐœ์˜ Upload ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํ•ด๋‹น ์ €์žฅ์†Œ์— ๋‘ ๊ฐœ์˜ fileList๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค .Upload์˜ onChange ์ด๋ฒคํŠธ ์ค‘ ํ•˜๋‚˜๋Š” ์ผ๋ฐ˜์ ์ธ ์—…๋กœ๋“œ ํ”„๋กœ์„ธ์Šค (์—…๋กœ๋“œ ๋ฐ ์™„๋ฃŒ ์ƒํƒœ ๋ชจ๋‘ ์ˆ˜์‹ )๋ฅผ ๊ฑฐ์น˜์ง€ ๋งŒ ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์‹ค๋ง ์Šค๋Ÿฌ์› ์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ ์—…๋กœ๋“œ ๋งŒ ์žˆ์—ˆ๊ณ ,์ด ๋ฐฉ๋ฒ•์œผ๋กœ ๋งŒ ํ•ด๊ฒฐํ•  ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
ไฟฎๆ”นๅ‰: this.fileList[0] = file; ไฟฎๆ”นๅŽ: this.fileList = []; this.fileList.push(file);
๊ทธ๋ฆฌ๊ณ  this.fileList๊ฐ€ ์ƒ์† ๋œ ํด๋ž˜์Šค์—์„œ ์˜ค๋Š” ๊ฒฝ์šฐ์ด ์ˆ˜์ • ๋œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

if (status === 'error') {
    message.success(`${file.name} upload failed.`);
    const fileList = this.state.fileList.filter(file => !file.error);
    this.setState({
        fileList
    }, () => {
        console.log(this.state.fileList)
    })
}

์‹คํŒจํ•˜๋ฉด ์‹คํŒจํ•œ ํ‘œ์‹œ ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•˜๊ณ  ์‹ถ์€๋ฐ ์™œ ์ด๋ ‡๊ฒŒ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š๋‚˜์š”?

console.log๊ฐ€ ์˜ฌ ๋ฐ”๋ฅด๊ณ  ์ƒํƒœ๊ฐ€ ๋น„์–ด ์žˆ์ง€๋งŒ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‹คํŒจํ•œ ์—…๋กœ๋“œ ์‚ฌ์ง„๋„ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

https://github.com/ant-design/ant-design/issues/2423#issuecomment -491143417

this.setState({
    fileList:[...fileList]
}

์ œํ•œ๋œ URL์— ID ํ•„๋“œ ๋ฐ ํ† ํฐ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ์ด๋ฅผ ์ „์†กํ•˜๋Š” ์ž‘์—…์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ž‘์—…์€ ์ฃผ์†Œ ๋งŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?

ํ—ค๋”์— ๋ฐฐ์น˜ ๊ฐ€๋Šฅ

์ด ํŠธ๋ฆญ์œผ๋กœ ๋‚ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
Screen Shot 1398-03-25 at 6 29 26

๋‚˜๋Š” ๋™์  ์ž…๋ ฅ ์ƒ์„ฑ ์‹œ์Šคํ…œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ์œผ๋ฏ€๋กœ ์ƒˆ๋กœ์šด ๋™์  ์†Œํ’ˆ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋“ค์–ด์˜ค๋Š” ์†Œํ’ˆ์— ๋Œ€ํ•ด antd์—๊ฒŒ ์•Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ๊ทธ๊ฒƒ์€ ๋‚˜์— ๊ณ ์ • React.Component ๋Œ€์‹  React.PureComponent .

modal.info ๋ฐ control filelist๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ onChange๋Š” ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Modal์„ ์ œ๊ฑฐํ•˜๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

ํ•  ์ˆ˜์žˆ๋‹ค

1 : React.Component ์‚ฌ์šฉ
2 : getDerivedStateFromProps์— fileList๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๋Š”์ง€, ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
3 : fileList : this.state.fileList
4 : onChange : ({file, fileList}) => {
this.setState ({fileList});
}

3.19.7์—๋Š” ์—ฌ์ „ํžˆ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ์กฐ๋ฅผ ์œ„ํ•ด ์„ฑ๊ณต์ ์ธ ์‚ฌ๋ก€๋ฅผ ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์ „์—์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ํŽธ๋ฆฌํ•œ ๊ฒ€์ƒ‰์„ ์žŠ์–ด ๋ฒ„๋ฆฌ๊ธฐ ์‰ฝ๊ฒŒ ์—ฌ๊ธฐ์—์„œ ๊ณ„์‚ฐํ•˜์‹ญ์‹œ์˜ค.

env :

  • ๊ฐœ๋ฏธ : 4.0.0-rc.1
  • ํ”„๋กœ ๋ ˆ์ด์•„์›ƒ : 5.0.0
  • ๋ฐ˜์‘ : 16.9.17
import React, { useState } from 'react';
import { Modal, Upload, Button, message } from 'antd';
import { UploadOutlined } from '@ant-design/icons/lib';
import { UploadProps } from 'antd/lib/upload';
import { deleteArtifact } from '@/services/artifact';

interface UploadModalType {
  visible: boolean
  onCancel: () => void
  projectId: number
}

const UploadModal: React.FC<UploadModalType> = props => {
  const { visible, onCancel, projectId } = props;
  const [fileList, setFileList] = useState();

  const uploadProps: UploadProps = {
    name: 'file',
    fileList,
    listType: 'text',
    action: 'http://localhost:8080/v1/artifacts',
    data: { project_id: projectId, type: 'application/json' },
    onChange(info) {

      setFileList(info.fileList.slice()); // Note: A new object must be used here!!!

      if (info.file.status === 'done') {
        message.success(`${info.file.name} file uploaded successfully`);
      } else if (info.file.status === 'error') {
        message.error(`${info.file.name} file upload failed.`);
      }
    },
    onRemove(file) {
      const promise: PromiseLike<void | boolean> = deleteArtifact({ filename: file.response });
      promise.then((value: any) => {
        if (value === '' || value instanceof Response && value.status === 205) {
          const index = fileList.indexOf(file);
          const newFileList = fileList.slice();
          newFileList.splice(index, 1);
          setFileList(newFileList);
        }
      });
    },
  };

  return (
    <Modal
      destroyOnClose
      title='ไธŠไผ ๅฝ’ๆกฃๆ–‡ไปถ'
      visible={visible}
      onCancel={onCancel}
    >
      <Upload
        {...uploadProps}
      >
        <Button>
          <UploadOutlined/> Click to Upload
        </Button>
      </Upload>
    </Modal>
  );
};

export default UploadModal;

ํ•, ์—…๋กœ๋“œ ์ƒํƒœ๋ฅผ fileList๋กœ ์„ค์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๊ณ  ์˜ค๋žซ๋™์•ˆ ๋˜์ ธ์ง€๊ณ  ๋ง๋ฌธ์ด ์—†์Šต๋‹ˆ๋‹ค.

์ฐธ์กฐ๋ฅผ ์œ„ํ•ด ์„ฑ๊ณต์ ์ธ ์‚ฌ๋ก€๋ฅผ ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์ „์—์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ํŽธ๋ฆฌํ•œ ๊ฒ€์ƒ‰์„ ์žŠ์–ด ๋ฒ„๋ฆฌ๊ธฐ ์‰ฝ๊ฒŒ ์—ฌ๊ธฐ์—์„œ ๊ณ„์‚ฐํ•˜์‹ญ์‹œ์˜ค.

env :

  • ๊ฐœ๋ฏธ : 4.0.0-rc.1
  • ํ”„๋กœ ๋ ˆ์ด์•„์›ƒ : 5.0.0
  • ๋ฐ˜์‘ : 16.9.17
import React, { useState } from 'react';
import { Modal, Upload, Button, message } from 'antd';
import { UploadOutlined } from '@ant-design/icons/lib';
import { UploadProps } from 'antd/lib/upload';
import { deleteArtifact } from '@/services/artifact';

interface UploadModalType {
  visible: boolean
  onCancel: () => void
  projectId: number
}

const UploadModal: React.FC<UploadModalType> = props => {
  const { visible, onCancel, projectId } = props;
  const [fileList, setFileList] = useState();

  const uploadProps: UploadProps = {
    name: 'file',
    fileList,
    listType: 'text',
    action: 'http://localhost:8080/v1/artifacts',
    data: { project_id: projectId, type: 'application/json' },
    onChange(info) {

      setFileList(info.fileList.slice()); // Note: A new object must be used here!!!

      if (info.file.status === 'done') {
        message.success(`${info.file.name} file uploaded successfully`);
      } else if (info.file.status === 'error') {
        message.error(`${info.file.name} file upload failed.`);
      }
    },
    onRemove(file) {
      const promise: PromiseLike<void | boolean> = deleteArtifact({ filename: file.response });
      promise.then((value: any) => {
        if (value === '' || value instanceof Response && value.status === 205) {
          const index = fileList.indexOf(file);
          const newFileList = fileList.slice();
          newFileList.splice(index, 1);
          setFileList(newFileList);
        }
      });
    },
  };

  return (
    <Modal
      destroyOnClose
      title='ไธŠไผ ๅฝ’ๆกฃๆ–‡ไปถ'
      visible={visible}
      onCancel={onCancel}
    >
      <Upload
        {...uploadProps}
      >
        <Button>
          <UploadOutlined/> Click to Upload
        </Button>
      </Upload>
    </Modal>
  );
};

export default UploadModal;

Func ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Info.status์—๋Š” ํ•ญ์ƒ ์—…๋กœ๋“œ ์ƒํƒœ๊ฐ€ ์žˆ๊ณ  onChange ํ˜ธ์ถœ์€ ํ•œ ๋ฒˆ๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.

@tsuijie 3.13.5๊ฐ€ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

3.13.5 ์ €๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”๋ฐ onChange์—์„œ this.setState ({fileList}) ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ์—…๋กœ๋“œ ์š”์ฒญ์ด ์ทจ์†Œ๋ฉ๋‹ˆ๋‹ค.

์•ก์…˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์—…๋กœ๋“œ ํ›„ ํ•ญ์ƒ ์—…๋กœ๋“œ ์ƒํƒœ๊ฐ€๋˜๋ฏ€๋กœ ๊ฐ ํŒŒ์ผ์˜ ์ƒํƒœ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์™„๋ฃŒ๋กœ ์„ค์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์•ก์…˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์—…๋กœ๋“œ ํ›„ ํ•ญ์ƒ ์—…๋กœ๋“œ ์ƒํƒœ๊ฐ€๋˜๋ฏ€๋กœ ๊ฐ ํŒŒ์ผ์˜ ์ƒํƒœ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์™„๋ฃŒ๋กœ ์„ค์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

fileList๊ฐ€ ์ƒํƒœ, [... fileList]๋ฅผ ๋‹ค์‹œ ์“ธ ๋•Œ ์ƒˆ ๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉ๋˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

์ข‹์•„ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

---์‹ค๋ฌผ---
From : "Amumu"< [email protected]>
๋‚ ์งœ : 2020 ๋…„ 7 ์›” 26 ์ผ ์ผ์š”์ผ ์˜คํ›„ 17:59
๋ฐ›๋Š” ์‚ฌ๋žŒ : "ant-design / ant-design"< [email protected]>;
์ฐธ์กฐ : "Comment"< [email protected]>; "SCLGIS"< [email protected]>;
์ œ๋ชฉ : Re : [ant-design / ant-design] ์—…๋กœ๋“œ file.status๊ฐ€ ํ•ญ์ƒ ์—…๋กœ๋“œ ์ค‘์ž„ (# 2423)

์•ก์…˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์—…๋กœ๋“œ ํ›„ ํ•ญ์ƒ ์—…๋กœ๋“œ ์ƒํƒœ๊ฐ€๋˜๋ฏ€๋กœ ๊ฐ ํŒŒ์ผ์˜ ์ƒํƒœ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์™„๋ฃŒ๋กœ ์„ค์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

fileList๊ฐ€ ์ƒํƒœ, [... fileList]๋ฅผ ๋‹ค์‹œ ์“ธ ๋•Œ ์ƒˆ ๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉ๋˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

โ€”
๋Œ“๊ธ€์„ ๋‹ฌ์•˜ ๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์‹  ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ๊ตฌ๋…์„ ์ทจ์†Œํ•˜์„ธ์š”.

"multiples"์˜ต์…˜์ด ํ™œ์„ฑํ™” ๋œ ์ƒํƒœ์—์„œ ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
3 ๊ฐœ์˜ ํŒŒ์ผ์„ ์„ ํƒํ•˜๋ฉด ๋ชฉ๋ก์— 2 ๊ฐœ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. 5 ๊ฐœ์˜ ํŒŒ์ผ์„ ์„ ํƒํ•˜๋ฉด 3 ๊ฐœ, ๊ฐ€๋” 4 ๊ฐœ๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. "fileList"์†Œํ’ˆ์„ ์ œ๊ฑฐํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ณ  ๋ชฉ๋ก์—์žˆ๋Š” ๋ชจ๋“  ํŒŒ์ผ์„ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ œ์–ด ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. "fileList"์†Œํ’ˆ.
ํ›„ํฌ useState ๋Œ€์‹  ํด๋ž˜์Šค ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ๋™์ž‘์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

4.5.1์—์„œ๋„์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์œผ๋ฉฐ ํ•ญ์ƒ ์—…๋กœ๋“œ ์ƒํƒœ์˜€์Šต๋‹ˆ๋‹ค.์ด์ „์˜ ๊ฑฐ๋ฌผ๋“ค์ด ์–ธ๊ธ‰ ํ•œ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์“ธ๋ชจ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณธ ๊ฒฐ๊ณผ ๋ Œ๋”๋ง ํ•  ๋•Œ๋งˆ๋‹ค ์—…๋กœ๋“œ ๊ตฌ์„ฑ ์š”์†Œ์˜ ํ‚ค ๊ฐ’์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์‹œ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. -rendering. ์†Œ์Šค ์ฝ”๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด์ „ ์—…๋กœ๋“œ ์š”์ฒญ์„ ์ทจ์†Œํ•˜์—ฌ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค. uploding ์ƒํƒœ์ด๋ฉฐ ํ‚ค ๊ฐ’์ด ๊ณ ์ •๋˜์–ด ์„ฑ๊ณต์ ์œผ๋กœ ์—…๋กœ๋“œ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@tsuijie 3.13.5๊ฐ€ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

3.13.5 ์ €๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”๋ฐ onChange์—์„œ this.setState ({fileList}) ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ์—…๋กœ๋“œ ์š”์ฒญ์ด ์ทจ์†Œ๋ฉ๋‹ˆ๋‹ค.

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