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 React.Component {
  renderScore() {
    let wm_poi_score = this.props.score || '';
    let score = wm_poi_score.toString();
    let scoreArray = score.split('.');
    // 满星个数
    let fullstar = parseInt(scoreArray[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="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');
    }
  }
}

到此这篇关于React星星评分组件的实现的文章就介绍到这了,更多相关React星星评分内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • vue2.0实现前端星星评分功能组件实例代码

    下面给大家分享vue 2.0实现星星评分组件,代码很简单,一起看看吧! 废话不多说了,直接给大家贴代码了,具体代码如下所示: <template id="pingJia"> <div> <ul> <li :class="{li1:1,bg1:index%2}" v-for="(value,index) in list"><span class="stu_span1">

  • 微信小程序中的店铺评分组件及vue中用svg实现的评分显示组件

    在微信小程序中,有遇到要展示店铺评分,或者是订单完成后对商品进行评价,用到了星星展示,查了下,在微信中无法使用svg实现图片,微信中只能将svg图片转成base64来显示,所以是在vue中使用的svg来实现评分 1.效果图 微信中的可以点击及显示,但是,显示的话,在4.2分,4点多分的时候,显示的是半颗星 vue中用的是svg实现,所以用的是占比的形式,可以有一点点的星 2.微信实现店铺评分显示及商品评价星星展示 子组件index.wxml,可以动态的控制星星的大小 <!-- (size * s

  • iOS实现支持小数的星星评分组件实例代码

    前言 评分功能是我们大家都不陌生的一个功能,现在在很多电商,外卖,餐饮型应用里随处可见,都会在商品结束后评价中有一个星星组件.核心思路就是用UIControl并自定义实现其中的trackTouch的几个方法.而显示不到一个的星星,比如半个星星的思路是根据分数切割星星的图像并显示其中一部分. 实现后效果如下: 单个星星的实现 对于单个星星的实现,先考虑星星有三个状态,完全置灰状态,完全高亮状态,根据百分比半高亮状态.而我这边用的是UIButton来实现,因为UIButton本身已经有普通,高亮,选

  • vue实现简单的星级评分组件源码

    vue星级评分组件源码,具体代码如下所示: <!--自定义组件--> <template> <!--结构层--> <div id="star"> <span v-for="classn in starArrs" :class="classn" class="staritem"></span> <!--<span class="star

  • Android开发之拖动条和评分组件用法分析

    本文实例讲述了Android开发之拖动条和评分组件用法.分享给大家供大家参考,具体如下: 今天闲着没事做就拿出了Android书接着学习,android就是组件多有时候还会弄混淆了.这次介绍的是拖动条和评分组件,这2个组件也是超级简单的 下面就一个一个的来研究. 1. 拖动条,就类似android手机上调节音量那个,该组件和对话框不同的是用户可以操作.该组件的xml表现形式如下 <SeekBar android:id="@+id/seek" android:layout_marg

  • js评分组件使用详解

    我们知道,许多外卖app都有评分的星星,这里我总结一下对评分组件的开发,学习视频:饿了么实战(慕课网) 1.html部分 <div class="star" :class="starType"> <span v-for="itemClass in itemClasses" :class="itemClass" class="star-item" track-by="$index&

  • 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('.'

  • iOS实现高性能简单易用的星星评分控件

    前言 做为老司机的你们有没有遇到过这样的需求?每个商品或者商家的item都有个星级或者其他评分,大概像以下的效果图 实现方案: 大神自己写个通用空间(在时间充足的情况下) 网上找个比较好的第三方 (时间比较紧凑的情况下) 更直接的,自己直接放几个ImageView或者Layer 思考:功能是实现了,但是性能好像有点受影响.具体原因要看第三方框架的实现原理,当然了也有做的很好的.我是个性能控,当我拿到这个需求的时候,也尝试用一些第三方,但结果不尽人意.最后XWStarView就此产生了. XWSt

  • vue实现带小数点的星星评分

    本文实例为大家分享了vue实现带小数点的星星评分的具体代码,供大家参考,具体内容如下 首先我们要先引入vue.js文件 css部分 <style> main{ position:relative; } .star_line{ /* 设置强制不换行 */ width-space: nowrap; overflow: hidden; position: absolute; } .star{ display: inline-block; /* 设置当鼠标放到星星上是变成小手样式 */ cursor:

  • Android自定义星星评分控件

    下面为控件的实现历程: 此控件高效,直接使用ondraw绘制,先亮照: 由于Android自身的星星评分控件样式可以改,但是他的大小不好调整的缺点,只能用small normal这样的style调整,自定义不强,因此击发了我自定义星星控件的欲望. 星星评分控件的设计,大体规划为: 需要两张图片,一颗亮星星,一颗空星星:(当然图片不一定是星星,其他图片也可以,现在实验就用星星就好了)星星数量,间距可以自定义,星星的最小步进为0.1,在用户使用的时候与Android自带的方法一样. 星星控件大体分为

随机推荐