【问题标题】:Looping an array to list items循环数组以列出项目
【发布时间】:2018-10-20 09:24:24
【问题描述】:

在我的前端 Reactjs 应用程序中,我同时上传多张图片并将网址保存在一个数组中。当尝试循环包含要在网站上显示的 url 的数组时,它将每个图像显示在一个单独的框中(这很好)。但是,当我单击单个图像时,它会根据控制台日志呈现数组中的所有图像 url。

当我单击单个图像时,它会显示在控制台日志中:

http://192.168.22.124:3000/source/5102018114022AM-pexels-photo.jpg http://192.168.22.124:3000/source/5102018114022AM-redhat.jpg

handleClick() {
    this.setState({ isToggleOn: !this.state.isToggleOn})
}

render() {
const { name, fileExt, pic } = this.state;
var img = [];
for (var i = 0; i < pic.length; i++) {
  console.log(pic[i]);
    img.push(<a style={{width: 200, height: 250}} key={i} className={'tc ' + change + ' dib br3 ma2 pa2 grow bw2 shadow-5'} onClick={this.handleClick}>
      <div key={i}>
      <img style={{width: 175, height: 175}} className='tc br3' alt='robots' key={i} src={`${pic[i]}`}/>
      </div>
      </a>)
};

  return (
    isToggleOn && fileExt !== 'mp4' ?
    <div>
    { img }
    </div>

【问题讨论】:

  • 可以显示handleClick函数吗?

标签: javascript arrays reactjs


【解决方案1】:

现在你在你的渲染函数的循环中console.loging。因此,每当重新渲染内容时,它都会循环并多次访问 console.log。因为您的handleClick 方法正在调用setState,所以组件将被重新渲染,它再次调用render() 函数,然后在循环中调用console.log

听起来你想要的只是 console.log 你点击的项目。如果是这种情况,那么您可以将 console.log 放在 handleClick 方法中,然后将参数传递给:

onClick={() => this.handleClick(p)}

还有一个更好的方法是使用.map,如下所示:

handleClick(url) {
  console.log(url);
  this.setState({ isToggleOn: !this.state.isToggleOn});
}

render() {
  const { name, pic } = this.state;
  return (
    <div>
      {pic.map((p, i) => (
        <a style={{width: 200, height: 250}} key={p} className={'tc ' + change + ' dib br3 ma2 pa2 grow bw2 shadow-5'} onClick={() => this.handleClick(p)}>
          <div>
            <img style={{width: 175, height: 175}} className='tc br3' alt='robots' src={p}/>
            <h2 style={{position: "absolute", top: 185, bottom: 0, right: 0, left: 0}} className='f6 measure-narrow lh-copy'>{name[i]}</h2>
          </div>
        </a>
      ))}
    </div>
  );
}

另请注意:您只需要在循环内的外部元素上使用key=

【讨论】:

  • 现在控制台日志也显示:Proxy {dispatchConfig: {…}, _targetInst: FiberNode, isDefaultPrevented: ƒ, isPropagationStopped: ƒ, _dispatchListeners: ƒ, …}
  • @TedKhi 检查以确保 onClick 使用箭头函数传递参数:onClick={() =&gt; this.handleClick(p)}
  • 我正在使用箭头功能,但仍然收到代理消息。我已经更新了我的问题。 this.handleClick() 已经在做某事了。所以我必须调用一个单独的函数来记录 url 并且它可以工作.. onClick={() => { this.handleClick(); this.urlLog(p);}}
  • 我还有一个问题。如果我有另一个名为“name”的数组,其中包含每个文件的名称。如何在 pic map 循环中循环它,以便显示每个文件的名称。 ....

    {name} h2>……

  • list = [ { url: 'www.1.com', name: 'alex' }, { url: 'www.2.com', name: 'tim' } ]; 然后你会做类似list.map((item) =&gt; console.log(item.url, item.name));
猜你喜欢
  • 1970-01-01
  • 2014-05-10
  • 2017-10-28
  • 1970-01-01
  • 2013-10-24
  • 2021-06-28
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
相关资源
最近更新 更多