vue中简单的中英文切换组件

这个博客展示了如何使用Vue.js创建一个带有自定义指令的下拉列表组件。内容包括组件结构、事件处理、样式设计以及如何根据鼠标悬停和点击事件改变列表显示。此外,还详细说明了如何通过props传递数据并监听外部事件。

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

<template>
  <div class="zq-drop-list" @mouseover="onDplOver($event)" @mouseout="onDplOut($event)">
    <span><i class="iconfont icon-yuyanqiehuan"></i></span>
    <ul v-dpl ref="ul_cont">
      <li v-for="(item, index) in dataList" :key="index" @click="onLiClick(index, $event)">{{ item[labelProperty] }}</li>
    </ul>
  </div>
</template>

<script>
export default {
  name: "DropDownList",
  data() {
    return {
      activeIndex: 0,
    };
  },
  props: {
    dataList: {
      type: Array,
      default() {
        return [
          {
            name: "zh",
            text: "中文",
          },
          {
            name: "en",
            text: "English",
          },
        ];
      },
    },
    labelProperty: {
      type: String,
      default() {
        return "text";
      },
    },
  },
  directives: {
    // 自定义组件,先让内容隐藏
    dpl: {
      bind(el) {
        el.style.display = "none";
      },
    },
  },
  methods: {
    onDplOver(event) {
      // let ul = event.currentTarget.childNodes[1];

      this.$refs.ul_cont.style.display = "block";
    },
    onDplOut(event) {
      // let ul = event.currentTarget.childNodes[1];
      this.$refs.ul_cont.style.display = "none";
    },
    onLiClick(index) {
      console.log(event);
      let path = event.path || (event.composedPath && event.composedPath()); //兼容火狐和safari
      path[1].style.display = "none";
      this.activeIndex = index;
      this.app.$emit("changed", {
        // index: index,
        // value: this.dataList[index].name,
        name: this.dplLable,
      });
    },
  },
  computed: {
    dplLable() {
      return this.dataList[this.activeIndex];
    },
  },
  mounted() {},
};
</script>

<style lang="scss">
.zq-drop-list {
  display: inline-block;
  // min-width: 100px;
  position: relative;
  span {
    display: block;
    font-size: 14px;
    text-align: center;
    // color: #333333;
    border-radius: 4px;
    color: #fff;
    margin-right: 10px;
    i {
      // background: url(https://www.easyicon.net/api/resizeApi.php?id=1189852&size=16) no-repeat center center;
      margin-left: 6px;
      display: inline-block;
    }
  }
  ul {
    position: absolute;
    top: 30px;
    left: 0;
    width: 100px;
    margin: 0;
    padding: 0;
    border: solid 1px #f1f1f1;
    border-radius: 4px;
    overflow: hidden;
    li {
      list-style: none;
      height: 30px;
      line-height: 30px;
      font-size: 14px;
      border-bottom: solid 1px #f1f1f1;
      background: #ffffff;
      color: #000;
      padding-left: 10px;
    }
    li:last-child {
      border-bottom: none;
    }
    li:hover {
      background: #f6f6f6;
    }
  }
}
</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值