创建vue3数学符号选择器(vue3+elementPlus+ts)

 本文包含两种效果:

  •   效果一:数学符号只能选择一次,选中的数学符号高亮
  •   效果二:相同的数学符号可以选择多次,当前选中的数学符号高亮

 

 首先创建math.ts定义常见数学符号数组 :

export const symbols = [
  { id: 1, value: '+', description: '加号' },
  { id: 2, value: '-', description: '减号' },
  { id: 3, value: '×', description: '乘号' },
  { id: 4, value: '÷', description: '除号' },
  { id: 5, value: '=', description: '等号' },
  { id: 6, value: '≠', description: '不等号' },
  { id: 7, value: '<', description: '小于号' },
  { id: 8, value: '>', description: '大于号' },
  { id: 9, value: '≤', description: '小于等于号' },
  { id: 10, value: '≥', description: '大于等于号' },
  { id: 11, value: '∑', description: '求和符号' },
  { id: 12, value: '∫', description: '积分符号' },
  { id: 13, value: '√', description: '平方根符号' },
  { id: 14, value: '∠', description: '角度符号' },
  { id: 15, value: '°', description: '度符号' },
  { id: 16, value: 'π', description: '圆周率' },
  { id: 17, value: '∞', description: '无穷大符号' },
  { id: 18, value: '≈', description: '约等于号' },
  { id: 19, value: '∝', description: '成比例符号' },
  { id: 20, value: '∴', description: '因此符号' },
  { id: 21, value: '∵', description: '由此推出符号' },
  { id: 22, value: '∀', description: '全称量词' },
  { id: 23, value: '∃', description: '存在量词' },
  { id: 24, value: '∈', description: '属于符号' },
  { id: 25, value: '∉', description: '不属于符号' },
  { id: 26, value: '∩', description: '交集符号' },
  { id: 27, value: '∪', description: '并集符号' },
  { id: 28, value: '⊂', description: '真子集符号' },
  { id: 29, value: '⊆', description: '子集或等于符号' },
  { id: 30, value: '⊄', description: '非子集符号' },
  { id: 31, value: '⊃', description: '真包含符号' },
  { id: 32, value: '⊇', description: '包含或等于符号' },
  { id: 33, value: '⊅', description: '非包含符号' },
  { id: 34, value: '∑', description: '求和符号' },
  { id: 35, value: '∏', description: '乘积符号' },
  { id: 36, value: '∂', description: '偏导符号' },
  { id: 37, value: '∆', description: '增量符号' },
  { id: 38, value: '∇', description: '梯度符号' },
  { id: 39, value: '∫', description: '积分符号' },
  { id: 40, value: '∮', description: '曲线积分符号' },
  { id: 41, value: '∬', description: '面积积分符号' },
  { id: 42, value: '∭', description: '体积积分符号' },
  { id: 43, value: '∀', description: '普遍量词符号' },
  { id: 44, value: '∈', description: '属于符号' },
  { id: 45, value: '∉', description: '不属于符号' },
  { id: 46, value: '∋', description: '包含符号' },
  { id: 47, value: '∌', description: '不包含符号' },
  { id: 48, value: '∩', description: '交集符号' },
  { id: 49, value: '∪', description: '并集符号' },
  { id: 50, value: '⊂', description: '真子集符号' },
  { id: 51, value: '⊃', description: '真包含符号' },
  { id: 52, value: '⊆', description: '子集或等于符号' },
  { id: 53, value: '⊇', description: '包含或等于符号' },
  { id: 54, value: '⊄', description: '非子集符号' },
  { id: 55, value: '⊅', description: '非包含符号' },
  { id: 56, value: '⊈', description: '真非子集符号' },
  { id: 57, value: '⊉', description: '真非包含符号' },
  { id: 58, value: '⊕', description: '异或符号' },
  { id: 59, value: '⊖', description: '减法环符号' },
  { id: 60, value: '⊗', description: '张量积符号' },
  { id: 61, value: '⊙', description: '哈达玛积符号' },
  { id: 62, value: '⊢', description: '右推出符号' },
  { id: 63, value: '⊣', description: '左推出符号' },
  { id: 64, value: '⊤', description: '真值符号' },
  { id: 65, value: '⊥', description: '垂直符号' },
  { id: 66, value: '⋅', description: '点乘符号' },
  { id: 67, value: '⋆', description: '星号符号' },
  { id: 68, value: '⋮', description: '连续省略号符号' },
  { id: 69, value: '⋯', description: '中间省略号符号' },
  { id: 70, value: '⋰', description: '上斜省略号符号' },
  { id: 71, value: '⋱', description: '下斜省略号符号' },
  { id: 72, value: 'ℕ', description: '自然数集符号' },
  { id: 73, value: 'ℤ', description: '整数集符号' },
  { id: 74, value: 'ℚ', description: '有理数集符号' },
  { id: 75, value: 'ℝ', description: '实数集符号' },
  { id: 76, value: 'ℂ', description: '复数集符号' },
  { id: 77, value: 'ℵ', description: '纤维符号' },
  { id: 78, value: 'ℶ', description: '纤维符号' },
  { id: 79, value: 'ℷ', description: '纤维符号' },
  { id: 80, value: 'ℸ', description: '纤维符号' },
  { id: 81, value: '℘', description: '幂集符号' },
  { id: 82, value: 'ℑ', description: '虚部符号' },
  { id: 83, value: 'ℜ', description: '实部符号' },
  { id: 84, value: '℠', description: '商标符号' },
  { id: 85, value: '™', description: '商标符号' },
  { id: 86, value: '∅', description: '空集符号' },
  {
    id: 87,
    value: '∈',
    description: '属于符号',
  },
  {
    id: 88,
    value: '∉',
    description: '不属于符号',
  },
  {
    id: 89,
    value: '∋',
    description: '包含符号',
  },
  {
    id: 90,
    value: '∌',
    description: '不包含符号',
  },
  {
    id: 91,
    value: '⊂',
    description: '真子集符号',
  },
  {
    id: 92,
    value: '⊃',
    description: '真包含符号',
  },
  {
    id: 93,
    value: '⊆',
    description: '子集或等于符号',
  },
  {
    id: 94,
    value: '⊇',
    description: '包含或等于符号',
  },
  {
    id: 95,
    value: '⊄',
    description: '非子集符号',
  },
  {
    id: 96,
    value: '⊅',
    description: '非包含符号',
  },
  {
    id: 97,
    value: '⊈',
    description: '真非子集符号',
  },
  {
    id: 98,
    value: '⊉',
    description: '真非包含符号',
  },
  {
    id: 99,
    value: '⊕',
    description: '异或符号',
  },
  {
    id: 100,
    value: '⊖',
    description: '减法环符号',
  },
  {
    id: 101,
    value: '⊗',
    description: '张量积符号',
  },
  {
    id: 102,
    value: '⊙',
    description: '哈达玛积符号',
  },
  {
    id: 103,
    value: '⊢',
    description: '右推出符号',
  },
  {
    id: 104,
    value: '⊣',
    description: '左推出符号',
  },
  {
    id: 105,
    value: '⊤',
    description: '真值符号',
  },
  {
    id: 106,
    value: '⊥',
    description: '垂直符号',
  },
  {
    id: 107,
    value: '⋅',
    description: '点乘符号',
  },
  {
    id: 108,
    value: '⋆',
    description: '星号符号',
  },
  {
    id: 109,
    value: '⋮',
    description: '连续省略号符号',
  },
  {
    id: 110,
    value: '⋯',
    description: '中间省略号符号',
  },
  {
    id: 111,
    value: '⋰',
    description: '上斜省略号符号',
  },
  {
    id: 112,
    value: '⋱',
    description: '下斜省略号符号',
  },
  {
    id: 113,
    value: 'ℕ',
    description: '自然数集符号',
  },
  {
    id: 114,
    value: 'ℤ',
    description: '整数集符号',
  },
  {
    id: 115,
    value: 'ℚ',
    description: '有理数集符号',
  },
  {
    id: 116,
    value: 'ℝ',
    description: '实数集符号',
  },
  {
    id: 117,
    value: 'ℂ',
    description: '复数集符号',
  },
]

 

