reactjs - 如何使用本地存储单独设置评级?
问题描述
好的,如您所知,我正在构建一个食谱应用程序,在每个食谱详细信息页面中,我可以对食谱进行评分……但现在的问题是,当我现在对一个食谱进行评分时,为所有食谱设置了相同的评分其他食谱也是如此。知道如何解决吗?Apreciate 任何建议...非常感谢 :))
详细信息.js
import { useParams } from 'react-router-dom';
import './Details.css';
import React, { useEffect, useState } from 'react';
import axios from 'axios';
import Image from './vitaminDfood-1132105308-770x553.jpg';
import {Link} from 'react-router-dom'
import ReactStars from 'react-rating-stars-component'
import { RecipeContext } from './RecipeContext';
import { useContext } from 'react';
function Details() {
const [details, setDetails] = useState([]);
const { recipeId } = useParams();
const{recipes,setRecipes}=useContext(RecipeContext)
const initialRatings = JSON.parse(localStorage.getItem("rating") || "[]");
const[rating,setRating]=useState(initialRatings)
useEffect(() => {
axios
.get(`https://cookbook.ack.ee/api/v1/recipes/${recipeId}`)
.then((res) => setDetails(res.data));
});
useEffect(() => {
localStorage.setItem("rating", JSON.stringify(rating));
}, [rating])
const ratingChanged = (newRating) => {
var rate={
score:newRating
}
setRating(newRating)
axios.post(`https://cookbook.ack.ee/api/v1/recipes/${recipeId}/ratings`,rate)
.then((res) => {
console.log(res.data)
setRecipes(recipes)
})
};
return (
<>
<div className="details">
<div className="food-photo">
<img src={Image} alt="" />
<Link to="/"> <i className="fas fa-arrow-left arrow"></i></Link>
<h1>{details.name}</h1>
</div>
<div className="star-line">
{new Array(rating).fill(null).map(() => (
<i className="fas fa-star stari"/>
))}
<p className="duration"><i className="far fa-clock"></i>{details.duration}<span>min.</span></p>
</div>
<p className="info">{details.info}</p>
<h1 className="ingredience">Ingredience</h1>
<div className="ing">{details.ingredients}</div>
<h1 className="ingredience">Příprava</h1>
<p className="description">{details.description}</p>
</div>
<div className="stars">
<ReactStars
classNames="star"
size={48}
onChange={ratingChanged}
count={5}
value={1}
edit
/>
</div>
</>
);
}
export default Details;
解决方案
你有几个选择:
localStorage
为每个配方存储不同的密钥- 只需输入一个大的“评级”键,
localStorage
然后将其作为您的recipeId
.
我认为第一个选项是最直接的,可以通过这些小的修改来完成:
const initialRatings = JSON.parse(localStorage.getItem(`ratings-${recipeId}`) || "[]");
useEffect(() => {
localStorage.setItem(`ratings-${recipeId}`, JSON.stringify(rating));
}, [rating, recipeId])
推荐阅读
- verilog - Verilog 中的 [-1:0] 是什么意思?
- sql - 如何将 2 个表中的 2 列连接到一个列中?
- api - 是否有显示函数参数的 voip.ms API 文档
- java - Java java.lang.ClassNotFoundException:jade.core.migration.InterPlatformMobilityService
- python-3.x - AttributeError 是否正常工作 pandas df
- wordpress - 在 Wordpress 中将帖子状态设置为“私人”会生成真正的 404 页面吗?
- mysql - SLOW QUERY / IN HAVING 子句
- ios - 尝试通过 VTDecompressionSessionDecodeFrame 传递和读取 UnsafeMutableRawPointer 时的 EXC_BAD_ACCESS
- matlab - 你如何使用while循环计算算术级数的总和?
- powerbi - 如何计算 Power BI 中的周期时间?