element-vue tabs标签页使用,前后两个三角标

这篇博客介绍了如何使用Vue的El-Tabs组件实现自定义样式,包括消除原始样式的文字边框、居中显示和三角标记的控制。同时,展示了如何利用before-leave事件和v-model来管理当前激活的tab,并通过tab-click事件进行交互,以及在父组件间传递数据的方法。

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

使用tabs做的组件,点击事件,before-leave事件,v-model更换activeName等

示例图:
示例图

说明:下面css代码中,有一部分是将tabs的原始样式即文字边上的杠,字体居左显示等取消的代码,还有点击哪个时三角标指向那个,未被选择的tabs,三角标颜色为透明看不见

代码:

<template>
  <div class="tabStyle">
    <el-tabs v-model="activeName" :tab-position="tabPosition" :before-leave="beforeLeave" @tab-click="clicktabs">
      <el-tab-pane
        v-for="item in miningAreaList"
        :key="item.id"
        :label="item.mining_area_name"
        :name="item.mining_area_name"
      >
        <span slot="label">
        //指向右边的三角标(此注释不可直接拷贝)
          <i class="el-icon-caret-right" />
          {{ item.mining_area_name }}
		//指向左边的三角标(此注释不可直接拷贝)
          <i class="el-icon-caret-left" />
        </span>
      </el-tab-pane>
    </el-tabs>
  </div>
</template>

<script>
import {
  GetHavePointsMineAreaList
} from '@/utils/common'
export default {
  name: 'MultiStorey',
  components: { },
  directives: { },
  data() {
    return {
      miningAreaList: [], // 采区数组
      miningAreaCount: 0, // 采区总数-未使用
      tabPosition: 'left',
      activeName: '',
      oldActiveName: ''
    }
  },
  created() {
    // 获取已绘制采区的采取数据
    GetHavePointsMineAreaList((responseData) => {
      this.miningAreaList = responseData
      this.miningAreaCount = responseData.length // 采区总数-未使用
    })
  },
  mounted() {

  },
  methods: {
    // before-leave属性 用来获取上次所选采区
    beforeLeave(newActiveName, oldActiveName) {
      console.log(newActiveName)
      this.oldActiveName = oldActiveName
    },
    // tabs点击事件
    clicktabs(tab, e) {
      var i = tab.index
      //将点击的id传给父组件,在父组件进行一些操作
      this.$emit('changeByTabsClick', this.miningAreaList[i].id)
    },
    // 根据父组件传入的采区name改变所选采区(:name="item.mining_area_name" activeName 可以改变这里的值 )
    changeMiningAreaName(miningAreaName) {
      this.activeName = miningAreaName
    },
    // 所选采区没有轨迹数据时回退指向上次所选(父组件调用)
    reSetMiningAreaName() {
      this.activeName = this.oldActiveName
    }
  }
}
</script>

<style lang="scss">
.tabStyle{
  // 字体居中
    .el-tabs--left .el-tabs__item.is-left {
      text-align: center;
    }
  .el-tabs__item{
    color:#fff;
    font-size:16px;
    padding: 0px;
    // 左右三角标未选中时透明
    .el-icon-caret-right{
      color: transparent; //透明色
    }
    .el-icon-caret-left{
      color: transparent; //透明色
    }
  }
  .el-tabs__item.is-active {
    color:#01FFF6 ;
    // 左右三角标选中时浅绿色
    .el-icon-caret-right{
      color: #01FFF6;
    }
    .el-icon-caret-left{
      color: #01FFF6;
    }
  }
  // 鼠标悬停浅绿色
  .el-tabs__item:hover {
    color:#01FFF6 ;
  }
  // 删除tbs默认的横线
  .el-tabs__active-bar{
    display: none;
  }
  .el-tabs--left .el-tabs__nav-wrap.is-left::after{
    display: none;
  }
  .el-tabs--left .el-tabs__header.is-left{
    margin-right: 0px;
  }
}

</style>

背景色以及位置在父组件的样式中设置的,
此组件是一个绝对定位,相当于漂浮在父组件所有东西的上边,我这里做的是放在“右侧中间位置”

