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


Posted in Javascript onNovember 16, 2018

在微信小程序中,有遇到要展示店铺评分,或者是订单完成后对商品进行评价,用到了星星展示,查了下,在微信中无法使用svg实现图片,微信中只能将svg图片转成base64来显示,所以是在vue中使用的svg来实现评分

1.效果图

微信中的可以点击及显示,但是,显示的话,在4.2分,4点多分的时候,显示的是半颗星

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

vue中用的是svg实现,所以用的是占比的形式,可以有一点点的星

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

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

2.微信实现店铺评分显示及商品评价星星展示

子组件index.wxml,可以动态的控制星星的大小

<!-- (size * stars.length + (size/2) * 4 + 20 )这里的话,是在可以点击的时候,加上了好评的字体的长度 -->
<view class='starsBox' style='width:{{isClick?(size * stars.length + (size/2) * 4 + 20 ):(size * stars.length)}}rpx;height:{{size}}rpx;'>
 <view class='stars' style='width:{{size * stars.length}}rpx;height:{{size}}rpx;'>
 <block wx:for="{{stars}}" wx:key="{{index}}">
  <image src="/images/{{item == 0 ? 'grayStar':item}}.png" style='width:{{size}}rpx;height:{{size}}rpx;' data-index="{{index}}" catchtap="computeScore"></image>
 </block>
 </view>
 <view wx:if="{{isClick}}" class='text' style='font-size:{{size/2}}rpx;'>
 <text wx:if="{{value=='0'}}" class='pointText'>暂无评分</text>
 <text wx:elif="{{value=='1'}}" class='pointText'>差评</text>
 <text wx:elif="{{value<'4'}}" class='pointText'>中评</text>
 <text wx:else class='pointText'>好评</text>
 </view>
</view>

子组件index.wxss

.starsBox{
 display: flex;
 align-items: center;
 justify-content: flex-start;
}
.stars{
 width: 150rpx;
 height: 50rpx;
 display: flex;
 align-items: center;
 justify-content: flex-start;
}
.stars image{
 width: 30rpx;
 height: 30rpx;
}
.text{
 color: #ccc;
 margin-left: 20rpx;
}

子组件index.js

Component({
 properties: {
 /* 显示有色星星的个数 */
 value: {
  type: Number,
  value: 0,
  /* 监听value值的变化 */
  observer: function (newVal, oldVal, changedPath) {
  this.init()
  }
 },
 /* 设置星星大小 */
 size: {
  type: Number,
  value: 30
 },
 /* 是否可点击,type为null表示值可以是任意类型 */
 isClick: {
  type: null,
  value: false
 }
 },
 attached() {
 /* 组件生命周期函数,在组件实例进入页面节点树时执行 */
 this.init();
 },
 data: {
 stars: [0, 0, 0, 0, 0]
 },
 methods: {
 init() {
  let star = this.properties.value;
  let stars = [0, 0, 0, 0, 0];
  /* 图片名称,通过设置图片名称来动态的改变图片显示 */
  for (let i = 0; i < Math.floor(star); i++) {
  stars[i] = 'star';
  }
  if (star > Math.floor(star)) {
  stars[Math.floor(star)] = 'halfStar';
  }
  for (let i = 0; i < stars.length; i++) {
  if (stars[i] == 0) {
   stars[i] = 'grayStar';
  }
  }
  this.setData({
  stars
  })
 },
 /* 可点击时,用于计算分数 */
 computeScore(e) {
  let index = e.currentTarget.dataset.index;
  let isClick = this.data.isClick;
  if (isClick) {
  let score = index + 1;
  this.triggerEvent('compute', {
   score
  });
  }
 }
 }
})

3.父组件中引用

父组件index.wxml

<view class="score">
 <view class="scoreItem">
  <score value="{{shopGrade}}" size="46" isClick="true" bindcompute="computeGrade" />
 </view>
 <view class="scoreItem">
  <score value="{{shopGrade1}}" size="46" /> 
 </view>
</view>

父组件index.json

{
 "usingComponents": {
  "score": "/component/score/index"
 }
}

父组件index.js

data: {
 shopGrade: 0,
 shopGrade1: 4.6,
},
/* 评分处理事件 */
computeGrade(e) {
 let score = e.detail.score;
 this.setData({
  shopGrade: score
 })
},

4.vue中使用svg实现评分

首先在vue使用的index.html的模板文件中添加一个rem转换算法,因为我后面用的单位是rem

/* 在头部添加 */
<script type="text/javascript">
   document.getElementsByTagName("html")[0].style.fontSize = 100 / 750 * window.screen.width + "px";
  </script>

然后添加svg.vue文件,这个svg文件可以自己找图片生成,并设置对应的id

<template>
  <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="position:absolute;width:0;height:0;visibility:hidden">
    <defs>
      <symbol id="star" viewBox="0 0 32 32">
        <path class="path1" d="M16 26.382l-8.16 4.992c-1.5 0.918-2.382 0.264-1.975-1.435l2.226-9.303-7.269-6.218c-1.337-1.143-0.987-2.184 0.755-2.322l9.536-0.758 3.667-8.835c0.674-1.624 1.772-1.613 2.442 0l3.667 8.835 9.536 0.758c1.753 0.139 2.082 1.187 0.755 2.322l-7.269 6.218 2.226 9.303c0.409 1.71-0.485 2.347-1.975 1.435l-8.16-4.992z">
        </path>
      </symbol>
    </defs>
  </svg>
</template>
<script></script>
<style></style>

rating.vue文件引用svg.vue

