vue实现星级评价及上传多张图片等功能(类似淘宝商品评价页面)

最近在写一个关于vue的商城项目,然后集成在移动端中,开发需求中有一界面,类似淘宝商城评价界面!实现效果图如下所示:

 

评价页

 

点击看大图,且可左右滑动

功能需求分析

  1. 默认为5颗星,为非常满意,4颗满意,根据不同星级显示不同满意程度。
    2.评价内容,最多为200字。
    3.上传图片最多上传6张,图片不可拉伸,可删除,可点击放大左右滑动展示

具体实现关键代码

  1. 关于星级功能:
    写一个五星数组,默认数组中有亮的星级图片,用bool值判断是否变暗。

     

        默认星级数组

     

    点击实现的关键代码:

    // 评分
        rating: function (index, string) {
            var total = this.stars.length // 星星总数
            var idx = index + 1 // 这代表选的第idx颗星-也代表应该显示的星星数量
            // 进入if说明页面为初始状态
            if (this.scoreStartNum === 0) {
              this.scoreStartNum = idx
              for (var i = 0; i < idx; i++) {
                this.stars[i].src = starOnImg
                this.stars[i].active = true
              }
            } else {
              // 如果再次点击当前选中的星级-仅取消掉当前星级,保留之前的。
              if (idx == this.scoreStartNum) {
                for (var i = index; i < total; i++) {
                  if (i != 0) {
                    this.stars[i].src = starOffImg
                    this.stars[i].active = false
                  }
                }
              }
              // 如果小于当前最高星级,则直接保留当前星级
              if (idx < this.scoreStartNum) {
                for (var i = idx; i < this.scoreStartNum; i++) {
                  if (i != 0) {
                    this.stars[i].src = starOffImg
                    this.stars[i].active = false
                  }
                }
              }
              // 如果大于当前星级,则直接选到该星级
              if (idx > this.scoreStartNum) {
                for (var i = 0; i < idx; i++) {
                  this.stars[i].src = starOnImg
                  this.stars[i].active = true
                }
              }
    
              var count = 0 // 计数器-统计当前有几颗星
              for (var i = 0; i < total; i++) {
                if (this.stars[i].active) {
                  count++
                }
              }
              this.scoreStartNum = count
            }
            if (this.scoreStartNum === 1) {
              this.scoreInfo = '很差'
            } else if (this.scoreStartNum === 2) {
              this.scoreInfo = '差'
            } else if (this.scoreStartNum === 3) {
              this.scoreInfo = '一般'
            } else if (this.scoreStartNum === 4) {
              this.scoreInfo = '满意'
            } else if (this.scoreStartNum === 5) {
              this.scoreInfo = '很满意'
            }

     

  2. 评价内容输入
<textarea v-bind:maxlength="Surplus" @input="descArea" v-model="inputText" name="abstract" id="abstract" placeholder="宝贝满足你的期待吗?说说你的使用心得,分享给想买的他们吧!"></textarea>

Surplus 表示最大限制字数,v-model绑定输入字体,去掉边框可以设置:border: none;

  1. 上传多张图片功能

单独写了个uploadImages组件,用input来设置图片上传

<input type="file"  class="input-file" multiple="multiple" name="avatar" ref="avatarInput" @change="changeImage($event)" accept="image/gif,image/jpeg,image/jpg,image/png">

在@change="handleChange"拿到图片信息,有两种方式展示:

  1. 图片流形式展示图片
let reader = new FileReader()
          let that = this
          reader.readAsDataURL(file)
          reader.onload = function (e) {
            console.log(this.result)
            that.imgUrls.push(this.result)
          }

2.上传阿里云等第三方,直接拿到图片url路径,在此我用的第一种方式。
用mint-ui的录播图形式来做图片的左右滑动功能。

<mt-swipe :auto="0" :show-indicators="false" @change="handleChange" :continuous="false" :defaultIndex="num">
            <mt-swipe-item v-for="(item,index) in imgUrls" :key="item.id">
              <div class="num"  >{{index+1+'/'+imgUrls.length}}</div>
                <img :src="imgUrls[index]" class="img"/>
            </mt-swipe-item>
          </mt-swipe>

:auto="0"为不自动播放,:show-indicators="false"表示不展示下面的圆点,:defaultIndex="num"默认展示第几张图片,:continuous="false" 是否重复播放。

关键代码为:

methods: {
    //拿到图片信息转化为图片流
    changeImage: function (e) {
      if (e.target.files.length <= (this.maxImages - this.imgUrls.length)) {
        for (var i = 0; i < e.target.files.length; i++) {
          let file = e.target.files[i]
          this.file = file
          console.log(this.file)
          let reader = new FileReader()
          let that = this
          reader.readAsDataURL(file)
          reader.onload = function (e) {
            console.log(this.result)
            that.imgUrls.push(this.result)
          }
        }
        // 剩余张数
        this.leftImages = this.maxImages - (this.imgUrls.length + e.target.files.length)
        this.pictureNums = String(this.maxImages - (this.imgUrls.length + e.target.files.length)) + '/' + String(this.maxImages)
      } else {
        Toast('只能选择' + (this.maxImages - this.imgUrls.length) + '张了')
      }
    },
    //删除
    delect (index) {
      this.imgUrls.splice(index, 1)
      this.leftImages++
      console.log('数量' + this.leftImages)
      if (this.leftImages == this.maxImages) {
        this.pictureNums = '上传图片'
      } else {
        this.pictureNums = String(this.leftImages) + '/' + String(this.maxImages)
      }
    },
    //轮播图滑动改变index
    handleChange(index){
      this.num = index
    },
    //看大图
    bigImg (index) {
      this.showBigImg = true
      this.num = index
    }
  }

样式如下

<template>
    <div class="avatar">
      <!--展示图片-->
      <div class="hasPic" v-if="imgUrls.length>0" v-for="(item,index) in imgUrls">
        <img class="seledPic" ref="picture" :src="item?item:require('../../static/images/imagebj.jpg')" name="avatar" @click="bigImg(index)">
        <img class="delect" src="../../static/images/del.png" @click="delect(index)">
      </div>
      <!--点击方法图左右滑动-->
      <div class="imgMask" v-if="showBigImg" @click.stop="showBigImg=!showBigImg">
        <div class="showImg">
          <mt-swipe :auto="0" :show-indicators="false" @change="handleChange" :continuous="false" :defaultIndex="num">
            <mt-swipe-item v-for="(item,index) in imgUrls" :key="item.id">
              <div class="num"  >{{index+1+'/'+imgUrls.length}}</div>
                <img :src="imgUrls[index]" class="img"/>
            </mt-swipe-item>
          </mt-swipe>

        </div>
      </div>
      <!--默认图片-->
      <div class="selPic"  v-if="imgUrls.length<6">
        <img src="../../static/images/imagebj.jpg" name="avatar">
        <span>{{pictureNums}}</span>
        <input type="file"  class="input-file" multiple="multiple" name="avatar" ref="avatarInput" @change="changeImage($event)" accept="image/gif,image/jpeg,image/jpg,image/png">
      </div>
    </div>
  </template>

完整项目地址为:https://github.com/dt8888/publicComment

注意点:
1.项目中用到了mint -ui,转移项目中录播图代码时,会报错,在终端项目中输入:npm i mint-ui -S

  1. 用到了px和rem自动转化(https://blog.csdn.net/helloxiaoliang/article/details/79226058

  2. 如有疑问,请评论,有空定会回复

  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 基于Vue实现多条件筛选功能,可以通过以下步骤进行: 1. 数据渲染:首先,使用Vue框架将商品数据渲染到网页上,以展示商品信息。 2. 筛选条件定义:根据京东和等电商网站的筛选功能,我们可以通过定义多个筛选条件来满足用户的需求。例如,品牌、价格、颜色等。 3. 筛选条件组件化:将每个筛选条件封装成Vue组件,通过绑定数据和事件实现交互功能。例如,使用下拉菜单组件展示品牌选项,并绑定选中的品牌数据。 4. 筛选条件联动:根据用户选择的筛选条件,实现条件之间的联动效果。例如,如果用户选择了品牌A,则价格选项中只显示该品牌的价格范围。 5. 筛选功能实现:根据用户选择的筛选条件,通过过滤数据的方式实现商品的筛选功能。例如,使用Vue的计算属性或watch属性来监听筛选条件的变化,并根据变化动态过滤数据。 6. 筛选结果展示:将筛选后的商品数据重新渲染到网页上,实时展示给用户。可以使用Vue的v-for指令遍历筛选后的数据,将其展示为商品列表。 通过以上步骤,我们就可以基于Vue实现类似京东和的多条件筛选功能。用户可以根据自己的需求,选择不同的筛选条件,实时筛选出符合条件的商品,提高购物效率。同时,借助Vue的响应式特性,我们可以方便地实现筛选条件的联动效果,提供更好的用户体验。 ### 回答2: 基于Vue实现多条件筛选功能类似于京东和功能,可以通过以下步骤来实现: 1. 创建一个Vue组件,用于显示多条件筛选的界面。可以使用Vue的组件化开发方式,将整个筛选功能划分为多个子组件,包括筛选项组件、筛选条件组件以及结果展示组件等。 2. 在筛选项组件中,使用Vue的数据绑定功能,将筛选项的内容与组件的数据进行绑定。可以使用Vue的v-for指令来遍历筛选项的列表,并使用v-model指令将选择结果与组件数据进行双向绑定,以便在用户选择筛选项时及时更新数据。 3. 在筛选条件组件中,监听筛选项组件的数据变化。当筛选项的选择结果发生变化时,通过Vue的事件机制,将新的筛选条件递给结果展示组件。可以使用Vue的$emit方法触发自定义事件,并通过父组件接收事件并处理新的筛选条件。 4. 在结果展示组件中,根据接收到的筛选条件,使用Vue的计算属性或者watch属性来实时过滤数据,并在组件的模板中展示筛选后的结果。可以根据不同的筛选条件,使用条件语句进行数据过滤,或者使用Vue的filter过滤器来处理数据。 5. 最后,将多个组件组合在一起,构成一个完整的筛选功能界面。可以使用Vue的router来管理不同的筛选页面,并通过Vue的路由导航功能实现页面的切换和数据的递。 通过以上步骤,我们可以基于Vue实现一个类似于京东和的多条件筛选功能。用户可以根据自己的需求选择不同的筛选项,实时查看筛选后的结果,提高筛选效率和准确性。 ### 回答3: 基于Vue实现的多条件筛选功能是一种常见的电商平台或商品列表页面所具备的功能。这种功能能够让用户根据自己的需求选择多个条件来筛选商品,以便更快地找到自己想要的产品。 要实现这样的功能,首先需要在Vue中设置一个数据模型,用于存储用户选择的筛选条件以及根据条件过滤后的商品列表。可以使用一个数组来保存所有的商品数据,同时使用一个对象来存储当前用户选择的筛选条件。 接下来,需要在页面上展示可供用户选择的各个筛选条件。可以使用Vue的指令来生成相应的筛选项,并使用绑定指令将用户选择的条件存储到数据模型中。 为了实现多条件筛选功能,需要针对不同类型的筛选条件进行相应的处理。比如,对于品牌筛选,可以使用Vue的v-for指令生成各个品牌的复选框,并在用户选择时更新数据模型中的品牌条件。对于价格筛选,可以使用Vue的v-model指令绑定一个输入框,并在用户输入结束后更新数据模型中的价格条件。 最后,在数据模型中根据用户选择的筛选条件对所有商品进行过滤,生成符合条件的商品列表,并在页面上展示出来。 总的来说,基于Vue实现的多条件筛选功能需要设计一个数据模型来存储用户选择的筛选条件和过滤后的商品数据,同时根据不同的筛选条件使用Vue的指令和绑定来生成和更新页面上的筛选选项,最后根据用户选择的条件对商品数据进行过滤并展示出来。这样就可以实现一个类似京东和的多条件筛选功能

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值