.MultiStoreyStyle{
  display: flex;
  flex-direction: column;
  justify-content:center;
  position: absolute;  //绝对定位
  top: calc(50%);
  right: 50px;
  transform: translate(0%,-50%);
  background: linear-gradient(90deg, rgba(10,30,56,0.3) 0%, #0A1E38 48%, rgba(10,30,56,0.3) 100%);
  opacity: 1;
}
<think>好的,我现在需要帮用户解决如何用VueElement Plus创建一个生成SLD配置文件的页面。首先,用户的需求是能够选择点、线、面,并配置它们的样式,然后生成符合SLD 1.1.0规范的配置文件。同时还要处理名称、自定义WellKnownName以及注字段的配置。 首先,我需要回顾一下SLD的结构。SLD是基于XML的,每个样式包括FeatureTypeStyle,里面有规则和符号器。点、线、面分别对应PointSymbolizer、LineSymbolizer、PolygonSymbolizer。用户需要选择类型,所以得有一个下拉菜单让用户选择点、线、面。 接下来,样式配置部分。对于点,可能需要颜色、大小、WellKnownName(比如circle, square)或者自定义的图。线的话,颜色、宽度、虚线样式等。面则是填充颜色、边框颜色、边框宽度等。注字段需要选择字段名,设置字体大小、颜色等。 然后考虑使用Element Plus的组件。下拉菜单用el-select,颜色选择用el-color-picker,输入框用el-input,表单用el-form来组织。数据绑定方面,用Vue的v-model来同步用户输入和组件的状态。 需要处理不同几何类型的样式配置切换。当用户选择点的时候,显示点的相关配置;线或面的时候,切换对应的选项。可以用v-if或者动态组件来实现。 生成SLD的部分,需要根据用户的选择动态构建XML结构。可能需要一个函数,根据当前配置的类型,生成对应的Symbolizer部分。比如,如果是点,就生成PointSymbolizer,包含WellKnownName或外部图,颜色大小等。 自定义WellKnownName的处理。用户可能需要输入自定义的形状名称,或者选择预定义的。这里可能需要一个输入框,当用户选择“custom”时,允许输入自定义名称。 注字段的配置需要关联到TextSymbolizer,包括字体、颜色、大小,以及对应的字段名。需要确保在生成的SLD中包含Label元素和相应的样式。 SLD的版本是1.1.0,需要确认命名空间和结构是否正确。比如根节点是StyledLayerDescriptor,版本属性正确,包含NamedLayer和UserStyle等部分。 测试生成的XML是否符合规范,可能需要用一些验证工具或者GeoServer导入测试。同时,用户可能需要下载生成的SLD文件,所以需要提供一个按钮,将XML内容转换为Blob并提供下载链接。 最后,整体布局使用Element Plus的组件,使界面美观易用。可能需要将表单分成几个部分,比如基本配置、样式选项、注配置,然后用el-tabs或者el-collapse来组织。 可能会遇到的问题包括:不同几何类型的样式配置差异较大,需要动态切换表单部分;XML生成的正确性,特别是嵌套结构和属性是否正确;特殊字符的转义,比如颜色值中的#是否需要处理;以及注字段是否正确地引用属性字段。 需要确保所有的用户输入都正确绑定到数据模型,并且在生成XML时进行适当的转义和格式化。例如,颜色值直接使用十六进制,而WellKnownName如果是自定义的,需要正确写入到对应的签中。 总结步骤:搭建Vue组件结构,使用Element Plus表单组件绑定数据,根据选择的几何类型显示对应配置项,实现生成SLD的逻辑,处理文件下载功能,并进行测试验证。</think>以下是一个基于Vue 3和Element Plus实现的SLD生成器解决方案,支持点、线、面样式配置: ```vue <template> <div class="sld-generator"> <el-form :model="form" label-width="120px"> <!-- 基础配置 --> <el-form-item label="SLD名称"> <el-input v-model="form.sldName" placeholder="请输入SLD名称" /> </el-form-item> <!-- 几何类型选择 --> <el-form-item label="几何类型"> <el-select v-model="form.geometryType" @change="handleGeometryChange"> <el-option label="点" value="point" /> <el-option label="线" value="line" /> <el-option label="面" value="polygon" /> </el-select> </el-form-item> <!-- 通用样式配置 --> <el-form-item label="颜色"> <el-color-picker v-model="form.color" /> </el-form-item> <!-- 点样式配置 --> <template v-if="form.geometryType === 'point'"> <el-form-item label="点大小"> <el-input-number v-model="form.pointSize" :min="1" :max="50" /> </el-form-item> <el-form-item label="点类型"> <el-select v-model="form.wellKnownName"> <el-option label="圆形" value="circle" /> <el-option label="方形" value="square" /> <el-option label="三角形" value="triangle" /> <el-option label="自定义" value="custom" /> </el-select> </el-form-item> <el-form-item v-if="form.wellKnownName === 'custom'" label="自定义图形"> <el-input v-model="form.customMark" placeholder="输入SVG路径或URL" /> </el-form-item> </template> <!-- 线样式配置 --> <template v-else-if="form.geometryType === 'line'"> <el-form-item label="线宽"> <el-input-number v-model="form.lineWidth" :min="1" :max="10" /> </el-form-item> <el-form-item label="虚线样式"> <el-input v-model="form.dashArray" placeholder="例如: 5 2" /> </el-form-item> </template> <!-- 面样式配置 --> <template v-else-if="form.geometryType === 'polygon'"> <el-form-item label="填充颜色"> <el-color-picker v-model="form.fillColor" /> </el-form-item> <el-form-item label="边框颜色"> <el-color-picker v-model="form.strokeColor" /> </el-form-item> </template> <!-- 注配置 --> <el-form-item label="注字段"> <el-input v-model="form.labelField" placeholder="输入注字段名" /> </el-form-item> <el-form-item label="注颜色"> <el-color-picker v-model="form.labelColor" /> </el-form-item> <el-form-item label="字体大小"> <el-input-number v-model="form.fontSize" :min="8" :max="24" /> </el-form-item> <el-button type="primary" @click="generateSLD">生成SLD</el-button> </el-form> <!-- 结果展示 --> <div v-if="sldContent" class="result-box"> <pre>{{ sldContent }}</pre> <el-button @click="downloadSLD">下载SLD文件</el-button> </div> </div> </template> <script setup> import { ref, reactive } from 'vue'; const form = reactive({ sldName: 'MyStyle', geometryType: 'point', color: '#409EFF', pointSize: 8, wellKnownName: 'circle', customMark: '', lineWidth: 2, dashArray: '', fillColor: '#409EFF33', strokeColor: '#409EFF', labelField: '', labelColor: '#333333', fontSize: 12 }); const sldContent = ref(''); const handleGeometryChange = () => { // 切换几何类型时重置相关样式 form.dashArray = ''; form.fillColor = '#409EFF33'; };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值