<template>
  <div class="ratingstar">
    <section class="star_container">
      <svg class="grey_fill" v-for="(num,index) in 5" :key="index">
        <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#star" rel="external nofollow" rel="external nofollow" ></use>
      </svg>
    </section>
    <div class="star_overflow" :style="'width:'+rating*2/10+'rem'">
      <section class="star_container">
        <svg class="orange_fill" v-for="(num,index) in 5" :key="index">
          <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#star" rel="external nofollow" rel="external nofollow" ></use>
        </svg>
      </section>
    </div>
    <svgIcon></svgIcon>
  </div>
</template>

<script>
 import svgIcon from '@/components/svg'
 export default {
  components: {
   svgIcon
  },
  data() {
    return {
      rating: 4.2
    }
  },
 }
</script>
<style lang="less" rel="stylesheet/less" scoped>
  .ratingstar {
    position: relative;
    width: 100%;
    .star_overflow {
      overflow: hidden;
      position: relative;
      height: 0.65rem;
    }
    .star_container {
      position: absolute;
      top: 0.05rem;
      width: 1rem;
      display: flex;
      justify-content: flex-start;
      align-items: center;
      .grey_fill {
        width: 0.94rem;
        height: 0.2rem;
        fill: #d1d1d1;
      }
      .orange_fill {
        width: 0.94rem;
        height: 0.2rem;
        fill: #ff9a0d;
      }
    }
  }
</style>

总结

以上所述是小编给大家介绍的微信小程序中的店铺评分组件及vue中用svg实现的评分显示组件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
javascript实现的在当前窗口中漂浮框的代码
Mar 15 Javascript
基于jquery的cookie的用法
Jan 10 Javascript
JS在TextArea光标位置插入文字并实现移动光标到文字末尾
Jun 21 Javascript
JS比较两个时间大小的简单示例代码
Dec 20 Javascript
js获取IP地址的方法小结
Jul 01 Javascript
jQuery中Ajax的get、post等方法详解
Jan 20 Javascript
jQuery EasyUI Tab 选项卡问题小结
Aug 16 Javascript
JavaScript实现计数器基础方法
Oct 10 Javascript
详解vue-cli 3.0 build包太大导致首屏过长的解决方案
Nov 10 Javascript
JS运算符简单用法示例
Jan 19 Javascript
vue 使用class创建和清除水印的示例代码
Dec 25 Vue.js
使用JS实现简易计算器
Jun 14 Javascript
layui-laydate时间日历控件使用方法详解
Nov 15 #Javascript
laydate如何根据开始时间或者结束时间限制范围
Nov 15 #Javascript
layDate插件设置开始和结束时间
Nov 15 #Javascript
解决vue2 在mounted函数无法获取prop中的变量问题
Nov 15 #Javascript
vue中使用better-scroll实现滑动效果及注意事项
Nov 15 #Javascript
layDate日期控件使用方法详解
Nov 15 #Javascript
vue2中引用及使用 better-scroll的方法详解
Nov 15 #Javascript
You might like
最小化数据传输――在客户端存储数据
2006/10/09 PHP
PHP URL地址获取函数代码(端口等) 推荐
2010/05/15 PHP
PHP简单获取及判断提交来源的方法
2016/04/22 PHP
PHP通过get方法获得form表单数据方法总结
2018/09/12 PHP
PHP校验15位和18位身份证号的类封装
2018/11/07 PHP
Laravel使用RabbitMQ的方法示例
2019/06/18 PHP
比较简单实用的使用正则三种版本的js去空格处理方法
2007/11/18 Javascript
JQuery从头学起第二讲
2010/07/04 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器(优化篇)
2013/06/28 Javascript
toggle一个div显示或隐藏且可扩展成自定义下拉框
2013/09/12 Javascript
限制textbox或textarea输入字符长度的JS代码
2013/10/16 Javascript
JavaScript跨平台的开源框架NativeScript
2015/03/24 Javascript
JQuery显示隐藏DIV的方法及代码实例
2015/04/16 Javascript
clipboard.js无需Flash无需依赖任何JS库实现文本复制与剪切
2015/10/10 Javascript
js实现二级导航功能
2017/03/03 Javascript
JS库之ParticlesJS使用简介
2017/09/12 Javascript
jquery的$().each和$.each的区别
2019/01/18 jQuery
JSON是什么?有哪些优点?JSON和XML的区别?
2019/04/29 Javascript
微信小程序实现发微博功能的示例代码
2020/06/24 Javascript
原生js实现表格翻页和跳转
2020/09/29 Javascript
vue 实现element-ui中的加载中状态
2020/11/11 Javascript
windows下wxPython开发环境安装与配置方法
2014/06/28 Python
ubuntu16.04制作vim和python3的开发环境
2018/09/23 Python
python  创建一个保留重复值的列表的补码
2018/10/15 Python
对python中的*args与**kwgs的含义与作用详解
2019/08/28 Python
解决Django Haystack全文检索为空的问题
2020/05/19 Python
关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题
2020/11/24 Python
css3截图_动力节点Java学院整理
2017/07/11 HTML / CSS
阿根廷首家户外用品制造商和经销商:Montagne
2018/02/12 全球购物
毕业生个人求职的自我评价
2013/10/28 职场文书
工地质量标语
2014/06/12 职场文书
2014年乡镇民政工作总结
2014/12/02 职场文书
人事聘任通知
2015/04/21 职场文书
2015年女工委工作总结
2015/07/27 职场文书
Python中的 enumerate和zip详情
2022/05/30 Python
Spring中bean集合注入的方法详解
2022/07/07 Java/Android