效果一: 

效果图: 

html区域:

<template>
  <div>
    <el-popover placement="bottom" width="200px" v-model:visible="symbolSelectorVisible" trigger="click">
      <div class="symbol-selector flex flex-start flex-wrap h-300 overflow-y-auto">
        <div
          v-for="symbol in symbolsWithSelection"
          :key="symbol.id"
          :class="['symbol-item w-30 text-center cursor-pointer m-4 p-4', { 'symbol-item-active': symbol.isSelected }]"
          @click="selectSymbol(symbol)"
        >
          {
  { symbol.value }}
        
        </div>
      </div>
      <template #reference>
        <el-button type="primary" @click="showSymbolSelector">选择数学符号</el-button>
      </template>
    </el-popover>
    <div class="selected-symbol">
      <span v-for="item in selectedSymbols">{
  { item.value }},</span>
    </div>
  </div>
</template>

 ts区域:

<script setup lang="ts">
import { ref } from 'vue'
import { symbols } from '@/views/math/math.ts'
const symbolsWithSelection = ref(symbols.map(symbol => ({
  ...symbol,
  isSelected: false//为每一条数学符号对象添加被选选中的属性,默认为全被未选中
})))

const symbolSelectorVisible = ref(false)
const selectedSymbols: any = ref([])//被选中的数学符号对象

