【问题标题】:Javascript: Modifying only clicked image in React JS map functionJavascript:在 React JS 地图功能中修改仅点击的图像
【发布时间】:2018-03-08 17:50:50
【问题描述】:

我有一个使用 React JS 构建的网页。该网页在render 内的map 函数中显示图像列表。当我单击图像时,正如我的代码所预期的那样,map 函数中的每个图像周围都会出现一个边框。但是,我只想为已单击的图像显示一个边框。知道如何修改我的代码来做到这一点吗?谢谢。

import React from 'react';
import { Container, Button} from 'reactstrap';
import './scrapeInstagram.css';

const CSSVariables = {
  border : {
      border : '2px solid green'
  },
  noBorder : {
      border : '2px solid transparent'
  },
};

export default class ScrapeInstagram extends React.Component { 
    constructor(props) {
        super(props);
        this.state = {
            showBorder : false
        };
        this.searchTerms = props.location.params["searchTerms"];
        this.searchResults = props.location.params["searchResults"].filePaths;
        this.imageClick = this.imageClick.bind(this);
    }

    imageClick(image_src) {
        this.setState(state => ({ showBorder: !state.showBorder }))
    }


    render() {
        return (
            <Container>
            <center>
            <h1> IMAGES!!! </h1>
            <div className="box">
            {this.searchResults.map((photo) => {
                return <div className="dataSetBox" key={photo.toString()}><img id={this.state.ID} src={photo} onClick={() => { this.imageClick(photo.toString()) }} style={this.state.showBorder ? CSSVariables.border : CSSVariables.noBorder} alt="Image" height="350" width="450" margin="100px" /></div>;
            })}
            </div>
            </center>
            </Container>  
        );
  }
}

【问题讨论】:

  • 您不需要在状态中存储任何内容,只需执行onClick((event) =&gt; {event.target.style = CSSVariables.border})
  • @EgorEgorov 感谢您的回复 - 不幸的是,我无法让它工作。我没有收到任何错误,但没有显示边框

标签: javascript reactjs onclick


【解决方案1】:

你可以使用一个CSS类来一样

class Images extends React.Component{
    state = {
        selected: []
    }

    selectImage(id){
        var selected = this.state.selected;
        if(selected.indexOf(id) !== -1) selected.push(id);
        this.setState({selected: selected});
    }

    render(){
        return (
           <div className="images">
               <ul>
                   {images.map(img => {
                       return <li><img id={img.id} src={img.src} onClick={this.selectImage.bind(this, img.id)} className={(this.state.selected.indexOf(img.id) !== -1)?"selected":"not-selected"} alt="Image" height="350" width="450" margin="100px" /></li>
                   })}
               </ul>
           </div>
        )
    }
}

在你的 CSS 中

.selected{
    border: 2px solid green;
}

.not-selected{
    border: 2px solid transparent;
}

希望对您有所帮助,如果有任何困惑,请告诉我。

【讨论】:

    【解决方案2】:

    您的状态只为所有图像存储一个布尔值。当这个布尔值为真时,所有图像都有边框是正常的。 您应该存储例如最后点击照片的“src”而不是布尔值。然后,对于每个 img,您可以执行以下操作:

    <img
        src={photo}
        onClick={() => { this.imageClick(photo) }}
        style={this.state.lastClicked === photo ? CSSVariables.border : CSSVariables.noBorder}
        alt="Image"
        height="350" width="450" margin="100px" />
    

    【讨论】:

    • 你的回答很有道理!您知道如何打开/关闭多个图像的边框吗?我尝试创建一个数组,如果选中则将图像 ID 添加到数组中,如果重新选择则删除。然后对于样式,它会在返回边框之前检查图像 ID 是否在数组中。但是,由于渲染是在开始时发生的,因此单击图像对边框没有影响
    • 您可以在组件的状态中存储一组 ID。 imageClick(接收点击的图像的 id)可以产生类似:setState((prevState) =&gt; { if(selectedIDs.includes(id)) { return { selectedIDs: prevState.selectedIDs.filter((i) =&gt; i !== id) } } else { return { selectedIDs: [ ...prevState.selectedIDs, id ] } } })。不要忘记每次调用 setState 都会触发重新渲染,因此 UI 将更新以反映更改。
    猜你喜欢
    • 2019-01-31
    • 2013-09-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2020-10-06
    • 2021-02-03
    相关资源
    最近更新 更多