๋ฒ์ 1.6.5์์ Upload ์ปจํธ๋กค์ onChange ๋ฉ์๋๋ ํ ๋ฒ๋ง ์คํ๋๋ฉฐ info.file.status๋ ํญ์ ์
๋ก๋ ์ค์ด๋ฉฐ http ์์ฒญ์ ์ ์์ด๋ฉฐ 200์ด ๋ฐํ๋ฉ๋๋ค.
1.6.4๋ก ๋ค์ด ๊ทธ๋ ์ด๋ ํ ์ ์์ ์ธ ์ฌ์ฉ, ์
๋ก๋ ํ info.file.status ์๋ฃ
์๋
์ค์ ํ ์คํธ๋ ๋ฌธ์ ๊ฐ ์๋๋ฐ ๋ฌธ์ ์ ์์ ํ ์ฝ๋๋ฅผ ์ ๊ณตํ์ฌ ์ฝ๊ฒ ์ฌํ ํ ์ ์๋๊ฐ?
์ฃผ์ ๋ณ๊ฒฝ :
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
.
๋ฐ๋ผ์์ด ๊ตฌ์ฑ ์์์ ํ์ฌ ์ ์ด ๋ชจ๋๋ ์ ๋ขฐํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ๋ฅํ ํด๊ฒฐ์ฑ :
onSuccess
์ค์ ์ฒ๋ฆฌ ๋
ผ๋ฆฌ ๋ฐ ๊ธฐํ ์ด๋ฒคํธ๋ componentDidUpdate
์ํ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์ ์ ๊ณตํ์ง ์๋๋ก ์๋์ ์ผ๋ก ์ค๊ณ ๋์์ต๋๊น?
์ฌ๋ฐ ๋ค์. ์ด์ ํ์ผ ๋ชฉ๋ก์ ์ํ๋ ์ฌ์ ํ ์ ๋ก๋ ์ค์ด๋ฉฐ ์ ์ด๋๋ ๊ฒฝ์ฐ์๋ ์ํ๋ฅผ ์ ๋ก๋ ์ค์ผ๋ก ์ค์ ํฉ๋๋ค.๋ฌธ์ ๊ฐ ์ ํ ํด๊ฒฐ๋์ง ์์์ต๋๋ค.
ํ์ผ ์ ๋ก๋ ์คํจ ํ๋๊ทธ๊ฐ ๋ฐฑ์๋-> 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
ieundefined
์์ต๋๋ค. ํ์ผ์ ๋ฐฑ์๋์ ์ ๋ก๋ํ์ง ์๊ณ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 https://github.com/ant-design/ant-design/pull/14780
@ 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;
๋ฐํ (
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 ํ๋ ๋ฐ ํ ํฐ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ๊ณผ์ด๋ฅผ ์ ์กํ๋ ์์ ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น? ์์ ์ ์ฃผ์ ๋ง ์ ๊ณตํฉ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ ํ ์ ์์ต๋๊น?
ํค๋์ ๋ฐฐ์น ๊ฐ๋ฅ
์ด ํธ๋ฆญ์ผ๋ก ๋ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค.
๋๋ ๋์ ์ ๋ ฅ ์์ฑ ์์คํ ์ ๊ฐ์ง๊ณ ์์์ผ๋ฏ๋ก ์๋ก์ด ๋์ ์ํ์ ์ฌ์ฉํ๋ฉด ๋ค์ด์ค๋ ์ํ์ ๋ํด 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}) ์์ ์ ์ํํ๋ฉด ์ ๋ก๋ ์์ฒญ์ด ์ทจ์๋ฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ ์ด ๋ชจ๋์ ๊ฒฝ์ฐ, ๋น์ ์ ํญ์ setState๋ฅผํด์ผ
fileList
์์onChange
๋ชจ๋ ๊ตญ๊ฐ๊ฐ ์ ๋ก๋์ ๋๊ธฐํ๋์ด ์๋์ง ํ์ธํฉ๋๋ค. ์ฌ๊ธฐ์์๋ ๋ฌธ๊ตฌ์ ์ ์ฌ : http://ant.design/components/upload/#components -upload-demo-fileList์ ์ด ๋ ๊ตฌ์ฑ ์์์ ๊ฐ๋ ์ ์ฐ๊ตฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค. https://facebook.github.io/react/docs/forms.html#controlled -components
Upload๊ฐ ์ด๋ ์ด์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์ง ํ ์ ์๋๋ก
fileList
๋ฅผ ๋ณต์ ํด์ผํฉ๋๋ค.