在同一页面上动态呈现两个图像轮播
Render dynamically two image carousels on the same page
更新
我有一组包含数据的对象,其中一个键是图库,它是一组 URL:data=[{id:1,gallery:[]},{id:2, galery:[]}]
。
我在映射的“数据”数组中做了一个图像轮播。问题是每个项目的轮播不是彼此独立的。每次我更改其中一张上的图片时,另一张也会更改。
这是代码:
export class MyComponent extends Component {
state = {
current: 0,
currentItem: '',
}
render() {
const selecItem = (e) => {
this.setState({
currentItem: e.target.parentElement.parentElement.parentElement.id
})
}
const resetSelectedItem = ()=>{
this.setState({
currentItem: ''
})
}
const nextSlide = (e ,arr) => {
if (this.state.currentItem !==
e.target.parentElement
.parentElement.parentElement.id ) {
e.preventDefault()
} else if (arr &&
this.state.currentItem === e.target.parentElement
.parentElement.parentElement.id ) {
let copy = this.state.current
this.setState({
current: (copy === arr.length - 1 ? 0 : copy + 1),
})
}
}
const prevSlide = (e, arr) => {
if (this.state.currentItem !== e.target.parentElement
.parentElement.parentElement.id ) {
e.preventDefault()
} else if (arr &&
this.state.currentItem === e.target.parentElement
.parentElement.parentElement.id ) {
let copy = this.state.current
this.setState({
current: (copy === 0 ? arr.length - 1 : copy - 1),
})
}
}
return (
<section>
{data &&
data.map((item, i) =>
<>
<div key={i} id={i.toString().concat(item.id)}>
<div>
...some data here
</div>
<div>
<div>
...more data
</div>
<div className='carousel' onMouseEnter={(e)=>selecItem(e)}
onMouseLeave={resetSelectedItem}>
<img src={left}
className='left-arrow' alt="left"
onClick={(e) =>this.state.currentItem
=== i.toString().concat(data[i].id)
? prevSlide(e, data[i].gallery) : undefined} />
<img src={right}
className='right-arrow' alt="right"
onClick={(e) => this.state.currentItem
=== i.toString().concat(data[i].id)
? nextSlide(e, data[i].gallery) : undefined} />
{data[i].gallery?.map((img, j) => (
<>
{j === this.state.current && (
<img src={img} alt={item.id} className='cart-image' key={j} />
)}
</>
))}
</div>
</div>
</div>
</>)}
</section>)}}
export default MyComponent
我想为数据数组中的每个项目设置不同的轮播。目前它像一个大的一样工作,而不是两个。
对我来说,所有其他数据都按照我想要的方式呈现很奇怪。
我也试过这个:
{this.state.currentItem === i.toString().concat(data[i].id)?
data[i].gallery?.map((img, j) => (
<>
{j === this.state.current && (
<img src={img} alt={item.id} className='cart-image' key={j} />
)}
</>
))}
在这种情况下,它显示并处于活动状态,只有 data
中的一项的轮播。但我希望两个轮播一次都可见并处于活动状态
你能帮帮我吗?
提前谢谢你
您只需检查图库中项目的索引作为显示图像的条件。例如,如果所选的画廊项目为 0,则将显示每个画廊的每个第一个项目。您还需要将活动项目索引与活动画廊项目索引一起保存在状态中(正如您已经做的那样),并将其添加到条件中以显示图像。
我做了一个新组件,我把图像轮播的所有逻辑都移到了这个组件里面。
现在一切正常。
现在的代码看起来像这样:
export class MyComponent extends Component {
render() {
return(
<section>
{data &&
data.map(item=>
<NewComponent
id={item.id}
gallery={item.gallery} />
)}
</section>
)
}
}
更新
我有一组包含数据的对象,其中一个键是图库,它是一组 URL:data=[{id:1,gallery:[]},{id:2, galery:[]}]
。
我在映射的“数据”数组中做了一个图像轮播。问题是每个项目的轮播不是彼此独立的。每次我更改其中一张上的图片时,另一张也会更改。
这是代码:
export class MyComponent extends Component {
state = {
current: 0,
currentItem: '',
}
render() {
const selecItem = (e) => {
this.setState({
currentItem: e.target.parentElement.parentElement.parentElement.id
})
}
const resetSelectedItem = ()=>{
this.setState({
currentItem: ''
})
}
const nextSlide = (e ,arr) => {
if (this.state.currentItem !==
e.target.parentElement
.parentElement.parentElement.id ) {
e.preventDefault()
} else if (arr &&
this.state.currentItem === e.target.parentElement
.parentElement.parentElement.id ) {
let copy = this.state.current
this.setState({
current: (copy === arr.length - 1 ? 0 : copy + 1),
})
}
}
const prevSlide = (e, arr) => {
if (this.state.currentItem !== e.target.parentElement
.parentElement.parentElement.id ) {
e.preventDefault()
} else if (arr &&
this.state.currentItem === e.target.parentElement
.parentElement.parentElement.id ) {
let copy = this.state.current
this.setState({
current: (copy === 0 ? arr.length - 1 : copy - 1),
})
}
}
return (
<section>
{data &&
data.map((item, i) =>
<>
<div key={i} id={i.toString().concat(item.id)}>
<div>
...some data here
</div>
<div>
<div>
...more data
</div>
<div className='carousel' onMouseEnter={(e)=>selecItem(e)}
onMouseLeave={resetSelectedItem}>
<img src={left}
className='left-arrow' alt="left"
onClick={(e) =>this.state.currentItem
=== i.toString().concat(data[i].id)
? prevSlide(e, data[i].gallery) : undefined} />
<img src={right}
className='right-arrow' alt="right"
onClick={(e) => this.state.currentItem
=== i.toString().concat(data[i].id)
? nextSlide(e, data[i].gallery) : undefined} />
{data[i].gallery?.map((img, j) => (
<>
{j === this.state.current && (
<img src={img} alt={item.id} className='cart-image' key={j} />
)}
</>
))}
</div>
</div>
</div>
</>)}
</section>)}}
export default MyComponent
我想为数据数组中的每个项目设置不同的轮播。目前它像一个大的一样工作,而不是两个。
对我来说,所有其他数据都按照我想要的方式呈现很奇怪。
我也试过这个:
{this.state.currentItem === i.toString().concat(data[i].id)?
data[i].gallery?.map((img, j) => (
<>
{j === this.state.current && (
<img src={img} alt={item.id} className='cart-image' key={j} />
)}
</>
))}
在这种情况下,它显示并处于活动状态,只有 data
中的一项的轮播。但我希望两个轮播一次都可见并处于活动状态
你能帮帮我吗?
提前谢谢你
您只需检查图库中项目的索引作为显示图像的条件。例如,如果所选的画廊项目为 0,则将显示每个画廊的每个第一个项目。您还需要将活动项目索引与活动画廊项目索引一起保存在状态中(正如您已经做的那样),并将其添加到条件中以显示图像。
我做了一个新组件,我把图像轮播的所有逻辑都移到了这个组件里面。
现在一切正常。
现在的代码看起来像这样:
export class MyComponent extends Component {
render() {
return(
<section>
{data &&
data.map(item=>
<NewComponent
id={item.id}
gallery={item.gallery} />
)}
</section>
)
}
}