跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScriptWeChat大前端

uniapp 通用价格组件开发与 DCloud 插件市场发布指南

如何在 uniapp 项目中开发通用的价格展示组件,并将其打包为插件发布至 DCloud 插件市场。内容包括创建 uni_modules 目录结构、编写 Vue 组件核心逻辑(支持价格格式化、样式自定义)、配置 package.json 以及通过 HBuilderX 提交插件的流程。最后演示了如何在项目中引入并使用该组件,实现灵活的价格显示效果。

NodeJser发布于 2026/3/24更新于 2026/7/2115K 浏览
uniapp 通用价格组件开发与 DCloud 插件市场发布指南

请添加图片描述

需求描述

如果你开发商城类项目,必定会显示价格。如果想让价格显示具有突出且美观的效果,通常需要花费一些工夫调整样式。我在开发商城时,客户端和后台管理都需要展示价格,为了节省时间,我开发了一个价格组件,将价格显示的样式放到插件市场,导入后修改属性即可使用。

在这里插入图片描述

上面显示的价格样式,在之前的文章中讲过如何使用 CSS 完整显示价格尾数。下面我们就通过上面的需求,开发一款可以给 uniapp 项目使用的价格组件,介绍如何开发 DCloud 插件市场的插件。

一、新建 uni_modules 插件

  1. 在根目录下'uni_modules'单击右键,选择'新建 uni_modules 插件'。

在这里插入图片描述

  1. 为插件创建一个名称,前面最好加一个你的专属前缀,方便别人检索你的插件。然后,选择你开发的插件分类,本插件是通用组件,所以选择第一个。

在这里插入图片描述

  1. 插件目录结构如下:
    • components 内的 xxm-price.vue 是你要写的组件
    • changelog.md 是更新日志,提交时候会自动更新
    • package.json 是插件的配置项,如插件说明及相关依赖等
    • readme.md 是插件的使用说明,会在插件市场详情页展示的文档

在这里插入图片描述

二、开发插件

如上目录所示,核心代码是需要编写在 xxm-price.vue 文件中的。这是一个普通的 vue 文件,重点是需要接收父组件传递过来的属性,在当前组件中进行处理。

下面的代码是完整的实现逻辑,可以作为参考:

<script setup>
import { ref, computed } from 'vue';

const props = defineProps({
  price: {
    type: Number,
    default: 999
  },
  symbol: {
    type: String,
    default: '¥'
  },
  size: {
    type: Number,
    default: 20
  },
  smallSize: {
    type: Number,
    default: undefined
  },
  color: {
    type: String,
    default: '#FF0F23'
  },
  origPrice: {
    type: Number,
    default: 0
  },
  origColor: {
    type: String,
    default: '#999'
  },
  origAlign: {
    type: String,
    default: 'right',
    validator: (val) => ['left', 'right', 'top', 'bottom'].includes(val)
  }
});

const comFontSize = computed(() => {
  return props.smallSize ?? props.size * 0.618;
});

const flexDirection = computed(() => {
  return ['left', 'right'].includes(props.origAlign) ? 'row' : 'column';
});

const alignItems = computed(() => {
  return ['top', 'bottom'].includes(props.origAlign) ? 'flex-start' : 'flex-end';
});

const isOrigPriceFirst = computed(() => {
  return ['top', 'left'].includes(props.origAlign);
});

function formatPrice(num, option = 0) {
  if (typeof num !== 'number' || isNaN(num)) {
    return '无效的数字,第一个参数必须是有效数字';
  }
  const baseValue = (num + Number.EPSILON) / 100;
  if (option === 0) {
    return Math.floor(baseValue);
  } else if (option === 1) {
    const fixedValue = Math.round(baseValue * 100) / 100;
    const [, decimalPart = '00'] = fixedValue.toString().split('.');
    return `.${decimalPart.padEnd(2, '0').slice(0, 2)}`;
  } else {
    return Math.round(baseValue * 100) / 100;
  }
}
</script>

<template>
  <view class="price-wrap" :style="{'--flex-direction': flexDirection,'--align-items': alignItems }">
    <view class="price" :style="{ '--symbol': `'${symbol}'`, '--size': `${size}px`, '--color': `${color}`, '--com-size': `${comFontSize}px` }" :data-suffix="formatPrice(price, 1)">
      {{ formatPrice(price, 0) }}
    </view>
    <view class="origPrice" v-if="origPrice > 0" :style="{ '--orig-color': origColor, '--com-size': `${comFontSize}px`, '--order': isOrigPriceFirst ? '-1' : 'initial' }">
      {{ formatPrice(origPrice, -1) }}
    </view>
  </view>
</template>

