1. 程式人生 > 程式設計 >React星星評分元件的實現

React星星評分元件的實現

實現的需求為傳入對商品的評分資料,頁面顯示對應的星星個數。

1. 準備三張對應不同評分的星星圖片

在這裡插入圖片描述
在這裡插入圖片描述在這裡插入圖片描述

2. 期望實現的效果

這樣的

在這裡插入圖片描述

呼叫

<StarScore score={data.wm_poi_score}/>

3. 對傳入的資料進行處理

我們需要得到評分的整數和小數部分

let wm_poi_score = this.props.score || '';
let score = wm_poi_score.toString();
let scoreArray = score.split('.');

如果傳入 4.7 ,那麼得到的 scoreArray 就是['4','7']

4. 根據資料計算對應的星星個數

// 滿星個數
let fullstar = parseInt(scoreArray[0]);
// 半星個數
let halfstar = parseInt(scoreArray[1]) >= 5 ? 1 : 0;
// 灰色星個數
let nullstar = 5 - fullstar - halfstar;

5. 根據星星個數,渲染元件

let starjsx = [];
// 渲染滿星
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,我們想要的效果就實現啦

6. 手動評分

在這裡插入圖片描述

頁面初次展示時,渲染 5 個灰色的星星。為每一個星星新增一個 click 事件。當點選之時,獲取該星星所對應的下標 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 www.cppcns.comReact.Component {
  renderScore() {
    let wm_poi_score = this.props.score || '';
    let score = wm_poi_score.toString();
    let scoreArray = score.split('.');
    // 滿星個數
    let fullstar = parseInt(score程式設計客棧Array[0]);
    // 半星個數
    let halfstar = parseInt(scoreArray[1]) >= 5 ? 1 : 0;
    // 灰色星個數
    let nullstar = 5 - fullstar - halfstar;
    let starjsx = [];

    // 渲染滿星
    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);
    }
  }
  
  /**
   * 點選評分
   */
  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
  }
  render() {
    return (
      <div className="contefbSoPQfnt">
        <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');
    }
  }
}

到此這篇關於React星星評分元件的實現的文章就介紹到這了,更多相關React星星評分內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!