render 메서드 내에서 promise를 사용하여 React 구성 요소 렌더링
항목 모음을 소품으로 가져오고 map
부모 구성 요소의 자식으로 렌더링되는 구성 요소 모음에 해당하는 구성 요소가 있습니다. 우리는 WebSQL
바이트 배열로 저장된 이미지를 사용 합니다. map
함수 내에서 항목에서 이미지 ID를 가져오고 DAL
이미지에 대한 바이트 배열을 가져 오기 위해에 대한 비동기 호출을 수행합니다 . 내 문제는 내가 약속을 React로 전파 할 수 없다는 것입니다. 왜냐하면 그것이 렌더링에서 약속을 처리하도록 설계되지 않았기 때문입니다. 나는 C#
배경에서 왔기 때문에 await
분기 코드를 다시 동기화 하는 키워드 와 같은 것을 찾고 있다고 생각 합니다.
map
이 같은 기능 외모 뭔가 (간체) :
var items = this.props.items.map(function (item) {
var imageSrc = Utils.getImageUrlById(item.get('ImageId')); // <-- this contains an async call
return (
<MenuItem text={item.get('ItemTitle')}
imageUrl={imageSrc} />
);
});
및 getImageUrlById
방법은 다음과 같습니다 :
getImageUrlById(imageId) {
return ImageStore.getImageById(imageId).then(function (imageObject) { //<-- getImageById returns a promise
var completeUrl = getLocalImageUrl(imageObject.StandardConImage);
return completeUrl;
});
}
이것은 작동하지 않지만이 작동을 위해 무엇을 수정해야하는지 모르겠습니다. 체인에 다른 promise를 추가하려고했지만 렌더링 함수가 합법적 인 JSX 대신 promise를 반환하기 때문에 오류가 발생합니다. React
데이터를 가져 오기 위해 수명주기 방법 중 하나를 활용해야한다고 생각 했지만 props
이미 거기에 있어야하므로 어디에서 할 수 있는지 알 수 없습니다.
render()
메서드는 this.props 및 this.state에서 UI를 렌더링해야하므로 데이터로드를 비 동기화하려면 매핑 this.state
을 저장 하는 데 사용할 수 있습니다 imageId:imageUrl
.
그런 다음 componentDidMount()
메서드에서 imageId에서 imageUrl을 채울 수 있습니다. 그런 다음 render()
메서드는 this.state
객체 를 렌더링하여 순수하고 단순해야 합니다.
다음은 간단한 샘플 코드
입니다. this.state.imageUrls
는 비동기 적으로 채워 지므로 렌더링 된 이미지 목록 항목은 URL을 가져온 후 하나씩 나타납니다. this.state.imageUrls
모든 이미지 ID 또는 색인 (URL 제외)으로를 초기화 할 수도 있습니다 . 이렇게하면 해당 이미지가로드 될 때 로더를 표시 할 수 있습니다.
constructor(props) {
super(props)
this.state = {
imageUrls: []
};
}
componentDidMount() {
var self = this;
this.props.items.map((item) => {
ImageStore.getImageById(item.imageId).then(image => {
var mapping = {id: item.imageId, url: image.url};
var newUrls = self.state.imageUrls.slice();
newUrls.push(mapping);
self.setState({
imageUrls: newUrls
});
})
});
}
render() {
return (<div>
this.state.imageUrls.forEach(mapping => {
<div>id: {mapping.id}, url: {mapping.url}`</div>
})
</div>
);
}
또는 react-promise를 사용할 수 있습니다.
패키지 설치 :
npm i react-promise
그리고 코드는 다음과 같이 보일 것입니다.
import Async from 'react-promise'
var items = this.props.items.map(function (item) {
var imageSrc = Utils.getImageUrlById(item.get('ImageId')); // <-- this contains an async call
return (
<Async promise={imageSrc} then={(val) => <MenuItem text={item.get('ItemTitle')} imageUrl={val}/>} />
);
});
전체 문서 : 반응 약속
'developer tip' 카테고리의 다른 글
OpenLayers 3으로 마커를 추가하는 방법 (0) | 2020.11.28 |
---|---|
xml 속성 singleLine이 Android에서 더 이상 사용되지 않습니까? (0) | 2020.11.28 |
유형이 익명인지 테스트하는 방법? (0) | 2020.11.28 |
원격 저장소에서 분기의 새 사본을 얻는 방법은 무엇입니까? (0) | 2020.11.28 |
int 배열 선언 (0) | 2020.11.28 |