如何在反应中为 2 个不同的问题制作评级星?
How to make rating stars for 2 different question in react?
我正在为评分问题创建一个 React 应用程序。我已经尝试用 png 图像对星星进行评级,并且它可以很好地解决 1 个问题。但是当我添加另一个带有该评级星的问题时,它不起作用。
这是我试过的
import React, { Component } from "react";
import fullStarSrc from "../img/highlightedStar.png";
import emptyStarSrc from "../img/star.png";
class joinPage extends Component {
rate = (event) => {
const { id } = event.target;
console.log("clicked: " + id);
var i;
for (i = 1; i <= 5; i++) {
if (i <= parseInt(id)) {
document.getElementById(i).setAttribute("src", fullStarSrc);
} else {
document.getElementById(i).setAttribute("src", emptyStarSrc);
}
}
};
pro1 = (event) => {
const { id } = event.target;
console.log("clicked: " + id);
var i;
for (i = 1; i <= 5; i++) {
if (i <= parseInt(id)) {
document.getElementById(i).setAttribute("src", fullStarSrc);
} else {
document.getElementById(i).setAttribute("src", emptyStarSrc);
}
}
};
render() {
return (
<body>
<p class="ques">How would you rate our Service?</p>
<div id="rating0" class="1">
<img onClick={this.rate} class="star" id="1" src={emptyStarSrc} />
<img onClick={this.rate} class="star" id="2" src={emptyStarSrc} />
<img onClick={this.rate} class="star" id="3" src={emptyStarSrc} />
<img onClick={this.rate} class="star" id="4" src={emptyStarSrc} />
<img onClick={this.rate} class="star" id="5" src={emptyStarSrc} />
</div>
<p class="ques">How would you rate the quality of food?</p>
<div id="rating0" class="1">
<img onClick={this.pro1} class="star" id="1" src={emptyStarSrc} />
<img onClick={this.pro1} class="star" id="2" src={emptyStarSrc} />
<img onClick={this.pro1} class="star" id="3" src={emptyStarSrc} />
<img onClick={this.pro1} class="star" id="4" src={emptyStarSrc} />
<img onClick={this.pro1} class="star" id="5" src={emptyStarSrc} />
</div>
</body>
);
}
}
export default joinPage;
我该如何解决这个问题?
因为它有相同的id。您只需更新 id 在第二个速率是
<div id="rating0" class="1">
<img onClick={this.pro1} class="star" id="6" src={emptyStarSrc} />
<img onClick={this.pro1} class="star" id="7" src={emptyStarSrc} />
<img onClick={this.pro1} class="star" id="8" src={emptyStarSrc} />
<img onClick={this.pro1} class="star" id="9" src={emptyStarSrc} />
<img onClick={this.pro1} class="star" id="10" src={emptyStarSrc} />
</div>
并更新 pro1
:
pro1 = (event) => {
const { id } = event.target;
console.log("clicked: " + id);
var i;
for (i = 6; i <= 10; i++) {
if (i <= parseInt(id)) {
document.getElementById(i).setAttribute("src", fullStarSrc);
} else {
document.getElementById(i).setAttribute("src", emptyStarSrc);
}
}
};
重构代码以使用 React 挂钩和状态而不是改变状态,还将评级添加到新组件。
查看演示沙盒 https://codesandbox.io/s/rough-bird-cy4yy?file=/src/App.js:0-851
import { useState, useEffect } from "react";
import unstar from "./star-unselected.png";
import star from "./star-selected.png";
import _ from "lodash";
import "./styles.css";
function RatingStars({ initRating, onRatingChanged }) {
const [rating, setRating] = useState(initRating);
useEffect(() => {
// if prop changed, we want to reflect that.
setRating(initRating);
}, [initRating]);
function changeRating(newRating) {
setRating(newRating);
onRatingChanged(newRating);
}
return (
<div>
{_.times(5, (index) => (
<img
alt="rating stars"
src={rating >= index + 1 ? star : unstar}
key={index}
onClick={() => changeRating(index + 1)}
/>
))}{" "}
<span>has {rating} of 5 stars</span>
</div>
);
}
export default function App() {
return (
<div className="App">
<RatingStars
initRating={3}
onRatingChanged={(newRating) => {
console.log(
`NEW RATING (${newRating}) DETECTED FOR 1.. SAVING TO DB`
);
}}
/>
<RatingStars
initRating={1}
onRatingChanged={(newRating) => {
console.log(
`NEW RATING (${newRating}) DETECTED FOR 2.. SAVING TO DB`
);
}}
/>
</div>
);
}
我正在为评分问题创建一个 React 应用程序。我已经尝试用 png 图像对星星进行评级,并且它可以很好地解决 1 个问题。但是当我添加另一个带有该评级星的问题时,它不起作用。
这是我试过的
import React, { Component } from "react";
import fullStarSrc from "../img/highlightedStar.png";
import emptyStarSrc from "../img/star.png";
class joinPage extends Component {
rate = (event) => {
const { id } = event.target;
console.log("clicked: " + id);
var i;
for (i = 1; i <= 5; i++) {
if (i <= parseInt(id)) {
document.getElementById(i).setAttribute("src", fullStarSrc);
} else {
document.getElementById(i).setAttribute("src", emptyStarSrc);
}
}
};
pro1 = (event) => {
const { id } = event.target;
console.log("clicked: " + id);
var i;
for (i = 1; i <= 5; i++) {
if (i <= parseInt(id)) {
document.getElementById(i).setAttribute("src", fullStarSrc);
} else {
document.getElementById(i).setAttribute("src", emptyStarSrc);
}
}
};
render() {
return (
<body>
<p class="ques">How would you rate our Service?</p>
<div id="rating0" class="1">
<img onClick={this.rate} class="star" id="1" src={emptyStarSrc} />
<img onClick={this.rate} class="star" id="2" src={emptyStarSrc} />
<img onClick={this.rate} class="star" id="3" src={emptyStarSrc} />
<img onClick={this.rate} class="star" id="4" src={emptyStarSrc} />
<img onClick={this.rate} class="star" id="5" src={emptyStarSrc} />
</div>
<p class="ques">How would you rate the quality of food?</p>
<div id="rating0" class="1">
<img onClick={this.pro1} class="star" id="1" src={emptyStarSrc} />
<img onClick={this.pro1} class="star" id="2" src={emptyStarSrc} />
<img onClick={this.pro1} class="star" id="3" src={emptyStarSrc} />
<img onClick={this.pro1} class="star" id="4" src={emptyStarSrc} />
<img onClick={this.pro1} class="star" id="5" src={emptyStarSrc} />
</div>
</body>
);
}
}
export default joinPage;
我该如何解决这个问题?
因为它有相同的id。您只需更新 id 在第二个速率是
<div id="rating0" class="1">
<img onClick={this.pro1} class="star" id="6" src={emptyStarSrc} />
<img onClick={this.pro1} class="star" id="7" src={emptyStarSrc} />
<img onClick={this.pro1} class="star" id="8" src={emptyStarSrc} />
<img onClick={this.pro1} class="star" id="9" src={emptyStarSrc} />
<img onClick={this.pro1} class="star" id="10" src={emptyStarSrc} />
</div>
并更新 pro1
:
pro1 = (event) => {
const { id } = event.target;
console.log("clicked: " + id);
var i;
for (i = 6; i <= 10; i++) {
if (i <= parseInt(id)) {
document.getElementById(i).setAttribute("src", fullStarSrc);
} else {
document.getElementById(i).setAttribute("src", emptyStarSrc);
}
}
};
重构代码以使用 React 挂钩和状态而不是改变状态,还将评级添加到新组件。
查看演示沙盒 https://codesandbox.io/s/rough-bird-cy4yy?file=/src/App.js:0-851
import { useState, useEffect } from "react";
import unstar from "./star-unselected.png";
import star from "./star-selected.png";
import _ from "lodash";
import "./styles.css";
function RatingStars({ initRating, onRatingChanged }) {
const [rating, setRating] = useState(initRating);
useEffect(() => {
// if prop changed, we want to reflect that.
setRating(initRating);
}, [initRating]);
function changeRating(newRating) {
setRating(newRating);
onRatingChanged(newRating);
}
return (
<div>
{_.times(5, (index) => (
<img
alt="rating stars"
src={rating >= index + 1 ? star : unstar}
key={index}
onClick={() => changeRating(index + 1)}
/>
))}{" "}
<span>has {rating} of 5 stars</span>
</div>
);
}
export default function App() {
return (
<div className="App">
<RatingStars
initRating={3}
onRatingChanged={(newRating) => {
console.log(
`NEW RATING (${newRating}) DETECTED FOR 1.. SAVING TO DB`
);
}}
/>
<RatingStars
initRating={1}
onRatingChanged={(newRating) => {
console.log(
`NEW RATING (${newRating}) DETECTED FOR 2.. SAVING TO DB`
);
}}
/>
</div>
);
}