1. 程式人生 > 實用技巧 >【前端】H5 + 微信小程式實現評價星級

【前端】H5 + 微信小程式實現評價星級

評價星星的邏輯是先用五個未填充的星星顯示在介面上,然後當用戶點選到某一個星星,比如點選了第三個星星,則將前三個星星迴圈用有填充的星星替代,這樣便感覺是選中了三個星星一樣。

<view class='score'>
	<view class='score-left'>
		<view class="score-text">
			<text >評分:</text>
			<block v-for="(star,index) in stars">
				<img class="star-image" v-bind:src="star.src" v-on:click="rating(index)" alt="星星圖片" />
			</block>
			<label style="color: #ff0000;">{{judgeText}}</label>
		</view>
	</view>
</view>

這是頁面上控制元件,這裡主要的是使用迴圈來展示5個星星,根據star.src改變星星的樣式
巨集定義星星圖片的路徑(注意是路徑)。

var starOffImg = "未填充的星星";
var starOnImg = "填充的星星";
在data()定義stars和judgeText

stars: [
	  {
		  src: starOffImg,
	  }, {
		  src: starOffImg,
	  }, {
		  src: starOffImg,
	  }, {
		  src: starOffImg,
	  }, {
		  src: starOffImg,
	  },
  ]
judgeText:'', // 星級評價旁的文字顯示

當點選事件發生時,程式會獲取使用者點選的第幾個星星(index),然後傳遞給rating。

這裡的程式碼要分為幾個部分,首先是第一次進入本頁面,此時星星應該是為0的

if(this.starNum == 0) {
	this.starNum = idx;
	for(var i = 0; i < idx; i++) {
			this.stars[i].src = starOnImg;
	}
} 

當用戶進行選擇後,idx變為使用者選擇的星星數量,利用迴圈,將選中的星星改為填充的圖片。

如果使用者已經進行了選擇,現在想修改星級,那有三種情況:

  1. 點選了比當前星級高的星星(之前選中了4個,現在想選中5個)星星應該更改為星級高的的數量;
  2. 點選了比當前星級低的星星,星星應該更改為星星低的數量(廢話?);
  3. 點選了和當前一樣的星級,這裡的邏輯是將當前的星級減一。
    程式碼對星級的更改和上面解釋的一樣。

對judgeText進行賦值操作:

if(index < 2){
	this.judgeText = '很差'
}else if(index == 2){
	this.judgeText = '一般'
}else if(index > 2 && index < 4){
	this.judgeText = '不錯'
}else if(index == 4){
	this.judgeText = '非常好'
 }

最後貼上rating的完整程式碼
點選星星的事件:

 //點選星星
	rating: function(index) {
	   var total = this.stars.length; //星星總數
	   var idx = index + 1; //這代表選的第idx顆星-也代表應該顯示的星星數量
	   let _this = this
	   if(index < 2){
			this.judgeText = '很差'
			_this.evaluate = 2
	   }else if(index == 2){
			this.judgeText = '一般'
			_this.evaluate = 1
	   }else if(index > 2 && index < 4){
			this.judgeText = '不錯'
			_this.evaluate = 0
	   }else if(index == 4){
			this.judgeText = '非常好'
			_this.evaluate = 0
	   }
	   //進入if說明頁面為初始狀態
	   if(this.starNum == 0) {
		   this.starNum = idx;
		   for(var i = 0; i < idx; i++) {
			   this.stars[i].src = starOnImg;
		    }
	    } else {
		   //如果再次點選當前選中的星級-僅取消掉當前星級,保留之前的。
		   if(idx == this.starNum) {
			   for(var i = index; i < total; i++) {
				   this.stars[i].src = starOffImg;
			   }
			   if(index == 0){
				   _this.judgeText = ''
			   }else if(index == 2 || index == 1){
					_this.judgeText = '很差'
					_this.evaluate = 2
			   }else if(index == 3){
					_this.judgeText = '一般'
					_this.evaluate = 1
			   }else if(index == 4){
			   		_this.judgeText = '不錯'
					_this.evaluate = 0
			   }else if(index == 5){
			   		_this.judgeText = '非常好'  
					_this.evaluate = 0
			   }
		   }
		   //如果小於當前最高星級,則直接保留當前星級
		   if(idx < this.starNum) {
			   for(var i = idx; i < this.starNum; i++) {
				   this.stars[i].src = starOffImg;
			    }
		    }
		   //如果大於當前星級,則直接選到該星級
		   if(idx > this.starNum) {
			   for(var i = 0; i < idx; i++) {
				   this.stars[i].src = starOnImg;
			    }
		    }

		    var count = 0; //計數器-統計當前有幾顆星
		    for(var i = 0; i < total; i++) {
			    if(this.stars[i].active) {
				    count++;
			    }
		    }
			this.starNum = count;
	    }
    },