Dropbox APIを使用して画像を取り込むことを希望する反応コンポーネントがあります。 API部分は正常に機能しますが、コンポーネントはデータが通過する前にレンダリングされるため、配列は空です。必要なデータが得られるまでコンポーネントのレンダリングを遅らせるにはどうすればよいですか?
var fileList = [];
var images = [];
var imageSource = [];
class Foo extends React.Component {
render(){
dbx.filesListFolder({path: ''})
.then(function(response) {
fileList=response.entries;
for(var i=0; i<fileList.length; i++){
imageSource.Push(fileList[0].path_lower);
}
console.log(imageSource);
})
for(var a=0; a<imageSource.length; a++){
images.Push(<img key={a} className='images'/>);
}
return (
<div className="folioWrapper">
{images}
</div>
);
}
}
ご協力いただきありがとうございます!
変更点:
1。 renderメソッド内でAPI呼び出しを行わないで、そのためにcomponentDidMount
ライフサイクルメソッドを使用します。
componentDidMount()は、コンポーネントがマウントされた直後に呼び出されます。 DOMノードを必要とする初期化はここに行く必要があります。リモートエンドポイントからデータをロードする必要がある場合、これはネットワーク要求をインスタンス化するのに適した場所です。このメソッドで状態を設定すると、再レンダリングがトリガーされます。
2。状態配列のimageSource
変数を初期値_[]
_で定義し、応答更新を取得したらsetStateを使用して、更新されたデータでコンポーネントを自動的に再レンダリングします。
。状態配列を使用して、renderメソッドでUIコンポーネントを生成します。
4。データを取得しなくなるまでレンダリングを保持するには、render
メソッド内に条件を設定し、長さがゼロの場合はimageSource
配列の長さを確認し、その後_return null
_にします。
次のように書きます:
_class Foo extends React.Component {
constructor(){
super();
this.state = {
imageSource: []
}
}
componentDidMount(){
dbx.filesListFolder({path: ''})
.then((response) => {
let fileList = response.entries;
this.setState({
imageSource: fileList
});
})
}
render(){
if(!this.state.imageSource.length)
return null;
let images = this.state.imageSource.map((el, i) => (
<img key={i} className='images' src={el.path_lower} />
))
return (
<div className="folioWrapper">
{images}
</div>
);
}
}
_
データの更新時にコンポーネントが再レンダリングされるように、コンポーネントの状態または小道具を使用する必要があります。 Dropboxの呼び出しはrender
メソッドの外部で行う必要があります。そうしないと、コンポーネントが再レンダリングされるたびにAPIにアクセスすることになります。できることの例を次に示します。
class Foo extends React.Component {
constructor(props) {
super(props);
this.state = {
imageSource: []
}
}
componentDidMount() {
dbx.filesListFolder({ path: '' }).then(function(response) {
const fileList = response.entries;
this.setState({
imageSource: fileList.map(file => file.path_lower);
})
});
}
render() {
return (
<div className="folioWrapper">
{this.state.imageSource.map((image, i) => <img key={i} className="images" src={image} />)}
</div>
);
}
}
画像がまだない場合、空のdiv
をこのようにレンダリングします。
まず、 コンポーネントの状態 を使用し、グローバルに定義された変数を使用しないでください。
したがって、画像の空の配列でコンポーネントを表示しないようにするには、コンポーネントに条件付きの「ロード」クラスを適用し、配列が空でなくなったら削除する必要があります。