Vue自定义商品发布组件

文章目录

  • 一、代码展示
  • 二、代码解读
  • 三、结果展示

一、代码展示

<template>
  <div>
    <a-popover trigger="hover" :getPopupContainer="triggerNode => {return triggerNode.parentNode || document.body;}">
      <template #content>
        <div style="display: flex; justify-content: space-between;">
          <router-link to="/write">
            <a-card
                class="select"
                :hoverable="true"
                style="width: 100px; height: 100px; margin-right: 10px;justify-content: center;display: flex"
            >
              <div style="display: flex;justify-content: center;flex-direction: column">
                <svg-icon icon-name="icon-icon_wenzhang" size="40px" ></svg-icon>
                <span style="margin-top: 2px">写文章</span>
              </div>
            </a-card>
          </router-link>

          <a-card
              class="select"
              :hoverable="true"
              style="width: 100px; height: 100px; margin-left: 10px;justify-content: center;display: flex"
              @click="openProductDialog"
          >
            <div style="display: flex;justify-content: center;flex-direction: column">
              <svg-icon icon-name="icon-shangpinfabu" size="40px" ></svg-icon>
              <span style="margin-top: 2px">卖商品</span>
            </div>
          </a-card>



          <a-modal :visible="visible"  title="发布商品" @ok="submitForm" @cancel="handleCancel">
            <a-form  >
              <!-- 商品名称 -->
              <a-form-item label="商品名称">
                <a-input v-model:value="formData.name" />
              </a-form-item>

              <!-- 商品详细描述 -->
              <a-form-item label="商品描述">
                <a-textarea v-model:value="formData.detail" :auto-size="{ minRows: 3, maxRows: 6 }" />
              </a-form-item>

              <!-- 商品价格 -->
              <a-form-item label="商品价格">
                <a-input-number v-model:value="formData.price" :min="0" :precision="2" />
              </a-form-item>

              <!-- 商品库存 -->
              <a-form-item label="商品库存">
                <a-input-number v-model:value="formData.stock" :min="0" />
              </a-form-item>

              <!-- 商品类型选择 -->
              <a-form-item label="商品类型">
                <a-select  v-model:value="formData.cateId">
                  <a-select-option v-for="option in productTypeOptions" :key="option.id" :value="option.id">
                    {{ option.name }}
                  </a-select-option>
                </a-select>
              </a-form-item>
              <!-- 快递或自提 -->
              <a-form-item label="配送方式">
                <a-select v-model:value="formData.remark" >
                  <a-select-option value="快递">快递</a-select-option>
                  <a-select-option value="自提">自提</a-select-option>
                </a-select>
              </a-form-item>

              <!-- 上传图片 -->
              <a-form-item label="上传图片">
                <a-upload
                    :showUploadList="{ showPreviewIcon: true, showRemoveIcon: true }"
                    :list-type="'picture-card'"
                    :beforeUpload="beforeUpload"
                    :customRequest="customRequest"
                    @preview="handlePreview"
                    @remove="handleRemove"
                >
                  <div v-if="uploadedImageCount < 2">
                    <a-icon type="plus" />
                    <div class="ant-upload-text">上传图片</div>
                  </div>
                </a-upload>
              </a-form-item>

              <a-form-item>
                <a-modal :visible="previewVisible" :title="previewTitle" @cancel="handlePreviewCancel" :footer="null">
                  <img :src="previewImage" alt="Uploaded Image" style="width: 100%" />
                </a-modal>
              </a-form-item>

            </a-form>
          </a-modal>


















        </div>
      </template>
      <a-button type="primary" shape="round" size="large" style="margin-top: 15px;background-color: #3fdbf0">
        <template #icon>
          <PlusCircleOutlined/>
        </template>
        发布
      </a-button>
    </a-popover>
  </div>
</template>

<script setup></script>

<style scoped lang="less">
.select:hover {
  background-color: #f5f5f5;
}
</style>

