vue3手动封装一个点击切换下滑线,事件委托,实现简易选项卡

点击切换下滑线

看看效果
 

body主要代码:

把点击事件绑定到父元素身上,因为把每个li都绑定一个事件工作量太大了,也不显示;所以利用事件委托

<ul @click="disPlay">

          <li class="wy">网页端</li>

          <li class="sji">手机端</li>

        </ul>

前端性能优化:在JavaScript中,添加到页面上的事件处理程序数量将直接关系到页面的整体运行性能,因为需要不断的与dom节点进行交互,访问dom的次数越多,引起浏览器重绘与重排的次数也就越多,就会延长整个页面的交互就绪时间,这就是为什么性能优化的主要思想之一就是减少DOM操作的原因;如果要用事件委托,就会将所有的操作放到js程序里面,与dom的操作就只需要交互一次,这样就能大大的减少与dom的交互次数,提高性能

事件委托的原理:事件委托是利用事件的冒泡原理来实现的,何为事件冒泡呢?就是事件从最深的节点开始,然后逐步向上传播事件,举个例子:页面上有这么一个节点树,div>ul>li>a;比如给最里面的a加一个click点击事件,那么这个事件就会一层一层的往外执行,执行顺序a>li>ul>div,有这样一个机制,那么我们给最外面的div加点击事件,那么里面的ul,li,a做点击事件的时候,都会冒泡到最外层的div上,所以都会触发,这就是事件委托,委托它们父级代为执行事件。

在js中的代码:

封装了一个函数

//  简易版,并不是最优方法,封装了一个disPlay的函数,通过e来获取事件

const disPlay=(e)=>{

// e.target.parentNode拿到父元素

// e.target.parentNode.children拿到了两个子元素

    console.log(e.target.parentNode.children);

    if(e.target.innerText=="网页端"){  // 利用li标签中的文字来进行判断

        e.target.parentNode.children[1].style.borderBottom='0'  其他子元素设置为空

        e.target.style.borderBottom='3px solid rgb(241, 112, 53)'  给当前点击的元素设置样式

    }else{

        if(e.target.innerText=="手机端"){

            e.target.parentNode.children[0].style.borderBottom='0'

        e.target.style.borderBottom='3px solid rgb(241, 112, 53)'

    }

    }

}

改进版本

const disPlay=(e)=>{

    let node=e.target.parentNode.children

    for(let i=0;i<node.length;i++)

    node[i].style.borderBottom='0';

    // 不能是父元素,如果是父元素的话会有一条长的横线

    if(e.target.className=='ull'){

        e.target.style.borderBottom='0'

    }else{

         e.target.style.borderBottom='3px solid rgb(241, 112, 53)'

    }

}

在此基础上我们可以做一个简易的选项卡切换

看看效果

body代码

<div class="xuanxiang" @click="disPlay">
           <!-- 选项卡 -->
           <div>买房<div class="mf">买房呀</div></div>
           <div>卖房<div class="maif">卖房呀</div></div>
        </div>

js代码

// 选项卡
const disPlay=(e)=>{
  let nodes = e.target?.parentNode.children;
  for (let i = 0;i<nodes.length; i++){
    nodes[i].children[0].style.display= 'none'
  }
    e.target.children[0].style.display='block'
    console.log(2,e.target.children[0]);
}

