JavaScript创建标签式组件

我们本篇将实现下面的这个标签式组件
我们本篇将实现下面的这个标签式组件
在这里插入图片描述

● 当然我们首先将我们需要的元素存储到变量中,方便后面使用

const tabs = document.querySelectorAll('.operations__tab'); //获取所有的button
const tabsContainer = document.querySelector('.operations__tab-container'); //获取所有button元素的父元素
const tabsContent = document.querySelectorAll('.operations__content');//获取所有的内容的类

● 接着我们需要通过点击事件来获取我们点击的那个button的信息

tabsContainer.addEventListener('click', function (e) {
  const clicked = e.target.closest('.operations__tab');
});
//利用事件委托机制在DOM中找到最近的具有类名为 'operations__tab' 的祖先元素

● 接着我们通过条件保护来设定,当我们获取的元素为null时候,直接返回不执行后面的代码

if (!clicked) return;

● 接着我们要移除所有的活跃样式,这些活跃样式大家看一下之前的html和css代码

//移除活跃元素
tabs.forEach(t => t.classList.remove('operations__tab--active'));//点击按钮会有一个向上的移动,移除它,不会下一次点击不会重置
tabsContent.forEach(c => c.classList.remove('operations__content--active'));//去除内容元素,只有存在这个class才会被显示,点击之后,之前点击出现过的元素会被移除

● 接下来就是我们点击哪个按钮,就给哪个按钮创建活跃样式

//激活按钮样式
clicked.classList.add('operations__tab--active');

● 接着就是激活内容

//激活内容区域
document
  .querySelector(`.operations__content--${clicked.dataset.tab}`)
  .classList.add('operations__content--active');

注:clicked.dataset.tab是为了获取class中的data数据

在这里插入图片描述

完整代码如下:

//标签式组件
const tabs = document.querySelectorAll('.operations__tab');
const tabsContainer = document.querySelector('.operations__tab-container');
const tabsContent = document.querySelectorAll('.operations__content');

tabsContainer.addEventListener('click', function (e) {
  const clicked = e.target.closest('.operations__tab');

  //条件保护
  if (!clicked) return;

  //移除活跃元素
  tabs.forEach(t => t.classList.remove('operations__tab--active'));
  tabsContent.forEach(c => c.classList.remove('operations__content--active'));

  //激活按钮样式
  clicked.classList.add('operations__tab--active');

  //激活内容区域
  document
    .querySelector(`.operations__content--${clicked.dataset.tab}`)
    .classList.add('operations__content--active');
});
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue.js是一款流行的JavaScript框架,它提供了非常方便的组件开发。要开发一个标签组件,你可以先创建一个Tab组件,然后在Tab组件中使用TabItem子组件。 以下是一个简单的Vue.js标签组件代码示例: ``` <template> <div class="tab"> <div class="tab-nav"> <div v-for="(item, index) in tabs" :key="index" class="tab-nav-item" @click="selectTab(index)"> {{ item.title }} </div> </div> <div class="tab-content"> <slot /> </div> </div> </template> <script> export default { name: "Tab", props: { activeIndex: { type: Number, default: 0 } }, data() { return { tabs: [] }; }, mounted() { this.tabs = this.$children.map((component) => { return { title: component.$props.title }; }); }, methods: { selectTab(index) { this.$emit("update:activeIndex", index); } } }; </script> ``` 这个Tab组件有一个`tabs`数组,用于存储每个标签页的标题。组件在mounted生命周期钩子中遍历所有的子组件,获取它们的标题并添加到`tabs`数组中。`selectTab`方法用于选中标签页,并通过`update:activeIndex`事件向父组件发送选中的标签页索引。 接下来,你可以编写一个TabItem子组件来作为标签页内容的容器,代码示例如下: ``` <template> <div v-show="isActive" class="tab-content-item"> <slot /> </div> </template> <script> export default { name: "TabItem", props: { title: { type: String, required: true }, activeIndex: { type: Number, default: 0 } }, computed: { isActive() { return this.activeIndex === this.index; }, index() { return this.$parent.$children.indexOf(this); } } }; </script> ``` 这个TabItem子组件有一个`title`属性用于显示标签页标题,还有一个`isActive`计算属性用于判断当前标签页是否处于激活状态。在computed属性中,`index`计算属性获取当前子组件在父组件中的索引。 最后,你可以在父组件中使用Tab和TabItem组件来实现标签页功能: ``` <template> <div> <Tab :active-index.sync="activeIndex"> <TabItem title="标签1">标签1内容</TabItem> <TabItem title="标签2">标签2内容</TabItem> <TabItem title="标签3">标签3内容</TabItem> </Tab> </div> </template> <script> import Tab from "./Tab.vue"; import TabItem from "./TabItem.vue"; export default { name: "App", components: { Tab, TabItem }, data() { return { activeIndex: 0 }; } }; </script> ``` 这个父组件中包含一个Tab和三个TabItem子组件,使用`:active-index.sync`属性将父组件中的`activeIndex`属性同步到子组件中,从而实现标签页切换效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值