gpt4 book ai didi

javascript - 来自 api 的 react 图像标题错误可能与正确的索引有关

转载 作者:行者123 更新时间:2023-12-04 10:12:30 27 4
gpt4 key购买 nike

继:How to make my react-multi-carousel use a light-box feature for my ReactJS app

我的应用程序将 react-images 用于灯箱,将 react-carousel-images 用于轮播。我的 api 有一个标题和图像。我遇到的问题是页脚标题中的标题始终作为所选图像出现,并且在灯箱轮播中没有改变。我认为这与所选图像的索引有关?到目前为止,我的代码是:

问题示例:
https://codesandbox.io/s/react-multi-corousal-issue-72s9o?file=/src/Slider.js

slider .js

import React, { Component } from "react";
// import "../slider/slider.css";
import "./slider.css";
import Carousel from "react-multi-carousel";
import "react-multi-carousel/lib/styles.css";
import LightBox, { Modal, ModalGateway } from "react-images";

const responsive = {
superLargeDesktop: {
breakpoint: { max: 4000, min: 3000 },
items: 1
},
desktop: {
breakpoint: { max: 3000, min: 1024 },
items: 1
},
tablet: {
breakpoint: { max: 1024, min: 464 },
items: 1
},
mobile: {
breakpoint: { max: 464, min: 0 },
items: 1
}
};

class Slider extends Component {
_isMounted = false;

state = {
awsApiData: [],
loading: false,
//selectedIndex: 0,
selectedImage: {},
lightboxIsOpen: false
};

componentDidMount() {
this._isMounted = true;
console.log("app mounted");
this.setState({ loading: true });
/*global fetch */
fetch("https://onelbip0e6.execute-api.eu-west-2.amazonaws.com/livestage/imgApi")
.then(data => data.json())
.then(data =>
// this.setState({ awsApiData: data[0], loading: false }, () =>
this.setState(
{
// awsApiData: data.map(item => ({source: item.download_url })),
awsApiData: data.map(item => ({
...item,
source: item.image
})),
loading: false
},
() => console.log(data)
)
);
}
componentWillUnmount() {
this._isMounted = false;
}

toggleLightbox = (post, selectedIndex) => {
// this.setState(state => ({
// lightboxIsOpen: !state.lightboxIsOpen,
// selectedIndex
// }));
this.setState(state => ({
lightboxIsOpen: !state.lightboxIsOpen,
selectedImage: { title: post.title, index: selectedIndex }
}));
};

render() {
return (
<div>
{this.state.loading ? (
<div className="text-center">Loading...</div>
) : (
<div>
<Carousel
additionalTransfrom={0}
showDots={false}
arrows={true}
autoPlaySpeed={3000}
autoPlay={true}
centerMode={false}
className="slider"
containerClass="container-with-dots"
dotListClass="dots"
draggable
focusOnSelect={false}
infinite
itemClass="carousel-top"
keyBoardControl
minimumTouchDrag={80}
renderButtonGroupOutside={false}
renderDotsOutside
responsive={responsive}
>
{Object.values(this.state.awsApiData).map((post, indx) => {
return (
<div
className="mt-5"
key={indx}
//onClick={() => this.toggleLightbox(indx)}
onClick={() => this.toggleLightbox(post, indx)}

>
<img
className="media-img card-img-top card-img-hero"
src={post.source}
alt="Alt text"
style={{ cursor: "pointer" }}
/>
</div>
);
})}
</Carousel>
<ModalGateway>
{this.state.lightboxIsOpen ? (
<Modal onClose={this.toggleLightbox}>
<LightBox
components={{
FooterCaption: () => <div>{this.state.selectedImage.title}</div>
}}
//currentIndex={this.state.selectedIndex}
currentIndex={this.state.selectedImage.index}
// formatters={{ getAltText }}
frameProps={{ autoSize: "height" }}
views={this.state.awsApiData}
/>
</Modal>
) : null}
</ModalGateway>
</div>
)}
</div>
);
}
}

export default Slider;

最佳答案

您的标题设置为 this.state.selectedImage.title但是当您的灯箱 View 更改时,您永远不会更新状态(即调用 setState() )。

您需要添加 onViewChange LightBox 的处理程序零件:

<LightBox onViewChange={handleLightBoxViewChange} .../>

该处理程序也将接收 View 更改的项目的索引。在 handleLightBoxViewChange调用 setState更新 selectedImage :
handleLightBoxViewChange = (newIndex) => {
this.setState(state => ({
selectedImage: state.awsApiData[newIndex]
}));
};

如果您不想更新状态,您的页脚组件会接收当前 View ,因此您可以像这样更新它:
<LightBox
components={{
FooterCaption: ({currentView}) => <div>{currentView.title}</div>
}}
//...
/>

关于javascript - 来自 api 的 react 图像标题错误可能与正确的索引有关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61262624/

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