Element Plus 集成

将字典模块与 Element Plus 组件配合使用的完整示例。

本章提供 6 个完整示例,展示字典模块与 Element Plus 常用组件的配合用法。

前提:项目中已安装 Element Plus。

Select 下拉选择器

<template>
  <el-select v-model="value" placeholder="请选择性别" :loading="loading">
    <el-option v-for="opt in options" :key="opt.value" :label="opt.label" :value="opt.value" />
  </el-select>
</template>

<script setup lang="ts">
const { options, loading } = useDict('gender');
const value = ref('');
</script>

Table 列翻译

<template>
  <el-table :data="tableData" border stripe>
    <el-table-column prop="name" label="姓名" />
    <el-table-column prop="gender" label="性别">
      <template #default="{ row }">
        {{ $dict.translate('gender', row.gender) }}
      </template>
    </el-table-column>
    <el-table-column prop="status" label="状态">
      <template #default="{ row }">
        <el-tag :color="getStatusColor(row.status)">
          {{ $dict.translate('status', row.status) }}
        </el-tag>
      </template>
    </el-table-column>
  </el-table>
</template>

<script setup lang="ts">
const { data: statusData } = useDict('status');

function getStatusColor(value: number) {
  return (statusData.value?.find((i) => i.value === code) as any)?.color;
}

const tableData = ref([
  { name: '张三', gender: 'male', status: 1 },
  { name: '李四', gender: 'female', status: 0 },
]);
</script>

Cascader 级联选择器

<template>
  <el-cascader
    v-model="selected"
    :options="tree || []"
    :props="{ value: 'value', label: 'label', children: 'children' }"
    placeholder="请选择区域"
    clearable
  />
</template>

<script setup lang="ts">
const { tree } = useDictTree('region');
const selected = ref<string[]>([]);
</script>

Radio / Checkbox

<template>
  <el-radio-group v-model="radio" :loading="loading">
    <el-radio v-for="opt in options" :key="opt.value" :value="opt.value">
      {{ opt.label }}
    </el-radio>
  </el-radio-group>
</template>

<script setup lang="ts">
const { options, loading } = useDict('gender');
const radio = ref('');
</script>

Tags 标签

<template>
  <el-tag
    v-for="opt in options"
    :key="opt.value"
    :color="getColor(opt.value)"
    style="margin-right:8px;"
  >
    {{ opt.label }}
  </el-tag>
</template>

<script setup lang="ts">
const { data, options } = useDict('industry');

function getColor(value: string | number) {
  return (data.value?.find((i) => i.value === code) as any)?.color;
}
</script>

Form 表单

<template>
  <el-form :model="form" label-width="80px">
    <el-form-item label="性别">
      <el-select v-model="form.gender" :loading="gLoading">
        <el-option v-for="opt in gOpts" :key="opt.value" :label="opt.label" :value="opt.value" />
      </el-select>
    </el-form-item>
    <el-form-item label="行业">
      <el-select v-model="form.industry" :loading="iLoading">
        <el-option v-for="opt in iOpts" :key="opt.value" :label="opt.label" :value="opt.value" />
      </el-select>
    </el-form-item>
    <el-form-item label="区域">
      <el-cascader
        v-model="form.region"
        :options="rTree || []"
        :props="{ value: 'value', label: 'label', children: 'children' }"
      />
    </el-form-item>
  </el-form>
</template>

<script setup lang="ts">
const { options: gOpts, loading: gLoading } = useDict('gender');
const { options: iOpts, loading: iLoading } = useDict('industry');
const { tree: rTree } = useDictTree('region');

const form = reactive({ gender: '', industry: '', region: [] });
</script>