如何封装星星组件?

本文介绍了如何使用Vue.js封装一个星星评分组件,组件包含可点击和只读两种模式,支持父子组件双向数据绑定。组件内部通过v-for指令和条件渲染实现了满星、半星和空星的展示,并通过@input事件监听用户选择的星星数量,更新父组件的评分值。
摘要由CSDN通过智能技术生成

如何封装星星组件?

子组件

<template>
  <div class="lcjbox">
    <!-- 用于父子组件双向数据绑定 -->
    <input type="hidden" v-model="value" />
    <!-- 不可点击的星星 -->
    <div v-if="readonly">
      <!-- 满星 -->
      <img :src="full" v-for="i in parseInt(value)" :key="i" />
      <!-- 半星 -->
      <img :src="half" v-if="value.toString().indexOf('.') > 0" />
      <!-- 灰色星 -->
      <img
        :src="empty"
        v-for="i in parseInt(number - value)"
        :key="i * number + 1"
      />
    </div>
    <!-- 可以点击的星星 -->
    <div v-if="!readonly">
      <!-- 满星 -->
      <img :src="full" v-for="i in num" :key="i" @click="num = i" />
      <!-- 灰色星 -->
      <img
        :src="empty"
        v-for="i in parseInt(number - num)"
        :key="i * number"
        @click="num += i"
      />
    </div>
  </div>
</template>

js

<script>
export default {
  props: {
    // 分值
    value: {
      type: Number,
      default: 0
    },
    // 接收过来的数量
    number: {
      type: Number,
      default: 0
    },
    // 只读,表示可以点击还是不可以点击
    readonly: {
      type: Boolean,
      default: false
    }
  }, // 组件参数 接收来自父组件的数据
  data() {
    return {
      //模拟数据
      num: 0,
      // 满星
      full:
        "https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1714150507,3894444964&fm=26&gp=0.jpg",
      // 没星
      empty:
        "https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3012680728,849664980&fm=26&gp=0.jpg",
      // 半星
      half:
        "https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=3837197790,4152490133&fm=15&gp=0.jpg"
    };
  },
  created() {
    //创建后
  },
  components: {}, // 局部注册的组件
  mounted() {
    //加载后
  },
  watch: {
    num() {
      // 在可以点击的状态下,双向绑定的分值改变
      this.$emit("input", this.num);
    }
  }, // 负责监听
  computed: {}, // 计算属性
  methods: {
    //方法集合
  }
};
</script>

style样式

<style scoped lang="scss">
.lcjbox img{
  width: 24px;
  height: 24px;
  margin: 0 2px;
}
</style>

在使用的组件中直接调用

html

<template>
  <div>
    <span>评分</span>
    <!-- 可点击 -->
    <Star v-model="value" :number="10" @input="ipt"> </Star>
    <!-- 不可点击 -->
    <!-- <Star v-model="value" :number="10" readonly> </Star> -->
  </div>
</template>

js

<script>
import Star from "../components/Star";
export default {
  props: {}, // 组件参数 接收来自父组件的数据
  data() {
    return {
      //模拟数据
      value:4.5
    };
  },
  created() {
    //创建后
  },
  components: {
    Star
    }, // 局部注册的组件
  mounted() {
    //加载后
  },
  watch: {}, // 负责监听
  computed: {}, // 计算属性
  methods: {
    //方法集合
    // 点击过多少星,返回过来,这里可以请求后台接口
    ipt(num){
      console.log(num)
      console.log("点击了"+num+'颗星星')
    }
  }
};
</script>

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值