【问题标题】:Passing index between sibilings React.js在兄弟姐妹 React.js 之间传递索引
【发布时间】:2018-09-02 11:39:47
【问题描述】:

我试图将索引从一个元素传递到同级元素以在第二个元素中显示这一点。连续第二天在互联网上找不到解决方案。

到目前为止,我所做的只是在每个 div 中显示数据。我只想在点击的时候这样做。

class Result extends Component {
    constructor(props) {
      super(props)

      this.state = {
         showData: false
      }
    }

    showData = (el, index) => {
        this.setState({
            showData: !this.state.showData
        })
        console.log(el, index)
    }

    render() {
        const { dataFromSearchBar, inputValue } = this.props 
        const showData = this.state.showData
        let apiData = dataFromSearchBar.filter(el => {
            return el.launch_year === inputValue
        }).map((el, index) => {
            return (
                <div className={css(styles.result__data)}
                     key={index}>
                    <h2 onClick={() => this.showData(el, index)}>{el.mission_name}</h2>
                    {showData && 
                        <li key={index}>{el.launch_date_utc}</li>
                    }
                </div>
            )
        })
      return (
        <div className="result">
            {apiData}
        </div>
      )
    }
}

这是部署在 gh 页面上的应用:https://kamilstaszewski.github.io/spacex-api-app/

您可以在此处找到该应用的代码:https://github.com/KamilStaszewski/spacex-api-app/tree/master/src

提前致谢。

【问题讨论】:

  • 你在使用 redux 吗?还是上下文 API?
  • 我开始编程,它只是反应,我应该先学习redux吗?或者也许没有安装/学习新库的解决方案?
  • 是的,你可以在不使用 redux 的情况下做任何事情
  • 请注意,&lt;li&gt; 不是&lt;div&gt; 的有效 html 子代
  • @charlietfl 你是对的

标签: javascript reactjs


【解决方案1】:

您需要保持Result 组件的当前单击标题索引的状态。喜欢

this.state = {
  currentClickedResultIndex: []
}

那么更改处理程序应该是:

showData = index => e => {
  this.setState(({ currentClickedResultIndex }) => {
    if (currentClickedResultIndex.includes(index)) {
      return {
        currentClickedResultIndex: currentClickedResultIndex.filter(
          number => number !== index
        )
      };
    } else {
      return {
        currentClickedResultIndex: [...currentClickedResultIndex, index]
      };
    }
  });
};

Result 渲染的html里面修改为:

<h2 onClick={this.showData(index)}>{el.mission_name}</h2>;
{
  this.state.currentClickedResultIndex.includes(index) && (
    <li>{el.launch_date_utc}</li>
  );
}

【讨论】:

  • 成功了,谢谢。结果与我想要的有点不同。也许我以前没有写过。我想切换信息。现在我只能显示,不能回到以前的状态。该怎么做?
  • showData 仍然需要某种方式哈哈,尽管它只能通过 currentClickedResultIndex 来完成
  • @sagi 我将使用你的命名,虽然 currentClickedResultIndex .. :)
  • 不错的解决方案顺便说一句,甚至没有考虑显示多个 div 数据
  • 哦,你又做了一个改变,好的,现在一切正常,谢谢你摇滚兄弟
【解决方案2】:

如果我理解正确,并且您只想显示点击的 div 数据,那么我建议在状态中添加另一个属性,例如 displayIndex

  this.state = {
     displayIndex:-1
  }

showData = (el, index) => {
    this.setState(prevState) => ({
        displayIndex: index===prevState.displayIndex? -1 : index
    })
    console.log(el, index)
}

然后:

                {(index===this.state.displayIndex) && 
                    <li key={index}>{el.launch_date_utc}</li>
                }

编辑:如果您希望任何时候只显示一个 div,请使用此解决方案,如果您想要多个,则应使用 arup 方法

【讨论】:

  • 我认为 showData 不再需要在状态内部,因为它是 OP 尝试实现的一些不起作用的东西。只有 displayIndex 可以完成这项工作。还有displayIndex 不应该是0
  • 您可能是对的 :) 但我会保持原样,因为它与您的答案相同。此外,实际上,displayIndex 是否为 0 并不重要,因为 showData 是错误的
猜你喜欢
  • 2017-04-23
  • 2020-02-05
  • 1970-01-01
  • 2017-11-19
  • 2019-05-06
  • 2020-01-31
  • 2021-11-19
  • 2023-03-03
  • 1970-01-01
相关资源
最近更新 更多