【问题标题】:React: Check Array if string matches and set stateReact:如果字符串匹配并设置状态,则检查数组
【发布时间】:2022-01-12 18:35:47
【问题描述】:

我有以下数组:

[
    "/test/static/media/its9-odc_d.9d5de720.png",
    "/test/static/media/its9-odc_m.178c1879.png",
    "/test/static/media/its9-odc_w.5e70ca59.png",
    "/test/static/media/its9-odc_y.8cf41473.png"
]

当我点击一个按钮时,_d_m_w_y 被保存为 React 状态 (timeperiods)。

我需要一个函数,它将与我的timeperiods 匹配的字符串保存在另一个 React 状态 (imageSource),以便我可以渲染图像。

这是我迄今为止尝试过的,但我总是返回 'yay',当我尝试 setImageSource 时,我收到无限循环错误。

  const imageForTimeperiod = () => {
    images.forEach((img) => {
      if (timeperiod && img.split('.')[0].includes(timeperiod)) {
        console.log('yay');
        // setImage(img);
      }
    })
  };

{Object.entries(Timeperiods.timeperiods).map((entries) => {
    return (
        <Button onClick={() => setTimeperiod(entries[1].file)}>
            {entries[0]}
        </Button>
    );
})}

最后:

我点击按钮1 Day,它将时间段设置为_d,并显示图像/test/static/media/its9-odc_d.9d5de720.png

【问题讨论】:

  • setImage 是否更新或影响imagestimeperiod
  • 您希望在单击按钮时更改图像吗?
  • SILENT:执行此操作时出现无限循环错误。 @HassanImam 是的,这就是我想要实现的目标。

标签: arrays reactjs string


【解决方案1】:

您可以在单击按钮上传递timeperiod 的名称,然后根据名称设置图像和timePeriod 状态。

const { useState } = React;

const App = () => {
  const [image, setImage] = useState(null);
  const [timePeriod, setTimePeriod] = useState(null);
  
  const images = [
    "/test/static/media/its9-odc_d.9d5de720.png",
    "/test/static/media/its9-odc_m.178c1879.png",
    "/test/static/media/its9-odc_w.5e70ca59.png",
    "/test/static/media/its9-odc_y.8cf41473.png"
  ];
  
  const timePeriods = ['_d', '_m', '_w', '_y'];

  const handleClick = (v) => {
    const foundImage = images.find(name => name.includes(v));
    setImage(foundImage || null);
    setTimePeriod(v);
  }


  return <div>
  {timePeriod}
  <br />
  {image && <img src={image} />}
  <br />
  {timePeriods.map((v, i) => {
    return (
       <button onClick={() => handleClick(v)}>
          {v}
       </button>
    )
  })}
  </div>
}

ReactDOM.render(
  <App />,
  document.getElementById("root")
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.1/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.1/umd/react-dom.production.min.js"></script>
<div id="root"></div>

【讨论】:

  • 我不确定我是否正确,但您的解决方案是基于图像数组的固定顺序吗?我的图像被其他名称替换,因此只有最后 2 个字符始终相同。这就是为什么我必须将图像字符串与所选按钮匹配。
  • 查看更新解决方案,它使用时间段的名称,然后在image数组中搜索。
猜你喜欢
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 2017-04-15
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 2018-08-25
相关资源
最近更新 更多