私は、アイテムのコレクションを小道具とし、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;
});
}
これは動作しませんが、私は何を知りません私はこの作業をするために変更する必要があります。別の約束をチェーンに追加しようとしましたが、レンダリング関数が正当なJSXの代わりに約束を返すため、エラーが発生します。私はReact
ライフサイクルメソッドの1つを利用してデータを取得する必要があるかもしれないと思っていましたが、すでにそこにあるためにprops
が必要なので、私はこれをどこで行うことができないのか分かりません。
いいえ、要点。あなたは例を見せてもらえますか? –
ありがとうございました!それがトリックでした。私がここで変更する唯一のことは、少なくとも "空"のレンダリングを持たないために、 'componentDidMount'ではなく' componentWillMount'でこれを行うことです。 'componentWillMount'は初期レンダリングの前に実行されます。 –
@Wintこの行にはエラーがあります:返される値は配列の浅いコピーではなく、新しい配列の長さであるため、 'var newUrls = self.state.imageUrls.slice()。push(mapping)'です。 [Array.prototype.push()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push#Syntax) – jherax