React星星評(píng)分組件的實(shí)現(xiàn)
實(shí)現(xiàn)的需求為傳入對(duì)商品的評(píng)分?jǐn)?shù)據(jù),頁(yè)面顯示對(duì)應(yīng)的星星個(gè)數(shù)。
1. 準(zhǔn)備三張對(duì)應(yīng)不同評(píng)分的星星圖片



2. 期望實(shí)現(xiàn)的效果
這樣的

調(diào)用
<StarScore score={data.wm_poi_score}/>
3. 對(duì)傳入的數(shù)據(jù)進(jìn)行處理
我們需要得到評(píng)分的整數(shù)和小數(shù)部分
let wm_poi_score = this.props.score || '';
let score = wm_poi_score.toString();
let scoreArray = score.split('.');
如果傳入 4.7 ,那么得到的 scoreArray 就是['4', '7']
4. 根據(jù)數(shù)據(jù)計(jì)算對(duì)應(yīng)的星星個(gè)數(shù)
// 滿(mǎn)星個(gè)數(shù) let fullstar = parseInt(scoreArray[0]); // 半星個(gè)數(shù) let halfstar = parseInt(scoreArray[1]) >= 5 ? 1 : 0; // 灰色星個(gè)數(shù) let nullstar = 5 - fullstar - halfstar;
5. 根據(jù)星星個(gè)數(shù),渲染組件
let starjsx = [];
// 渲染滿(mǎn)星
for (let i = 0; i < fullstar; i++) {
starjsx.push(<div key={i + 'full'} className="star fullstar"></div>)
}
// 渲染半星
if (halfstar) {
for (let j = 0; j < halfstar; j++) {
starjsx.push(<div key={j + 'half'} className="star halfstar"></div>)
}
}
// 渲染灰色星
if (nullstar) {
for (let k = 0; k < nullstar; k++) {
starjsx.push(<div key={k + 'null'} className="star nullstar"></div>)
}
}
ok,我們想要的效果就實(shí)現(xiàn)啦
6. 手動(dòng)評(píng)分

頁(yè)面初次展示時(shí),渲染 5 個(gè)灰色的星星。為每一個(gè)星星添加一個(gè) click 事件。當(dāng)點(diǎn)擊之時(shí),獲取該星星所對(duì)應(yīng)的下標(biāo) index,為其添加高亮的樣式。
<div className="star-area">
{this.renderStar()}
</div>
doEva(i) {
this.setState({
startIndex: i + 1
});
}
renderStar() {
let array = []
for (let i = 0; i < 5; i++) {
let cls = i >= this.state.startIndex ? "star-item" : "star-item light"
array.push(
<div onClick={() => this.doEva(i)} key={i} className={cls}></div>
)
}
return array
}
完整代碼
import React from 'react';
import './StarScore.scss';
// 渲染5顆星得分方法
class StarScore extends React.Component {
renderScore() {
let wm_poi_score = this.props.score || '';
let score = wm_poi_score.toString();
let scoreArray = score.split('.');
// 滿(mǎn)星個(gè)數(shù)
let fullstar = parseInt(scoreArray[0]);
// 半星個(gè)數(shù)
let halfstar = parseInt(scoreArray[1]) >= 5 ? 1 : 0;
// 灰色星個(gè)數(shù)
let nullstar = 5 - fullstar - halfstar;
let starjsx = [];
// 渲染滿(mǎn)星
for (let i = 0; i < fullstar; i++) {
starjsx.push(<div key={i + 'full'} className="star fullstar"></div>)
}
// 渲染半星
if (halfstar) {
for (let j = 0; j < halfstar; j++) {
starjsx.push(<div key={j + 'half'} className="star halfstar"></div>)
}
}
// 渲染灰色星
if (nullstar) {
for (let k = 0; k < nullstar; k++) {
starjsx.push(<div key={k + 'null'} className="star nullstar"></div>)
}
}
return starjsx;
}
render() {
return <div className="star-score">{this.renderScore()}</div>;
}
}
export default StarScore;
StarScore.scss
.star-score {
.star {
width: 10px;
height: 10px;
float: left;
background-size: cover;
}
.fullstar {
background-image: url('./img/fullstar.png');
}
.halfstar {
background-image: url('./img/halfstar.png');
}
.nullstar {
background-image: url('./img/gray-star.png');
}
}
import './Main.scss';
import React from 'react';
class Main extends React.Component {
constructor(props) {
super(props);
}
}
/**
* 點(diǎn)擊評(píng)分
*/
doEva(i) {
this.setState({
startIndex: i + 1
});
}
/**
* 渲染評(píng)分用的星
*/
renderStar() {
let array = []
for (let i = 0; i < 5; i++) {
let cls = i >= this.state.startIndex ? "star-item" : "star-item light"
array.push(
<div onClick={() => this.doEva(i)} key={i} className={cls}></div>
)
}
return array
}
render() {
return (
<div className="content">
<div className="star-area">
{this.renderStar()}
</div>
</div>
);
}
}
export default Main;
.content {
height: 100%;
.eva-content {
background-color: #fff;
overflow: hidden;
margin: px2rem(10px);
margin-top: px2rem(74px);
}
.star-area {
text-align: center;
margin-top: px2rem(30px);
}
.star-item {
width: px2rem(32px);
height: px2rem(32px);
background-image: url('./img/gray-star.png');
background-size: cover;
display: inline-block;
margin-right: px2rem(10px);
&.light {
background-image: url('./img/light-star.png');
}
}
}
到此這篇關(guān)于React星星評(píng)分組件的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)React星星評(píng)分內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
react router4+redux實(shí)現(xiàn)路由權(quán)限控制的方法
本篇文章主要介紹了react router4+redux實(shí)現(xiàn)路由權(quán)限控制的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
React Native之prop-types進(jìn)行屬性確認(rèn)詳解
本篇文章主要介紹了React Native之prop-types進(jìn)行屬性確認(rèn)詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
react-redux及redux狀態(tài)管理工具使用詳解
Redux是為javascript應(yīng)用程序提供一個(gè)狀態(tài)管理工具集中的管理react中多個(gè)組件的狀態(tài)redux是專(zhuān)門(mén)作狀態(tài)管理的js庫(kù)(不是react插件庫(kù)可以用在其他js框架中例如vue,但是基本用在react中),這篇文章主要介紹了react-redux及redux狀態(tài)管理工具使用詳解,需要的朋友可以參考下2023-01-01
React報(bào)錯(cuò)之Parameter event implicitly has a
這篇文章主要為大家介紹了React報(bào)錯(cuò)之Parameter event implicitly has an any type,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
阿里低代碼框架lowcode-engine自定義設(shè)置器詳解
這篇文章主要為大家介紹了阿里低代碼框架lowcode-engine自定義設(shè)置器示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02

