首先给大家看看做好的效果图:

一、接下来我们说一下评分这个功能:

实际上就是一个简单的js,首先我们遍历出小星星,此时默认给的五星好评,在给他们一个点击事件,当点击时,我们获取到当前点击的是第几颗;代码如下:

var index = e.currentTarget.dataset.index; // 获取当前点击的是第几颗星星

接下来我们暂存星星的数组,获取星星数组的长度,代码如下:

var tempUserStars = this.data.userStars; // 暂存星星数组
var len = tempUserStars.length; // 获取星星数组的长度

下面就是最核心的地方了,判断显示的红心和分数:

1、循环星星数组的长度;

2、如果当前选中星星的index大于等于星星数组的长度,那么就是满分,让其星星数组的图片为红心,分数加1;

3、如果当前选中星星的index小于星星数组的长度,那么星星数组的图片为空心,给其重新赋值就可以了;

二、接下来是标签的功能:

每一个标签都是一个lable,在lable里做一个三目运算就可以,首先给一个false,当点击每一个lable时,让其变为true,类名变为所设置的颜色就OK了。

三、下面我们说说上传图片的功能:

图片上传的功能与我们的input里的上传功能相似,但是小程序给我们提供了一个便捷的方法------wx.chooseImage

给加号的图片一个点击事件,在事件里我们就可以用到这个方法了,那么它有哪些参数呢?小编给大家罗列出来:

count: 5 - pics.length, // 最多可以选择的图片张数,默认9
sizeType: ['original', 'compressed'], // original 原图,compressed 压缩图,默认二者都有
sourceType: ['album', 'camera'], // album 从相册选图,camera 使用相机,默认二者都有

下面有一个成功的回调函数,成功后把成功的图片定义一个变量放到data定义好的变量中,在this.setData中更新添加的图片就可以了,代码如下:
success: function (res) {
  var imgsrc = res.tempFilePaths;
  pics = pics.concat(imgsrc);
  console.log(pics);
  // console.log(imgsrc);
  that.setData({
    pics: pics,
    // console.log(pics),
  });
}
 
四、最后我们说说评论功能:
我们一般会限制评论文字的长度,首先我们获取输入框的内容,用parseInt获取文字长度,如果内容长度超出我们设定的长度,直接return,在this.setData中更新只显示的固定长度的文字,代码如下:
inputs: function (e) {
  // 获取输入框的内容
  var value = e.detail.value;
  // 获取输入框内容的长度
  var len = parseInt(value.length);
  //最多字数限制
  if (len > this.data.max)
    return;
  // 当输入框内容的长度大于最大长度限制(max)时,终止setData()的执行
  this.setData({
    currentWordNumber: len //当前字数
  });
}
 
最后给大家把完整代码写出:
HTML:
 <!--服务评价-->
<view class="service">
<!--评分-->
<view class='score'>
<view class='left'>
评分
</view>
<view class='right'>
<view bindtap="starTap" data-index="{{index}}" class="star" wx:for="{{userStars}}" wx:key="index">
<image src="{{item}}"></image>
</view>
<text class='rtxt'>{{wjxScore}}.0分</text>
</view>
</view>
<!--内容-->
<view class='content'>
<view class='left'>
内容
</view>
<view class='right'>
<text bindtap='label' class="{{attitude===true ? 'labelColor':''}}" data-index="{{attitude}}">小清新</text>
<text bindtap='label1' class="{{time===false? 'labelColor':''}}" data-index="{{time}}">文采好</text>
<text bindtap='label2' class="{{efficiency===false?'labelColor':''}}" data-index="{{efficiency}}">甜甜的</text>
<text bindtap='label3' class="{{environment===false?'labelColor':''}}" data-index="{{environment}}">值得收藏</text>
<text bindtap='label4' class="{{professional===false?'labelColor':''}}" data-index="{{professional}}">很文艺</text>
</view>
</view>
<!--图片-->
<view class='picture'>
<view class='left'>
图片
</view>
<view class='right'>
<view class="parcel" wx:for="{{pics}}" wx:key="{{index}}">
<image src="{{pics[index]}}" class="According" data-index="{{index}}" mode="aspectFill" bindtap="previewImg"></image>
</view>
<image src='../img/add.png' class='add' bindtap='choose'></image>
</view>
</view>
</view>
<!--textarea-->
<view class="conts">
<textarea class="areas" placeholder='更多评价请写在这里(最多300字)' minlength="{{min}}" maxlength="{{max}}" bindinput="inputs">
<!-- <text class="currentWordNumber">{{currentWordNumber|0}}/{{max}}</text> -->
</textarea>
</view>
<!--提交评价-->
<button class='btn' bindtap='handleBtn'>提交评价</button>

