变量不改变 onClick

Variable not changing onClick

我在这里阅读了很多不同类型的解决方案,但 none 似乎正是我所需要的。

我正在尝试在用户单击图像时更改变量“currentIndex”。

现在更改到达 onClick 函数内部,但不会更改外部变量。不确定我做错了什么。

我的最终目标是让用户能够单击缩略图并更改主图像。如果有更好的方法,我愿意接受。

const gallery = 
  product.images.length > 1 ? (
    <Grid gap={2} columns={4}>
      {product.images.map((img, index) => (
        <Thumbnail 
          image={img}
          key={img.id}
          alt={product.title}
          index={index}
          onClick={() => changeImage(index)}
        />
      ))}
    </Grid>
  ) : null;

let currentIndex = 0;

let changeImage = function(index) {
  currentIndex = index;

  console.log("currentindex inside changeImage Function is: " + currentIndex) // This returns the current index of the image clicked as it should.

  return currentIndex;
}

console.log("currentindex outside changeImage Function is: " + currentIndex)// This returns "0" still

以下代码用于主图。

<div>
  {console.log('currentindex inside return is: ' + currentIndex)}//This returns 0 as well still

  <GatsbyImage
    image={product.images[currentIndex].gatsbyImageData}
    alt={product.title}
  />          
  <div>
    {gallery}
  </div>
</div>

不确定是否需要此代码,但下面是“缩略图”元素的代码

/** @jsx jsx */
import { jsx } from 'theme-ui'
import { GatsbyImage } from 'gatsby-plugin-image'

export const Thumbnail = ({ image, onClick, alt, index }) => {

  return (
    <button
      sx={{
        cursor: "pointer",
        border: "none",
        padding: "2px",
        backgroundColor: "white",
      }}
      onClick={onClick}
    >
      <GatsbyImage
        image={image.gatsbyImageData}
        alt={alt}
      />
    </button>
  )
}

现在您正在尝试将 currentIndex 更新为 let currentIndex = 0;。在 React 中,你会想要 使用 state 来跟踪 currentIndex 以便你的其他组件(例如主图像)可以根据 currentIndex.

而不是 let currentIndex = 0;,像这样用 useState 初始化 currentIndex

const [currentIndex, setCurrentIndex] = useState(0);

确保同时导入 useStateimport {useState} from 'react';

然后您可以更改 changeImage 函数来设置 currentIndex 的状态,如下所示:

let changeImage = function(index) {
  setCurrentIndex(index);
}

为什么要这样做?因为你需要触发一个rerender才能在任何地方使用新更新的currentIndex。作为组件一部分的代码仅 运行 一次 ,除非在该组件或父组件中发生 state 更新,这就是为什么 console.logs 并且 Image 没有更新。