二、代码解读

  1. <template> 标签:Vue.js 组件的模板部分开始。

  2. <div> 标签:一个包裹整个组件内容的 <div> 元素。

  3. <a-popover> 标签:Ant Design Vue 库提供的弹出框组件,用于显示一个气泡框。

    • trigger="hover":设置触发弹出框的方式为鼠标悬停。
    • :getPopupContainer:动态地指定弹出框的挂载容器,使其可以随父元素的位置改变而改变。
    • :getPopupContainer 属性的值是一个函数,它接受一个参数 triggerNode,返回弹出框的挂载容器,这里返回的是触发节点的父节点或者文档的 body 元素。
  4. <template #content>:模板的一个命名插槽,用于定义弹出框的内容。

  5. <div> 标签:弹出框内容的容器。

  6. <router-link to="/write">:Vue Router 提供的路由链接组件,点击后跳转到 /write 路径。

  7. <a-card> 标签:Ant Design Vue 提供的卡片组件,用于包裹每个选项。

    • class="select":自定义类名,用于设置选项卡的样式。
    • :hoverable="true":设置鼠标悬停时显示阴影效果。
    • style:行内样式设置卡片的宽度、高度和外边距等样式。
  8. <svg-icon> 标签:自定义的 SVG 图标组件,用于显示一个 SVG 图标。

    • icon-name="icon-icon_wenzhang":指定 SVG 图标的名称。
    • size="40px":设置 SVG 图标的大小。
  9. <span> 标签:用于显示文字内容。

  10. <a-card> 标签:另一个卡片组件,代表卖商品选项。

    • class="select":同样是自定义类名,用于设置样式。
    • :hoverable="true":设置鼠标悬停时显示阴影效果。
    • @click="openProductDialog":点击时触发 openProductDialog 方法。
  11. <a-modal> 标签:Ant Design Vue 提供的模态框组件,用于显示发布商品的表单。

    • :visible="visible":控制模态框的显示与隐藏。
    • title="发布商品":设置模态框的标题。
    • @ok="submitForm":点击确定按钮时触发 submitForm 方法。
    • @cancel="handleCancel":点击取消按钮时触发 handleCancel 方法。
  12. <a-form> 标签:Ant Design Vue 提供的表单组件,用于包裹表单项。

  13. <a-form-item> 标签:表单项组件,用于包裹每个表单项,并设置标签和表单控件的布局。

    • label="商品名称":设置表单项的标签文字。
  14. <a-input><a-textarea><a-input-number><a-select><a-upload> 等标签:Ant Design Vue 提供的不同类型的表单控件,用于用户填写商品信息。

  15. <a-modal> 标签:另一个模态框组件,用于显示上传的图片的预览。

    • :visible="previewVisible":控制预览模态框的显示与隐藏。
    • :title="previewTitle":设置预览模态框的标题。
  16. <img> 标签:用于显示上传的图片的预览。

    • :src="previewImage":指定预览图片的路径。
  17. </template> 标签:模板部分结束。

三、结果展示

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/431412.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis面试总结

概述 1. Redis是什么&#xff1f;简述它的优缺点&#xff1f; Redis本质上是一个Key-Value类型的内存数据库&#xff0c;很像Memcached&#xff0c;整个数据库加载在内存当中操作&#xff0c;定期通过异步操作把数据库中的数据flush到硬盘上进行保存。 因为是纯内存操作&…

[Angular 基础] - routing 路由(下)

[Angular 基础] - routing 路由(下) 之前部分 Angular 笔记&#xff1a; [Angular 基础] - 自定义指令&#xff0c;深入学习 directive [Angular 基础] - service 服务 [Angular 基础] - routing 路由(上) 使用 route 书接上回&#xff0c;继续折腾 routing 按照最初的 wi…

ffmpeg使用命令实现音视频分离

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、简单介绍二、具体操作三、验证1.源文件2.视频文件3.音频文件 四、补充总结 前言 有时候由于特殊需要可能需要将一个视频&#xff08;带音频&#xff09;的…

洛谷:P3068 [USACO13JAN] Party Invitations S(枚举、前缀和)

这题我们数据范围太大&#xff0c;用二维肯定是不行的&#xff0c;我们可以采用一维线性存储。 如题意&#xff0c;我们可以将每组奶牛编号都存在一维数组里面&#xff0c;只需记录每组的头尾指针就可以了。 如题中样例我们就可以存储成1 3 3 4 1 2 3 4 5 6 7 4 3 2 1 然后第…

docker部署aria2-pro

前言 我平时有一些下载视频和一些资源文件的需求&#xff0c;有时候需要离线下载&#xff0c;也要速度比较快的方式 之前我是用家里的玩客云绝育之后不再写盘当下载机用的&#xff0c;但是限制很多 我发现了aria2 这个下载器非常适合我&#xff0c;而有个大佬又在原来的基础…

基于 Vue3打造前台+中台通用提效解决方案(上)

基于 Vue3打造前台+中台通用提效解决方案 1、项目架构 本项目使用vite + vue3来实现前中台解决方案 2、为什么使用vite ? 因为,之前的项目一直都是使用webpack作为构建工具;vite出来这么久了,也没有用过;所以想在当前项目下进行使用; 2.1、为什么vite比webpack块? …

android开发文档下载,你的技术真的到天花板了吗

Android 基础 1.Activity 1、 什么是 Activity&#xff1f; 2、 请描述一下 Activity 生命周期 …… 2.Service 3.Broadcast Receiver32 4.ContentProvider 5.ListView 6.Intent 7.Fragment 1.Fragment 跟 Activity 之间是如何传值的 2.描述一下 Fragment 的生命周期 3.Fragme…

Qt多弹窗实现包括QDialog、QWidget、QMainWindow

1.相关说明 独立Widget窗口、嵌入式Widget、嵌入式MainWindow窗口、独立MainWindow窗口等弹窗的实现 相关界面包含关系 2.相关界面 3.相关代码 mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include "tformdoc.h" #incl…

容器云平台巡检实战:运维进阶技巧与策略

