我正在建立一个反应电子商务网站,我正在使用简单-农民的剩馀。当我添加到cart时,我想坚持使用localStorage。我在他们的文档中找不到任何关于如何持久化到localStorage的信息。easy被配置为持久化为sessionStorage;尽管有人提到可以将其配置为localStorage。
我目前可以添加到cart,但不能设置为localStorage。
下面是我的store.js和产品页面
import { createStore, action } from 'easy-peasy';
const store = createStore({
cartItems: JSON.parse(localStorage.getItem('cartItems')) ?? [],
addToCart: action((state, payload) => {
return {
...state,
cartItems: [...state.cartItems, payload],
};
}),
});
export default store;//主页(产品页)
import { collection, addDoc, getDocs } from 'firebase/firestore';
import { db } from '../../firebase/config';
import { products } from '../../figsofeden-products';
import { Card, Row, Container, Col } from 'react-bootstrap';
import { Link, useNavigate } from 'react-router-dom';
import { useState, useEffect } from 'react';
import { useStoreActions, useStore } from 'easy-peasy';
const Home = () => {
const [products, setProducts] = useState([]);
const navigate = useNavigate();
useEffect(() => {
getData();
}, []);
async function getData() {
try {
const products = await getDocs(collection(db, 'products'));
const productsArray = [];
products.forEach((doc) => {
const obj = {
id: doc.id,
...doc.data(),
};
productsArray.push(obj);
});
setProducts(productsArray);
} catch (error) {
console.log(error);
}
}
const addToCart = useStoreActions((actions) => actions.addToCart);
return (
<Layout>
<Container fluid className="product-directory mx-auto">
<Row xs={1} md={2} lg={3} className="g-2">
{products.map((product, index) => {
return (
<Col key={product.id} className="g-2">
<Card>
<div className="product-wrapper position-relative">
<div className="product-content">
<Card.Img
variant="top"
src={product.imageURL}
alt="img"
/>
<Card.Body>
<Card.Text>{product.name}</Card.Text>
<Card.Text>NGN {product.price}</Card.Text>
</Card.Body>
</div>
<div className="product-actions">
<h3> NGN {product.price}</h3>
<div className="d-flex">
<button
className="mx-2"
disabled={product.quantity === 0 ? 'true' : ''}
onClick={() => addToCart(product)}
>
ADD TO CART
</button>
<button
onClick={() => {
navigate(`/productinfo/${product.id}`);
}}
>
VIEW
</button>
</div>
<div className="outofstock">
<p>
<em>{product.quantity > 0 ? '' : 'Out Of Stock'}</em>
</p>
</div>
</div>
</div>
</Card>
</Col>
);
})}
</Row>
</Container>
</Layout>
);
};
export default Home;发布于 2022-02-12 20:25:40
addToCart: action((state, payload) => {
// define cartItems with needed state values
const cartItems = [...state.cartItems, payload]
// after set it to local storage
window.localStorage.setItem("cartItems", JSON.stringfy(cartItems))
// and return the new state
return {
...state,
cartItems
};发布于 2022-02-17 15:20:41
使用简便易行的持久化助手
https://easy-peasy.vercel.app/docs/api/persist.html
// store.js
import { createStore, action } from 'easy-peasy';
const store = createStore(
persist({
cartItems: [],
addToCart: action((state, payload) => {
cartItems.push(payload)
}),
}, {
storage: 'localstorage'
})
);
export default store;注意:您可以在更新您的存储库的操作中直接更改状态--通过二聚体将突变转化为针对您的存储的不可变更新。
所以用吧
cartItems.push(payload)而不是
return {
...state,
cartItems: [...state.cartItems, payload],
}另外,我建议把你的产品储存在商店里,然后通过雷鸣般的方式收回它们。
https://stackoverflow.com/questions/71095375
复制相似问题