const showSymbolSelector = () => {
  symbolSelectorVisible.value = true
}

const selectSymbol = (symbol:any) => {
  const index = selectedSymbols.value.findIndex((item:any) => item.id === symbol.id);
  if (index !== -1) {
    selectedSymbols.value.splice(index, 1); // 从数组中删除符号
  } else {
    selectedSymbols.value.push(symbol); // 将符号添加到数组中
  };

  console.log(selectedSymbols.value, '选择的数学符号');
  symbolsWithSelection.value.forEach(item => {
    if (item.id === symbol.id) {
      item.isSelected = !item.isSelected; // 切换 isSelected 属性的值
    } 
    // else {
    //   item.isSelected = false; // 将其他符号的 isSelected 属性设置为 false
    // }
  });
};

</script>

 scss区域:

<style lang="scss">
.symbol-selector {
}

.symbol-item {
  border: 1px solid #ccc;
  border-radius: 4px;
  &-active {
    background-color: #fcbd01;
  }
}

.selected-symbol {
  display: inline-block;
  cursor: pointer;
  padding: 8px;
  border: 1px solid #ccc;
  border-radius: 4px;
  width: 500px;
  height: 40px;
}
</style>

效果二(添加了隐藏选择器时,取消选择器中的高亮元素)

效果图:

 

html区域:

<template>
  <div>
    <el-popover placement="bottom" width="200px" v-model:visible="symbolSelectorVisible" trigger="click"  @hide="hideSymbolSelector">
      <div class="symbol-selector flex flex-start flex-wrap h-300 overflow-y-auto">
        <div
          v-for="symbol in symbolsWithSelection"
          :key="symbol.id"
          :class="['symbol-item w-30 text-center cursor-pointer m-4 p-4', { 'symbol-item-active': activeSymbol==symbol.value }]"
          @click="selectSymbol(symbol)"
        >
          {
  { symbol.value }}
        
        </div>
      </div>
      <template #reference>
        <el-button type="primary" @click="showSymbolSelector">选择数学符号</el-button>
      </template>
    </el-popover>
    <div class="selected-symbol">
      <span v-for="item in selectedSymbols">{
  { item.value }},</span>
    </div>
  </div>
</template>

 ts区域:

<script setup lang="ts">
import { ref } from 'vue'
import { symbols } from '@/views/math/math.ts'
const symbolsWithSelection = ref(symbols)

const symbolSelectorVisible = ref(false)
const selectedSymbols: any = ref([])//被勾选的数字符号

const showSymbolSelector = () => {
  symbolSelectorVisible.value = true
}

const activeSymbol=ref('')//高亮symbol
const selectSymbol = (symbol:any) => {
  selectedSymbols.value.push(symbol); // 将符号添加到数组中
  activeSymbol.value=symbol.value
};
const hideSymbolSelector=()=>{
  activeSymbol.value=''
}

</script>

 scss区域(与效果一一致)

相关推荐

  1. vue3 配置全局@符号

    2023-12-06 11:42:05       6 阅读
  2. Vue创建vue3项目

    2023-12-06 11:42:05       19 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-06 11:42:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-06 11:42:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-06 11:42:05       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-06 11:42:05       20 阅读

热门阅读

  1. Python 模块和包

    2023-12-06 11:42:05       38 阅读
  2. Mysql中RTRIM、LTRIM、TRIM函数的区别

    2023-12-06 11:42:05       36 阅读
  3. 用python微调gpt-3.5

    2023-12-06 11:42:05       36 阅读
  4. linux 进程间几种常见通信方式介绍

    2023-12-06 11:42:05       36 阅读
  5. 【Ratis】Grpc.proto文件里定义的一些RPC

    2023-12-06 11:42:05       40 阅读
  6. c++primer 2.1.2含有无符号数类型的表达式

    2023-12-06 11:42:05       30 阅读
  7. Vue3中定义变量是选择ref还是reactive?

    2023-12-06 11:42:05       31 阅读