Vue封装一个radio组件

我们知道,很多情况下我们会需要单选框,比如说首页导航,可能有[ home , events , messages ]等好几个选项,而我们往往只需要选定一个,每次选择的时候用点击事件控制路由即可,所以这个时候我们需要做一个组件,由于我是基于vue开发的,没有引入jq,主要是 因为我这是个小网站,引入jq有些大材小用了,所以我寻思得做一个vue组件来实现,说是用vue实现,其实大多都还是原生js的代码,下面放代码

<template>
    <div class="collapse navbar-collapse">
        <ul class="radio-button navbar-nav mr-auto" ref="self">
            <slot></slot>
        </ul>
    </div>
</template>

<script>
    export default {
        name: "RadioButton",
        data(){
            return {
                currentNode : null,
            }
        },
        props : {
            defaultValue : String
        },
        methods : {
            init(){
                let slotDom = this.$slots.default;
                let n = 0;
                for(let i in slotDom){
                    let node = slotDom[i].children[0].elm.parentElement;
                    if(n.toString() === this.defaultValue){
                        node.className += 'nav-link nav-item clickable active';
                        this.currentNode = node;
                    }
                    else
                        node.className += 'nav-link nav-item clickable';
                    n++;
                    node.addEventListener('click',(ev) => {
                        if(this.currentNode === ev.srcElement || !this.currentNode){
                            return;
                        }
                        this.currentNode.classList.remove('active');
                        ev.srcElement.classList.add('active');
                        this.currentNode = node;
                    });
                }
            }
        },
        mounted() {
            setTimeout(this.init);
        }
    }
</script>

<style scoped>

</style>

我们使用了vue的slot机制,mount的时候初始化所有槽,给其加上单选框子选项的属性

let n = 0;
if(n.toString() === this.defaultValue){
                        node.className += 'nav-link nav-item clickable active';
                        this.currentNode = node;
                    }
                    else
                        node.className += 'nav-link nav-item clickable';
                    n++;

其中n和defaultValue是用来添加默认选项的属性的,给默认值添上一个active的属性
然后给这个dom对象添加上一个监听器,用来处理单选

node.addEventListener('click',(ev) => {
                        if(this.currentNode === ev.srcElement || !this.currentNode){
                            return;
                        }
                        this.currentNode.classList.remove('active');
                        ev.srcElement.classList.add('active');
                        this.currentNode = node;
                    });

如果当前被选中的选项等于我们点击的选项或者我们当前没有选中(也就是没有默认值,算作错误)就直接return,然后给我们要选的选项的classList中添加active值,再移除当前选中选项的active值,最后更换当前选中选项即可

很简单的一个操作,可是一开始我却弄了很久,最后得到这个目前最可行的方案

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 5,196评论 0 29
  • vue概述 在官方文档中,有一句话对Vue的定位说的很明确:Vue.js 的核心是一个允许采用简洁的模板语法来声明...
    li4065阅读 7,638评论 0 25
  • 主要还是自己看的,所有内容来自官方文档。 介绍 Vue.js 是什么 Vue (读音 /vjuː/,类似于 vie...
    Leonzai阅读 3,572评论 0 25
  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 10,847评论 0 13
  • 1. Vue 实例 1.1 创建一个Vue实例 一个 Vue 应用由一个通过 new Vue 创建的根 Vue 实...
    王童孟阅读 1,112评论 0 2

友情链接更多精彩内容