css代码

 .maif{
          display: none;
        }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,这是一个使用 Vue 封装选项卡组件的示例代码: ``` <template> <div class="tabs"> <ul class="tabs-header"> <li v-for="(tab, index) in tabs" :key="index" @click="activeTab(index)" :class="{ active: index === activeIndex }">{{ tab.label }}</li> </ul> <div class="tabs-body"> <slot :tab="tabs[activeIndex]"></slot> </div> </div> </template> <script> export default { data() { return { tabs: [], activeIndex: 0 }; }, mounted() { this.tabs = this.$slots.default .filter(vnode => vnode.tag) .map(vnode => ({ label: vnode.data.attrs.label, content: vnode })); }, methods: { activeTab(index) { this.activeIndex = index; } } }; </script> <style scoped> .tabs { display: flex; flex-direction: column; } .tabs-header { display: flex; list-style: none; margin: 0; padding: 0; border-bottom: 1px solid #ccc; } .tabs-header li { flex-grow: 1; text-align: center; padding: 10px; cursor: pointer; } .tabs-header .active { color: red; border-bottom: 2px solid red; } .tabs-body { padding: 20px; } </style> ``` 使用方法: ``` <template> <tabs> <template v-slot:default="{ tab }"> <div v-html="tab.content.children[0].text"></div> </template> <div label="选项卡 1">选项卡 1 内容</div> <div label="选项卡 2">选项卡 2 内容</div> <div label="选项卡 3">选项卡 3 内容</div> </tabs> </template> <script> import Tabs from "./Tabs.vue"; export default { components: { Tabs } }; </script> ``` 该代码仅作为参考,您可以根据需要进行修改和扩展。 ### 回答2: 当然可以帮你封装一个基于Vue选项卡组件。首先,我们可以创建一个Tabs组件,然后在该组件内部创建一个Tab组件来表示每个选项卡。 在Tabs组件中,我们可以使用props来接收选项卡的数据,例如选项卡的标题和内容。然后,我们可以使用v-for指令来遍历这些选项卡,并为每个选项卡创建一个Tab组件。在Tab组件中,我们可以使用插槽来显示选项卡的标题和内容。 下面是一个示例代码: ```html <template> <div class="tabs"> <div class="tab-titles"> <div v-for="(tab, index) in tabs" :key="index" :class="{ active: activeTab === index }" @click="activeTab = index" > {{ tab.title }} </div> </div> <div class="tab-content"> <slot :name="tabs[activeTab].title"></slot> </div> </div> </template> <script> export default { data() { return { activeTab: 0 }; }, props: { tabs: { type: Array, required: true } } }; </script> <style> .tab-titles { display: flex; } .tab-titles > div { padding: 10px; cursor: pointer; } .tab-titles > div.active { background-color: lightgray; } .tab-content { padding: 10px; } </style> ``` 使用该组件时,只需传入一个包含选项卡数据的数组即可。例如: ```html <template> <div> <tabs :tabs="tabs"> <template v-for="tab in tabs" :slot="tab.title"> {{ tab.content }} </template> </tabs> </div> </template> <script> import Tabs from './Tabs.vue'; export default { components: { Tabs }, data() { return { tabs: [ { title: '选项卡1', content: '选项卡1的内容' }, { title: '选项卡2', content: '选项卡2的内容' }, { title: '选项卡3', content: '选项卡3的内容' } ] }; } }; </script> ``` 这样,一个简单的选项卡组件就封装完成了。你可以根据需要自定义样式和添加其他功能。希望能对你有所帮助! ### 回答3: vue一个用于构建用户界面的JavaScript框架,可以帮助开发人员快速构建交互性的Web应用程序。下面是一个简单的示例来封装一个选项卡组件: 首先,在Vue的项目中,创建一个名为"Tab"的组件。在组件中,我们需要定义一个选项卡头部,以及与每个选项卡对应的内容。具体实现如下: ```vue <template> <div> <div class="tab-header"> <div v-for="(item, index) in tabs" :key="index" @click="changeTab(index)" :class="{'active': activeTab === index}" > {{ item.title }} </div> </div> <div class="tab-content"> <div v-for="(item, index) in tabs" :key="index" v-show="activeTab === index"> {{ item.content }} </div> </div> </div> </template> <script> export default { data() { return { activeTab: 0, tabs: [ { title: '选项卡1', content: '内容1' }, { title: '选项卡2', content: '内容2' }, { title: '选项卡3', content: '内容3' }, ], }; }, methods: { changeTab(index) { this.activeTab = index; }, }, }; </script> <style scoped> .tab-header { display: flex; } .tab-header div { padding: 10px; cursor: pointer; } .tab-header .active { font-weight: bold; } .tab-content div { display: none; } .tab-content div.show { display: block; } </style> ``` 在上面的代码中,我们定义了一个包含选项卡标题和内容的数据数组,使用`v-for`指令在模板中动态渲染选项卡头部和内容,并通过`@click`绑定`changeTab`方法来切换选项卡的显示。通过控制`activeTab`的值来切换选项卡的显示与隐藏,这里使用了`v-show`指令来实现。 最后,我们可以在需要使用选项卡的地方引用这个组件: ```vue <template> <div> <tab></tab> </div> </template> <script> import Tab from './Tab' export default { components: { Tab } } </script> ``` 以上就是一个简单的用Vue封装选项卡组件的实现,可以根据实际需求进行相应的样式、数据和交互的定制和调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值