★tiny-rate 东半球最小的评级组件☆

事情来源自个人知乎回答---单行写一个评级组件javascript

"★★★★★☆☆☆☆☆".slice(5 - num, 10 - num);
复制代码

简单的评级,因为就是字符,因此支持css定义大小,和颜色,大部分需求用这个是能知足的,可是有些评论表示不能支持小数,好比2.5这种,当时我也没在乎,毕竟一行代码 不能要求太多css

这几天闲了下来 翻翻知乎之前的回答,以为能够扩展一下,丰富成一个支持小数,颜色,大小,星星数量,动画和选择的rate组件,而且支持vue和reacthtml

思路

支持小数其实很简单,先用☆☆☆☆☆当背景,而后把★★★★★放在上层,经过控制width+overflow就能够轻松支持小数字,不单单是2.5, 3.8也支持 毕竟咱们宽度用em单位vue

实现

思路有了,代码就脱口而出了 htmljava

<div>☆☆☆☆☆</div> 
复制代码

cssreact

div {
  position:relative;
}
div::after{
  content:'★★★★★';
  position:absolute;
  top:0;
  left:0;
  width:2.5em;
  overflow: hidden;
}

复制代码

效果以下 git

宽度设为其余小数也很easy 好比3.4github

润色一下

加上颜色,动画什么的web

div {
  position:relative;
  color:#f5222d;
}
div:after{
  content:'★★★★★';
  position:absolute;
  top:0;
  left:0;
  width:0;
  overflow: hidden;
  transition: width 2s;
  -moz-transition: width 2s; 
  -webkit-transition: width 2s; 
  -o-transition: width 2s;

}
div:hover:after{
  width:3.5em;
}

复制代码

功能基本完成 可是鉴于我风骚的性格和方便你们使用,固然是发布到npm上,而且封装了vue和react的版本npm

tiny-rate

最简单的,只返回字符,颜色什么的本身定义把

npm install tiny-rate --save
复制代码
import rate from 'tiny-rate'
console.log(tiny(0)) //☆☆☆☆☆
console.log(tiny(1)) //★☆☆☆☆
console.log(tiny(2)) //★★☆☆☆
console.log(tiny(3)) //★★★☆☆
console.log(tiny(4)) //★★★★☆
console.log(tiny(5)) //★★★★★

复制代码

vue-tiny-rate

先从npm安装到项目里

npm install vue-tiny-rate --save
复制代码

在项目里导入Rate组件

import Rate from 'vue-tiny-rate';

new Vue({
    components: {
        Rate
    }
})
复制代码

react-tiny-rate

先从npm安装到项目里

npm install react-tiny-rate --save
复制代码

在项目里导入Rate组件

import React from 'react';
import ReactDOM from 'react-dom';
import Rate from 'react-tiny-rate'

ReactDOM.render(<Rate />, document.getElementById('root')); 复制代码

vue和react保持统一的参数名,用起来基本同样

<Rate />
复制代码

配置项

  • value {number|string} : 评几星,支持小数 默认:0
<Rate value="0.5"></Rate>
<Rate value="1"></Rate>
<Rate value="3.6"></Rate>
复制代码

  • readonly {boolean} : 是不是只读. 默认鼠标移上去,是有选择效果的 default:false
<Rate value="0.5"></Rate>
<Rate value="1"></Rate>
<Rate value="3.6" readonly="true"></Rate>
复制代码

  • length {number|string} : 一共几个星 默认:5
<Rate value="2" length="4"></Rate>
<Rate value="3.6" length="8"></Rate>
<Rate value="7.6" length="10"></Rate>
复制代码

  • theme {color|enum('yellow','green','blue','red','purple','orange','black','wihte')}: 主题色. 默认: yellow
<Rate value="4.5">Yellow</Rate>
<Rate value="4.5" theme="green">Green</Rate>
<Rate value="4.5" theme="blue">Blue</Rate>
<Rate value="4.5" theme="red">Red</Rate>
<Rate value="4.5" theme="purple">Purple</Rate>
<Rate value="4.5" theme="orange">Orange</Rate>
<Rate value="4.5" theme="black">Black</Rate>
<Rate value="4.5" theme="#91d5ff">#91d5ff</Rate>

复制代码

  • size {number|string}: 星星的大小. 注意要带上单位
<Rate value="4.5" size='12px'>12px</Rate>
<Rate value="4.5" size='16px'>16px</Rate>
<Rate value="4.5" size='20px'>20px</Rate>
<Rate value="4.5" size='40px'>40px</Rate>
复制代码

  • animate {number|string}: 是否有动画(秒) default:0
<Rate value="3.5" animate='1'>1s</Rate>
<Rate value="3.5" animate='2'>2s</Rate>
<Rate value="3.5" animate='3'>3s</Rate>
复制代码

Events

  • onRate: 选中星级后的回掉. vue和react使用的代码分别以下
  1. Vue
<Rate @onRate="onrate" :value="value"/>
复制代码
new Vue({
  el: '#app',
  components: { Rate },
  template: '<Rate @onRate="onrate" :value="value"/>',
  data: {
    value: '2.6'
  },
  methods: {
    onrate (num) {
      console.log(num)
      this.value = num
    }
  }
})
复制代码
  1. React
import React from 'react';
import ReactDOM from 'react-dom';
import Rate from 'react-tiny-rate'

class App extends React.Component{
  constructor(props){
    super(props)
    this.state = {value:2.5}
    this.handleRate = this.handleRate.bind(this)
  }
  handleRate(value){
    console.log(value)
    this.setState({ value })
  }
  render(){
    return <Rate onRate={this.handleRate} value={this.state.value}>Rate </Rate>
  }
}
ReactDOM.render(<App />, document.getElementById('root')); 复制代码

写完这俩组件,我最大的感觉就是,人闲下来真是第一辈子产力,这应该是东半球最小的评级组件了吧 求star和试用

至于为何没有angular4版本的,由于我不会啊 等我学了angular4再写把

最后打个广告,欢迎你们关注和支持我在慕课网的实战课程Redux+React Router+Node.js全栈开发实时聊天应用 拜谢

相关文章
相关标签/搜索