1 docker容器日常巡检 通过以下方式进行检查&#xff1a; 1.1 docker/podman ps查看容器状态 Docker/podman ps -a 查看容器状态STATUS&#xff1a; Exited(0)&#xff1a;表示容器正常退出 Exited(其他数字)&#xff1a;容器异常退出&#xff0c;需要通过log 查看原因 Up…

080|为什么阿里的价值观值得你关注?

在阿里巴巴20周年年会现场&#xff0c;万众瞩目之下&#xff0c;马云和张勇完成了阿里巴巴董事长职务的交接。 不过你也知道&#xff0c;这次接棒在一年前就已经公布了&#xff0c;在年会上只是一个仪式。在20周年年会过后&#xff0c;我找到了互联网圈的资深媒体人阳淼&#…

julia语言使用PyCall包调用Python代码及Python包

Julia语言虽然好&#xff0c;但是包管理方面和生态环境感觉还有一点小小的缺陷&#xff0c;但是Julia可以调用Python丰富的包&#xff0c;用起来很方便。 安装PyCall 在安装之前先确认下Julia和Python的版本&#xff0c;我使用的稳定版本的 Julia1.6.7&#xff0c;Python版本是…

电磁兼容(EMC):单、双面PCB板设计要点

目录 1 产品设计原则&#xff1a;性价比为第一要素 2 布局设计要点 3 布线设计要点 4 完整地平面不是最优方案 1 产品设计原则&#xff1a;性价比为第一要素 PCB在电磁兼容设计中通常是要求有完整的地和电源平面。但多层价格让对价格敏感的产品望而却步&#xff0c;只能采…

GPT本地化研究(JAVA版本)

1.我觉得gpt3 600多G个人是不可能部署得成功的,回想我自己个人不可能每一方面知识都知道,我只是知道最多的是我自己擅长的,百事通需要靠大公司才能解决,我们只是要关注这个gpt是哪个领域的, 我想做的是工业—>自动化gpt(貌似这个方向日本很专业了*_*) 它山之石可以攻玉 2.gp…

【设计模式 03】抽象工厂模式

一个具体的工厂&#xff0c;可以专门生产单一某一种东西&#xff0c;比如说只生产手机。但是一个品牌的手机有高端机、中端机之分&#xff0c;这些具体的属于某一档次的产品都需要单独建立一个工厂类&#xff0c;但是它们之间又彼此关联&#xff0c;因为都共同属于一个品牌。我…

视觉Transformers中的位置嵌入 - 研究与应用指南

视觉 Transformer 中位置嵌入背后的数学和代码简介。 自从 2017 年推出《Attention is All You Need》以来&#xff0c;Transformer 已成为自然语言处理 (NLP) 领域最先进的技术。 2021 年&#xff0c;An Image is Worth 16x16 Words 成功地将 Transformer 应用于计算机视觉任务…

【go语言开发】yaml文件配置和解析

本文主要介绍使用第三方库来对yaml文件配置和解析。首先安装yaml依赖库&#xff1b;然后yaml文件中配置各项值&#xff0c;并给出demo参考&#xff1b;最后解析yaml文件&#xff0c;由于yaml文件的配置在全局中可能需要&#xff0c;可定义全局变量Config&#xff0c;便于调用 文…

面试题HTML+CSS+网络+浏览器篇

文章目录 Css预处理sass less是什么&#xff1f;为什么使用他们怎么转换 less 为 css&#xff1f;重绘和回流是什么http 是什么&#xff1f;有什么特点HTTP 协议和 HTTPS 区别什么是 CSRF 攻击HTML5 新增的内容有哪些Css3 新增的特性flex VS grid清除浮动的方式有哪些&#xff…

SAR ADC学习笔记(3)

一、SAR ADC采样电路 1.采样网络的时域响应&#xff1a;采保信号 2.采样网络的KT/C噪声 3.采样抖动 采样开关的种类 1.单MOS管开关 2.传输门开关 3.栅极自举&#xff08;Bootstrap&#xff09;开关 结论&#xff1a;M4的衬底需要和B点短接&#xff0c;保证B点能够到达高压&…

完美解决Iframe嵌入帆软报表出现跨域cookie写不进去的问题

随着google chrome对第三方cookie的限制越来越狠,现在发现之前使用iframe嵌入的帆软报表已经不好使了。官方现在解决iframe嵌入帆软报表出现跨域导致cookie写不进去的方案是主推 统一主域名的方案(谷歌浏览器单点登录失败- FineReport帮助文档 - 全面的报表使用教程和学习资料…

大唐杯学习笔记:Day5

1.1 小区搜索 搜索流程 PLMN选择 自动模式&#xff1a;UE根据NAS的请求或自主地向NAS报告可用的PLMN 手动模式&#xff1a;通过手动选择一个可用的VPLMN获取正常服务 频点选择 5G NR中,3GPP主要指定了两个频率范围,一个是6GHZ以下,另一个是毫米波,分别称之为FR1和FR2。 N…