Vue组件(一):评分、搜索、菜单、轮播、分页等

本文介绍了如何在Vue中创建组件,包括评分、搜索、菜单、轮播和分页组件。通过实例展示了组件化的优势,如避免代码重复,提高代码复用率。详细讲解了各个组件的实现过程,如评分组件的鼠标交互逻辑,搜索组件的v-model绑定,菜单组件的内容切换,轮播组件的自动切换与手动控制,以及分页组件的数据切割和页码控制。并强调了v-model在简化组件内外数据传递中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Vue组件

在做项目的时候经常会写功能一样,只是写入的数据不一样的元素,为了避免重复书写,会将这些元素做成组件,例如菜单、分页、轮播图等。
由于目前还是用的是VScode软件,写组件的模板没有提示,需要手动书写,所以对于刚刚尝试写组件的新手,可以现在html文件中先写出组件的元素以及需要实现的功能。

评分组件

以评分作为例子:
做评分组件的几个元素:
1、总分有几颗星?
2、初始时有没有默认星?
3、怎么实现鼠标往后移动的时候星星被点亮,向前移开的时候星星不亮。鼠标离开评分,恢复默认值
4、鼠标点击的时候,实现评分,鼠标移开后分数不变

首先写出html文件,星星图案是iconfont,对星星设置颜色,星星图案分为,实心和空心的

 <link rel="stylesheet" href="https://at.alicdn.com/t/font_1743185_37l8tzue6bb.css">
<style>
    [v-cloak] {
   
        display: none;
    }
    .star{
   
        font-size: 30px;
        color: red;
    }
</style>

首先通过v-for循环,设置总分,count在js中传入,为了实现鼠标离开恢复默认星数,这时候引入一个临时变量tempScore,鼠标移动时将数据赋值给这个变量,真正实现评分的变量时score。初始化时tempScore和score值一样,当移动时经过判断给予亮星。
count为数字,item为1-10数据

 <div id="app" v-cloak>
    <i v-for='item in count' class="iconfont star " 
     @mouseenter='tempScore=item'
     @mouseleave='tempScore=score'
     @click='score=item'
     :class="item<=tempScore?'iconstar1':'iconstar'"></i>
 </div>

JS文件

<script>
   new Vue({
   
        el: '#app',
        data() {
   
            return {
   
                count:10,//总分时星星的个数
                score:1,//实际改变亮星
                tempScore:1,//临时储存亮星
            }
        },
    })
</script>

此时一个评分功能实现成功,如果有好几个评分,此时需要对html文件中的内容复制几遍,在js中得多设置几个变量,这样子js会多出很多变量,不简洁,此时需要将评分做成组件。
首先将原先的html部分的内容写入template模板中,但是由于内部不能直接调用外部变量,需要在组件内部,设置自己的变量,对自己内部变量进行赋值,再将数据传出去。
对于需要从外部传入的数据写入props中。

 <div id="app" v-cloak>
   <p> 客服态度:{
   {
   kefu}}分,物流速度{
   {
   wuliu}}分,快递质量{
   {
   kuaidi}}</p>
    <star label='客服态度' :count='10' :score='4' @change='setkefu'></star>
    <star label='物流速度' :count='5' :score='2' color='yellow' @change='setwuliu'></star>
    <star label='快递质量' :count='10' :score='3' color='green' @change='setkuaidi'></star>

</div>
<script>
    Vue.component('star', {
   
        props: ['label','count','score','color'],//传输参数
        template: `
        <div>
            <span> {
    {label}}</span> <i v-for='item in count' :style="{color:color}" 
            class="iconfont star " 
            @click='sj_score=item'
            @mouseenter='tempScore=item'
            @mouseleave='tempScore=sj_score'
            :class="item<=tempScore?'iconstar1':'iconstar'"></i>
        </div>`,
        data() {
   
            return {
   
                tempScore:this.score,
                sj_score:this.score,
            }
        },
        watch: {
   
            sj_score(val){
   //对实现评分的变量进行监听
                this.$emit('change',val)
                //子组件通过$emit触发父组件的自定义事件,将变量传出给父组件
            }
        },

    }
    new Vue({
   
        el: '#app',
        data() {
   
            return {
   
                kefu:0,
                wuliu:0,
                kuaidi:0,
            }
        },
        methods: {
   //在父组件中将得到的值载赋值给每一个组件中实现评分的变量。
            setkefu(score){
   
                this.kefu=score
                console.log('客服态度:'+this.kefu);
            },
            setwuliu(score){
   
                this.wuliu=score
                console.log('物流速度:'+this.wuliu);
            },
            setkuaidi (score){
   
                this.kuaidi=score
                console.log('快递质量:'+this.kuaidi );
            }
        },
    })
</script>

但是对组件都需要设置事件才能获取到数据,js代码中有不少重复,此时可以用v-model来简化代码,v-model的使用是利用input标签的value和input事件来实现的。
可以对上述的代码进行简化:对进行评分的变量进行双向绑定

 <div id="app" v-cloak>
   <p> 客服态度:{
   </
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值