css:

 page {
width: 100%;
height: 100%;
background: #f0f0f0;
}
.service {
width: 100%;
overflow: hidden;
box-sizing: border-box;
padding: 0 20rpx;
background: #fff;
}
.score {
width: 100%;
height: 100rpx;
border-bottom: 1px solid #ccc;
}
.star {
float: left;
width: 54rpx;
height: 100rpx;
text-align: center;
line-height: 100rpx;
}
.star image{
width: 40rpx;
height: 40rpx;
margin-top: 30rpx;
}
.score .left {
width: 100rpx;
line-height: 100rpx;
font-size: 30rpx;
float: left;
}
.score .right {
width: 610rpx;
font-size: 30rpx;
float: left;
color: #888;
} .score .right .rtxt {
display: inline-block;
height: 100rpx;
line-height: 100rpx;
margin-left: 15rpx;
color: #c00;
font-weight: bold;
}
.labelColor {
color: #c00;
border: 1px solid #c00 !important;
}
.content {
width: 100%;
overflow: hidden;
border-bottom:1px solid #ccc;
padding:0 0 26rpx 0;
box-sizing: border-box;
}
.content .left {
width: 100rpx;
font-size: 30rpx;
float: left;
padding-top: 20rpx;
}
.content .right {
width: 610rpx;
font-size: 24rpx;
float: left;
color: #888;
}
.content .right text {
font-size: 24rpx;
padding: 13rpx 24rpx;
float: left;
border: 1px solid #888;
border-radius: 10rpx;
margin-right: 34rpx;
margin-top: 20rpx;
}
.picture {
width: 100%;
overflow: hidden;
background: #fff;
border-bottom: 1px solid #ccc;
}
.picture .left {
width: 100rpx;
font-size: 30rpx;
float: left;
padding-top: 20rpx;
}
.picture .right {
width: 610rpx;
font-size: 24rpx;
float: left;
color: #888;
box-sizing: border-box;
padding-top:36rpx;
}
.picture .right .add {
width: 120rpx;
height: 120rpx;
margin-right: 10rpx;
}
.According{
width:120rpx;
height:120rpx;
float:left;
margin-right:10rpx;
margin-bottom: 10rpx;
}
.parcel{
width:120rpx;
height:120rpx;
float:left;
margin-right:10rpx;
margin-bottom: 10rpx;
position: relative;
}
.deleteimg{
width:30rpx;
height:30rpx;
position: absolute;
right:;
top:;
z-index:;
}
.conts{
width: 100%;
height: auto;
background: #fff;
}
textarea {
width: 687rpx;
}
.areas{
height:315rpx;
font-size: 30rpx;
padding-top: 30rpx;
margin: 0 auto;
overflow: hidden;
position: relative;
}
.currentWordNumber{
font-size: 28rpx;
position: absolute;
left: 0%;
bottom: 0rpx;
color: #c00;
}
.hint{
font-size: 28rpx;
position: absolute;
top: 120rpx;
left: 30rpx;
color: #FF6600;
}
.btn {
width: 600rpx;
height: 80rpx;
line-height: 80rpx;
font-size: 30rpx;
color: #fff;
background: #c00;
position: fixed;
left:75rpx;
bottom: 37rpx;
}
button:after {
border:;
}

js:

 const app = getApp();
