如何获取存储在会话存储(next.js)中的值?

dxxyhpgq  于 2023-02-15  发布在  其他
关注(0)|答案(1)|浏览(166)

我有一个slider组件,用户可以在其中设置ImageGallery组件中的列数。
这是我的滑块组件

export default function Slider({ value, handleChange }: ISlider) {
  return (
    <input
      className={styles.slider}
      min={1}
      max={3}
      step={1}
      type="range"
      value={value}
      onInput={handleChange}
      onChange={handleChange}
    />
  );
}

const handleChange = (event: any) => {
  setValue(event.target.value);
};

我正在尝试将slider中的值存储在会话存储中,以便保存用户首选项,并使用useState函数进行设置。

export default function ImageGallery({
  projects,
}: {
  projects: any;
}): JSX.Element {
  const [value, setValue] = useState(null);

  const handleChange = (event: any) => {
    setValue(event.target.value);
  };

  useEffect(() => {
    if (typeof window !== "undefined") {
      window.sessionStorage.setItem("value", JSON.stringify(value));
    }
  }, [value]);

  useEffect(() => {
    const storedValue: string | null = window.sessionStorage.getItem("value");
    const valueData = storedValue ? JSON.parse(storedValue) : 1;
    setValue(valueData);
  }, []);

  const breakpointColumnsObj = {
    default: 4,
    1100: 3,
    700: 2,
    500: value
  };

  return (
    <>
      <Masonry
        breakpointCols={breakpointColumnsObj}
        className={styles.myMasonryGrid}
        columnClassName={styles.myMasonryGridColumn}
      >
        {projects.map((item: any) => {
          const images = item.images.data.attributes.formats.large;
          return (
            <ImageCard
              key={item.slug}
              src={images.url}
              alt={item.images.data.attributes.caption}
              width={images.width}
              height={images.height}
              slug={item.slug}
              id={item.slug}
            />
          );
        })}
      </Masonry>
      <Slider value={value} handleChange={handleChange} />
    </>
  );
}

然后在我的主页(静态页面)中呈现ImageGallery组件。
存储数据工作正常。我面临的问题是,每当我回到主页,它设置为空值,无论什么是存储在会话存储(它覆盖会话存储)。有人能帮我解决这个问题吗?

vshtjzan

vshtjzan1#

感谢Next.js discord社区的某个人,我有了一个解决方案。更改handleChange函数并删除first useEffect(如下所示)解决了这个问题。

export default function ImageGallery({
  projects,
}: {
  projects: any;
}): JSX.Element {
  const [value, setValue] = useState(1);

      const handleChange = (event: any) => {
  window.sessionStorage.setItem("value", JSON.stringify(event.target.value));
  setValue(event.target.value);
};  

  useEffect(() => {
    const storedValue: string | null = window.sessionStorage.getItem("value");
    const valueData = storedValue ? JSON.parse(storedValue) : 1;
    setValue(valueData);
  }, []);

  const breakpointColumnsObj = {
    default: 4,
    1100: 3,
    700: 2,
    500: value
  };

  return (
    <>
      <Masonry
        breakpointCols={breakpointColumnsObj}
        className={styles.myMasonryGrid}
        columnClassName={styles.myMasonryGridColumn}
      >
        {projects.map((item: any) => {
          const images = item.images.data.attributes.formats.large;
          return (
            <ImageCard
              key={item.slug}
              src={images.url}
              alt={item.images.data.attributes.caption}
              width={images.width}
              height={images.height}
              slug={item.slug}
              id={item.slug}
            />
          );
        })}
      </Masonry>
      <Slider value={value} handleChange={handleChange} />
    </>
  );
}

相关问题