<style lang="scss" scoped>
.price-wrap {
  display: flex;
  align-items: flex-start;
  align-items: var(--align-items);
  flex-direction: var(--flex-direction);
  line-height: 1em;
  gap: 5px;

  .price {
    color: var(--color);
    font-size: var(--size);
    font-weight: bold;
    &::before {
      font-size: var(--com-size);
      content: var(--symbol);
    }
    &::after {
      font-size: var(--com-size);
      content: attr(data-suffix);
    }
  }

  .origPrice {
    text-decoration: line-through;
    color: var(--orig-color);
    font-size: var(--com-size);
    order: var(--order);
  }
}
</style>

三、提交插件

如果你的功能组件已经开发完毕了,那么就需要将该组件提交到插件市场了。

发布到插件市场

在插件文件夹上单击右键,选择'发布到插件市场',会出现插件描述的弹窗,可以在弹窗内填写插件的相关信息,也可以在'package.json'文件中填写。弹窗编写的内容只有提交后才会写入到 package.json 文件中。

  • 一定要注意将开发的组件选择适合的分类
  • 插件显示名称、描述、标签一定要清晰明了,让别人看标题就知道是干什么的插件
  • 插件 ID 是唯一的,所以最后前面加上你的个性标识,如 el-、uni-、uv-等

其他配置大家就按照要求填写就可以了,如果没有问题就可以点击提交,就会发布到 DCloud 的插件市场了。

先发布的插件,会展示在插件市场的首页,插件市场是按照插件更新时间排序的,如果想要给插件增加多一些曝光度,经常更新插件是一个好的办法。

在本插件的详情页可以看到对插件使用说明的介绍,这是因为我们在插件文件夹下的'readme.md'进行了编写,你可以将详细的使用文档进行编写,有利于让别人更好的入手你的插件。

在这里插入图片描述

四、应用插件

提交发布插件后,在 DCloud 插件市场就可以找到我们发布的插件了,和使用官方扩展组件一样,选择右上角的'下载插件并导入 HBuilderX',这样就会将该插件下载到你项目的'uni_modules'目录中,和使用自定义的组件一样使用即可。

在项目中使用

在任意的 vue 文件中,可以使用该插件,无需 import 导入价格插件,直接在页面中使用插件名称,便可展示价格样式了,在插件说明文档中有组件属性的说明,也可以参考下面代码来使用。

<template>
  <view class="layout">
    <view class="row">
      <view class="title">基础样式:</view>
      <xxm-price></xxm-price>
    </view>
    <view class="row">
      <view class="title">设置组件大小:</view>
      <xxm-price :size="26"></xxm-price>
    </view>
    <view class="row">
      <view class="title">前缀货币符号:</view>
      <xxm-price :size="26" symbol="$"></xxm-price>
    </view>
    <view class="row">
      <view class="title">显示原价和现价:</view>
      <xxm-price :size="26" :price="36987" :origPrice="400355"></xxm-price>
    </view>
    <view class="row">
      <view class="title">设置小字尺寸:</view>
      <xxm-price :size="26" :price="36987" :origPrice="400355" :smallSize="12"></xxm-price>
    </view>
    <view class="row">
      <view class="title">设置原价和现价颜色:</view>
      <xxm-price :size="26" :price="36987" :origPrice="400355" color="#E6A23C" origColor="green"></xxm-price>
    </view>
    <view class="row">
      <view class="title">设置原价显示位置:</view>
      <xxm-price :size="26" :price="36987" :origPrice="400355" origAlign="bottom"></xxm-price>
    </view>
  </view>
</template>

目录

  1. 需求描述
  2. 一、新建 uni_modules 插件
  3. 二、开发插件
  4. 三、提交插件
  5. 发布到插件市场
  6. 四、应用插件
  7. 在项目中使用
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • C++ 入门:发展历史、命名空间与输入输出详解
  • Python 语言概述、应用现状及学习路径指南
  • 分布式文件系统 HDFS 编程实践
  • OSCP 实战:Net-NTLMv2 哈希传递与中继攻击详解
  • C++ 哈希表底层原理与完整实现
  • DeepSeek-R1 大模型基于 MS-Swift 框架的部署、推理与微调实践
  • tavily_dart 在鸿蒙平台适配及 AI 搜索引擎集成实战
  • Linux Mint 22.3 安装指南与系统优化实战
  • Flutter 三方库 eth_sig_util 的鸿蒙化适配指南
  • Flutter eip55 库鸿蒙适配指南:以太坊地址校验与验证
  • 算法:双指针解决快乐数问题
  • 基于 Python + Django 的大学生自习室预约系统
  • Microi 吾码:开源低代码平台核心功能解析
  • Cursor 里接入 MCP 服务的实操记录
  • 位运算算法基础与经典例题解析
  • Flutter 三方库 angular_bloc 的鸿蒙化适配指南
  • Qwen3-VL 与 Qwen2-VL 对比:视觉感知升级实战评测
  • FastAPI + SQLAlchemy 构建高性能 RESTful API 接口实战
  • 平衡二叉搜索树之 AVL 树的模拟实现
  • StableDiffusion 使用 LoRA 生成高质量人物图片实操教程

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online