Page({
data: {
staticImg: app.globalData.staticImg,
current: 0,
attitude: true,
time: true,
efficiency: true,
environment: true,
professional: true,
code:1,
code1:2,
userStars: [
"../img/sx.png",
"../img/sx.png",
"../img/sx.png",
"../img/sx.png",
"../img/sx.png",
],
wjxScore: 5,
// textarea
min: 5,//最少字数
max: 300, //最多字数 (根据自己需求改变)
pics: [],
},
// 星星点击事件
starTap: function (e) {
var that = this;
var index = e.currentTarget.dataset.index; // 获取当前点击的是第几颗星星
var tempUserStars = this.data.userStars; // 暂存星星数组
var len = tempUserStars.length; // 获取星星数组的长度
for (var i = 0; i < len; i++) {
if (i <= index) { // 小于等于index的是满心
tempUserStars[i] = "../img/sx.png";
that.setData({
wjxScore: i + 1,
})
} else { // 其他是空心
tempUserStars[i] = "../img/kx.png"
}
}
// 重新赋值就可以显示了
that.setData({
userStars: tempUserStars
})
},
// 标签
label: function (e) {
console.log(e)
var that = this;
that.setData({
attitude: !e.currentTarget.dataset.index
})
},
label1: function (e) {
console.log(e)
var that = this;
that.setData({
time: !e.currentTarget.dataset.index
})
},
label2: function (e) {
console.log(e)
var that = this;
that.setData({
efficiency: !e.currentTarget.dataset.index
})
},
label3: function (e) {
console.log(e)
var that = this;
that.setData({
environment: !e.currentTarget.dataset.index
})
},
label4: function (e) {
console.log(e)
var that = this;
that.setData({
professional: !e.currentTarget.dataset.index
})
},
// 留言
//字数限制
inputs: function (e) {
// 获取输入框的内容
var value = e.detail.value;
// 获取输入框内容的长度
var len = parseInt(value.length);
//最多字数限制
if (len > this.data.max)
return;
// 当输入框内容的长度大于最大长度限制(max)时,终止setData()的执行
this.setData({
currentWordNumber: len //当前字数
});
},
// 图片
choose: function (e) {//这里是选取图片的方法
var that = this;
var pics = that.data.pics;
wx.chooseImage({
count: 5 - pics.length, // 最多可以选择的图片张数,默认9
sizeType: ['original', 'compressed'], // original 原图,compressed 压缩图,默认二者都有
sourceType: ['album', 'camera'], // album 从相册选图,camera 使用相机,默认二者都有
success: function (res) {
var imgsrc = res.tempFilePaths;
pics = pics.concat(imgsrc);
console.log(pics);
// console.log(imgsrc);
that.setData({
pics: pics,
// console.log(pics),
});
},
fail: function () {
// fail
},
complete: function () {
// complete
}
}) },
uploadimg: function () {//这里触发图片上传的方法
var pics = this.data.pics;
console.log(pics);
app.uploadimg({
url: 'https://........',//这里是你图片上传的接口
path: pics//这里是选取的图片的地址数组
});
},
onLoad: function (options) { },
// 删除图片
deleteImg: function (e) {
var pics = this.data.pics;
var index = e.currentTarget.dataset.index;
pics.splice(index, 1);
this.setData({
pics: pics
});
},
// 预览图片
previewImg: function (e) {
//获取当前图片的下标
var index = e.currentTarget.dataset.index;
//所有图片
var pics = this.data.pics;
wx.previewImage({
//当前显示图片
current: pics[index],
//所有图片
urls: pics
})
},
handleBtn(){
wx:if(this.data.code==1){
wx.showToast({
title: '评价成功',
icon: 'succes',
duration: 1500,
mask: true,
success:function(){
setTimeout(function(){
wx.reLaunch({
url: '../index/index'
})
},1500)
}
});
} else if (this.data.code1 == 2){
console.log("111")
wx.showToast({
title: '评价失败',
image: '../img/fail.png',
duration: 1500,
mask: true
})
}
}
})
这就是小编做的一个评论页面,如果有什么瑕疵,请大家在评论给我指出,谢谢大家!!!!
 

