首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >React中的Helpers.js

React中的Helpers.js
EN

Stack Overflow用户
提问于 2021-07-21 12:17:59
回答 1查看 38关注 0票数 1

我导出了将在helpers.js文件上重用的函数,但在导入时会重用这些函数。我的useStates不再定义。

使用helpers.js的ProductPage这是我的useState,当我导入所有这些函数时,它是未定义的

代码语言:javascript
复制
import React, { useState } from "react"

import { Link } from "gatsby"

import FavoriteIcon from "@material-ui/icons/Favorite"
import { makeStyles } from "@material-ui/core/styles"

import { addFavorite, removeFavorite, isProductInFavorites, getAllFavoriteProducts } from "../../helpers"

const ProductList = ({ products }) => {
  const classes = useStyles()

  const [favorites, setFavorites] = useState(getAllFavoriteProducts())

  return (
    <>
      <div className={classes.root}>
        {products?.map((product) => {
          return (
            <div className="ProductCard" key={product._id}>
              <div>
                <Link to="/shop" state={{ shop: product.shop }}>
                  <img
                    className="ProductImage"
                    src={product.imagePrimary}
                    alt={product.name}
                  />
                </Link>
                <div className="FavButton">
                  {isProductInFavorites(product) ? (
                    <FavoriteIcon
                      fontSize="small"
                      style={{ fill: "red" }}
                      onClick={() => removeFavorite(product)}
                    />
                  ) : (
                    <FavoriteIcon
                      fontSize="small"
                      style={{ fill: "gray" }}
                      onClick={() => addFavorite(product)}
                    />
                  )}
                </div>
              </div>
              <div className="ProductCardDetails">
                <div className="NameAndPrice">
                  <div className="ProductName">{product.name}</div>
                  <div className="ProductPrice">P{product.price}</div>
                </div>
                <div className="Description"> by {product.shop.name}</div>
              </div>
            </div>
          )
        })}
      </div>
    </>
  )
}

export default ProductList

helpers.js

在我的函数中,我使用了favorites来传递数据,但是当我在ProductPage上时,它是未定义的。

代码语言:javascript
复制
function getFromLocalStorage(key) {
    return JSON.parse(localStorage.getItem(key))
  }
  
  function setToLocalStorage(key, data) {
    localStorage.setItem(key, JSON.stringify(data))
  }
  
  export const favoriteProductsStorageKey = "favorites_products"
  
  export function addFavorite(product) {
    const isProductAlreadyFavorite = isProductInFavorites(product)

    if (isProductAlreadyFavorite) return

    const newFavoriteProducts = [...favorites, product]

    setFavorites(newFavoriteProducts)
    setToLocalStorage(favoriteProductsStorageKey, newFavoriteProducts)
  }

  export function removeFavorite(product) {
    const newFavoriteProducts = favorites.filter(
      (iteratedProduct) => iteratedProduct._id !== product._id
    )

    setFavorites(newFavoriteProducts)
    setToLocalStorage(favoriteProductsStorageKey, newFavoriteProducts)
  }

  export function isProductInFavorites(product) {
    return favorites.some(
      (iteratedProduct) => iteratedProduct._id === product._id
    )
  }

  export function getAllFavoriteProducts() {
    return getFromLocalStorage(favoriteProductsStorageKey) || []
  }

问题是我如何再次使用我的函数?我似乎想不通了。我收到一个错误

EN

回答 1

Stack Overflow用户

发布于 2021-07-21 12:43:25

本地状态组件中使用的setFavouritefavourite变量超出了helpers文件的作用域,您将无法从组件作用域之外调用这些函数。为此,您需要使用某种状态管理库,如redux。还需要提到这一点,似乎你正在尝试将你的组件状态保存到localStorage中,有一些钩子可以用来实现这一点。您可以查看此挂钩https://usehooks.com/useLocalStorage/的源代码

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68463936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档