gpt4 book ai didi

javascript - React 组件在状态更改后不会重新呈现

转载 作者:行者123 更新时间:2023-12-05 04:01:20 25 4
gpt4 key购买 nike

我从父容器接收 Prop ,我在子组件中使用轮播来显示图像。我的代码如下所示:

import React, { Component } from "react";
import ReactDOM from "react-dom";
import style from './ReactSlick.less';
import Carousel from 'nuka-carousel';

export default class ReactSlick extends Component {

constructor(props) {
super(props);
this.state = {
slides:this.props.pictureArray,
};
}}

renderImages() {
return this.state.slides.map(slide => {
return (
<div key={slide._id}><img src = {slide.image} /></div>
);
}, this);
}

return (
<div className = {style.container}>
<Carousel autoplay={true}>
{this.renderImages()}
</Carousel>
</div>
);
}}

我基本上已经尝试了所有我能想到的,包括在 componentDidMount 中初始化的东西。使用条件渲染来检查数组的长度,并且仅在存在任何内容时才显示。图片数组是一个数组,其中包含我想在轮播中显示的带有 id 的图像。我是这样从父容器中获取它的:

getImage= (key)=> {
let {getImage} = this.props;
let codeArray = [];
for (let i = 0; i < getImage._id.length; i++) {
api(getImage._id[i])
.then(res => codeArray.push(res)),
(error => console.log(error));}

return (
<Bubble
key={key}
side="left"
onImageClick={this.handleLogoClick}>
<ReactSlick pictureArray={codeArray} />
</Bubble>
);
}

当数据到达子组件时,数据已经存在,我也通过在构造函数中注销来仔细检查它。我尝试将 API 放入 componentDidMount 并在子组件中设置状态,但这也没有用。

我已经测试了从本地 API 获取的相同数据,这些数据似乎适用于 JSON,但当我从远程服务器获取它时,它不起作用。它显示来自服务器的数据的唯一一次是当我更改代码并且它主动重新加载然后数据在那里可见但不是第一次时。

我认为该组件不会重新渲染或发生其他事情。有没有办法对子组件进行强制刷新以使其工作?我读过的答案说当调用 setState 时它会自动触发重新渲染,但在我的情况下似乎没有任何效果。

最佳答案

问题在于您对 asynchronous 进行迭代的方式代码。由于您正尝试通过异步 api 调用 在循环内填充 codeArray,因此您不能使用 for loop否则getImage不会等待您的 api 调用解决,因此在 codeArray 时立即返回还是空的。所以使用其他类型的迭代器,例如 .map可以与 async code 一起使用.

这可能对您有所帮助,请查看:Using async/await with a forEach loop

/* So this doesn't work */
for (let i = 0; i < getImage._id.length; i++) {
api(getImage._id[i]).then(res => codeArray.push(res)), (error => console.log(error));
}



/* Need to find a way to wait for all `api(getImage._id[i]).then` calls
to finish first, only then should `getImage()` return.
And also take not I am placing `codeArray` in the parent's state */


async getImage () {
let codeArray = []; // just set the scope using let

await Promise.all(this.props.images.map(async (image) => {
codeArray = await api(getImage._id[i]);
}));

this.setState({ codeArray })
}

我建议调用getImage在组件中挂载:

async componentDidMount() {
await this.getImage();
}

终于在你的render方法: <ReactSlick pictureArray={this.state.codeArray} />

/* also set your component state codeArray as an empty array to be safe */

P.S: 我假设 images已经从 parent 的 Prop 中设置(但它也可以处于状态)。如果images将有 10 个项目,并且 api()调用需要 1 秒才能完成,因此 getImage()大约需要 10 seconds然后调用 setState 或更新您的组件(以及子组件 ReactSlick )

希望对你有帮助

关于javascript - React 组件在状态更改后不会重新呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55544985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com