微信小程序之评分页面的更多相关文章

  1. 微信小程序动态评分展示/五角星展示/半颗星展示/自定义长度展示

    一.前言 项目中遇到的评分相关的需求其实还挺多.之前也写过网页中关于评分功能实现的文档.这次,是基于微信小程序开发而提炼出一个简单方便使用的方法,网页开发中同样可用.这次使用的还是字体,主要是字体这个 ...

  2. Java Web项目,Android和微信小程序的初始页面配置

    Java Web项目 我们在Eclipse里开了Java Web项目之后,Run As Tomcat或者Apache服务器,本地运行,如果直接用http://localhost:8080访问项目,会发 ...

  3. (十二)微信小程序实现登陆页面+登陆逻辑

    微信小程序实现登陆页面 实现上面两个页面 第一个页面 <view> <!-- 上侧部分 --> <view class="top-view"> ...

  4. 完整微信小程序授权登录页面教程

    完整微信小程序授权登录页面教程 1.前言 微信官方对getUserInfo接口做了修改,授权窗口无法直接弹出,而取而代之是需要创建一个button,将其open-type属性绑定getUseInfo方 ...

  5. 微信小程序之实现页面缩放式侧滑效果

    效果图: 实现原理:点击按钮,往需要动画的div中添加或移除拥有动画效果的class. 由于微信小程序中不能操作page这个根节点,所以,只有用一个div(view)来模仿page根节点. 1.结构 ...

  6. 微信小程序开发 [02] 页面注册和基本组件

    1.页面注册 既然我们希望跳转到新的页面,那自然要新建页面相关的文件才行.在开篇已经讲过,一个小程序页面由四个文件组成,假如我们的页面名为welcome,那么这四个文件则是: welcome.js w ...

  7. 微信小程序详解——页面之间的跳转方式【路由】和参数传递

    微信小程序拥有web网页和Application共同的特征,我们的页面都不是孤立存在的,而是通过和其他页面进行交互,来共同完成系统的功能.今天我们来研究小程序页面之间的跳转方式. 1.先导 在Andr ...

  8. 微信小程序从子页面退回父页面时的数据传递 wx.navigateBack()

    我们知道,在微信小程序中,从一个页面转到另一个页面,一般情况下可以通过navigate或redirect时候的url来携带参数,然后在目标页面的onLoad函数参数中获取这些url参数.例如: // ...

  9. 微信小程序(2)——新建页面

    在当前版本中,我们可以快速的新建并且新建页面. 在app.json文件中输入 { "pages":[ "pages/index/index" ] } 输入&qu ...

随机推荐

  1. 【题解】sweet

    题目描述 为了防止糖果被小猫偷吃,John把他的糖果放在了很多的高台上,一个高台可以认为是一段平行于X轴的线段,并且高台的y坐标都是大于0的,每个高台都有左端点和高台的长度,每个高台都有糖果.所有的高 ...

  2. 给Laravel4添加中文语系(转)

    Laravel 4 官方不附带英文以外的 validataion 错误信息翻译. 今天发现GitHub 上有一个 repository 收集不同的翻译,大家可以下载需要的翻译. GitHub项目地址: ...

  3. java入门之:Hello World

    import java.util.Scanner; public class HelloWorld{ public static void main(String[] args){ //向终端打印he ...

  4. Vue 单页应用 的 首屏优化

    对于单页应用,要在一个页面上为用户提供产品的所有功能,在这个页面加载的时候,首先要加载大量的静态资源,这个加载时间相对比较长.所以我们需要做一些相应的优化,减少响应时间,尽快把首屏显示出来. 1.压缩 ...

  5. vue provide/inject 父组件如何给孙子组件传值

    一般情况下我们父子组件之间的传值用的是props,这个就不多说了,但是如果想让父组件给子组件的组件传值怎么办呢,如果还用props的话肯能会比较复杂,这里我们就可以用到 provide 和 injec ...

  6. CXF异常:No operation was found with the name

    https://blog.csdn.net/qq_18675693/article/details/52134805 不同包下面,别忘了namespace最后要加“/”

  7. opensns功能详解

    <!DOCTYPE html> opensns功能详解 wmd-preview h1 { color: #0077bb; /* 将标题改为蓝色 */ } opensns功能详解 软件工程 ...

  8. 2018-8-10-win10-uwp-ping

    title author date CreateTime categories win10 uwp ping lindexi 2018-08-10 19:17:19 +0800 2018-2-13 1 ...

  9. svnadmin - Subversion 仓库管理工具

    SYNOPSIS 总览 svnadmin command /path/to/repos [options] [args] OVERVIEW 概述 Subversion 是一个版本控制系统,允许保存旧版 ...

  10. 小米手机 - Charles无法安装证书 因为无法读取证书

    1.不要使用小米原装的浏览器安装证书 2.使用第三方浏览器安装,如我使用的是UC浏览器 3.使用第三方浏览器安装的证书格式是".pem"格式问卷 4.将这个文件放入小米的downl ...