javascript - 在.map呈现的元素中仅切换1个元素

标签 javascript reactjs react-native

你好,当点击按钮打开一个下拉菜单时出现了一些问题,它将打开所有渲染的图像,但是我只想在该元素上打开

这是要素

     <div key={item.name} style={this.state.bierenToggle ? {display:'flex'} : {display:'none'}} className={'bieren-lijst'}>


这是功能:

  handleBierenLijst(){
      console.log('hello')
    this.setState({bierenToggle : !this.state.bierenToggle},()=>console.log(this.state))
  }


这是完整的渲染功能:

 handleBierenLijst(){
      console.log('hello')
    this.setState({bierenToggle : !this.state.bierenToggle},()=>console.log(this.state))
  }


  renderResults(data) {
    let days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
    let now = new Date();
    let self = this

    let temp = data.filter((item => {
      return parseFloat(item.distance, 10) <= parseFloat(self.props.filterData, 10);
    }));
    let output = temp.map((item) => {
      let closingSign = item.open.indexOf(days[now.getDay()]) !== -1 ? {opacity:'1'} : {opacity: '0'};
      return (
        <li key={item.name}>
          <div className={'head-title'}>
            <h1>{item.name}</h1>
            <h2>{`${item.distance}km`} </h2>
          </div>
          <div className={'address'}>
            <p>{item.address}</p>
            <p>{item.zipcode}</p>
            <p>{item.city}</p>
          </div>
          <div className={'bottom-container'}>
            <div style={closingSign} className={'open-closed'}>gesloten</div>
            <div className={'bieren'} onClick={()=>this.handleBierenLijst()}>bieren</div>
          </div>
          <div key={item.name} style={this.state.bierenToggle ? {display:'flex'} : {display:'none'}} className={'bieren-lijst'}>
            <div>jupiter</div>
            <div>heiniken</div>
            <div>amstel</div>
            <div>grolsch</div>
          </div>
        </li>
      )
    })
    return output
  }


这是完整文件:

import React from 'react';
import './results.css';

class Results extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      resultList: [],
      bierenToggle: false
    }
  }


  handleBierenLijst(){
      console.log('hello')
    this.setState({bierenToggle : !this.state.bierenToggle},()=>console.log(this.state))
  }


  renderResults(data) {
    let days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
    let now = new Date();
    let self = this

    let temp = data.filter((item => {
      return parseFloat(item.distance, 10) <= parseFloat(self.props.filterData, 10);
    }));

    let output = temp.map((item) => {
      let closingSign = item.open.indexOf(days[now.getDay()]) !== -1 ? {opacity:'1'} : {opacity: '0'};
      return (
        <li key={item.name}>
          <div className={'head-title'}>
            <h1>{item.name}</h1>
            <h2>{`${item.distance}km`} </h2>
          </div>
          <div className={'address'}>
            <p>{item.address}</p>
            <p>{item.zipcode}</p>
            <p>{item.city}</p>
          </div>
          <div className={'bottom-container'}>
            <div style={closingSign} className={'open-closed'}>gesloten</div>
            <div className={'bieren'} onClick={()=>this.handleBierenLijst()}>bieren</div>
          </div>
          <div key={item.name} style={this.state.bierenToggle ? {display:'flex'} : {display:'none'}} className={'bieren-lijst'}>
            <div>jupiter</div>
            <div>heiniken</div>
            <div>amstel</div>
            <div>grolsch</div>
          </div>
        </li>
      )
    })
    return output
  }


  render() {
    console.log("pppprrrrooooopppsss", this.props.filterData)
    let content = this.renderResults(this.props.resultData)
    console.log(this.state)
    return (
      <div>
        <div className={'results'}>
          <ul>
            {content}
          </ul>
        </div>
      </div>
    )
  }
}

export default Results;

最佳答案

好的,让我首先解释问题,当应用程序加载时,您现在的处理方式就是您的状态

 {
   resultList: [],
   bierenToggle: false
 }


像@ChrisG这样的问题是您的状态只有一个布尔值,不能容纳多个项目的状态。解决问题的一种方法是不保留布尔值,而是维护项目位置列表。在这种情况下,您的代码将变成

constructor(props) {
super(props)
this.state = {
    resultList: [],
    bierenToggleList: [],
  }
}

...

handleBierenLijst(itemIndex){
  console.log('hello');
  let currentList = this.state.bierenToggleList;
  let listPosition = currentListt.indexOf(itemIndex);
  if (listPosition === -1) {
     // item is not toggled
     currentList.push(index);
  } else {
     // item is already toggled, remove it
     currentList = currentList.splice(listPosition, 1);
  }
  this.setState({
    bierenToggleList: [...currentList], // make sure to use ...
  })
  ()=>console.log(this.state));
}

...

renderResults(data) {
let days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
let now = new Date();
let self = this

let temp = data.filter((item => {
  return parseFloat(item.distance, 10) <= parseFloat(self.props.filterData, 10);
}));

let output = temp.map((item, itemIndex) => {
  let isToggled = this.state.bierenToggleList.indexOf(itemIndex) !== -1;
  let closingSign = item.open.indexOf(days[now.getDay()]) !== -1 ? {opacity:'1'} : {opacity: '0'};
  return (
    <li key={item.name}>
      <div className={'head-title'}>
        <h1>{item.name}</h1>
        <h2>{`${item.distance}km`} </h2>
      </div>
      <div className={'address'}>
        <p>{item.address}</p>
        <p>{item.zipcode}</p>
        <p>{item.city}</p>
      </div>
      <div className={'bottom-container'}>
        <div style={closingSign} className={'open-closed'}>gesloten</div>
        <div className={'bieren'} onClick={()=>this.handleBierenLijst(itemIndex)}>bieren</div>
      </div>
      <div key={item.name} style={isToggled ? {display:'flex'} : {display:'none'}} className={'bieren-lijst'}>
        <div>jupiter</div>
        <div>heiniken</div>
        <div>amstel</div>
        <div>grolsch</div>
      </div>
    </li>
  )
})
return output


}

我目前无法测试此代码,但是它应该或多或少地起作用,如果您有任何问题或疑问,我将很乐意为您提供帮助。

关于javascript - 在.map呈现的元素中仅切换1个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58278182/

相关文章:

javascript 数组列表

ios - 使用 React Native 在 iOS 上下载文件

android - React Native 0.59.x 构建在 CircleCI 上失败,退出值为 137

javascript - expo AsyncStorage 方法不是函数

reactjs - 带有 fetch api 的 React hook

css - React 图标与文本不对齐

android - React-Native 无法构建 DependencyGraph : Watchman error

javascript - 带有更改高度的 div 的 IE7 错误

javascript中unicode字符的转义问题

javascript - android 的 mathjax 中的多行文本