Vue+elementUI项目实现自定义上传图片并在页面显示,通过点击按钮后发送给后端

最后实现的效果:后端要求数据格式是json,图片和回复内容一起传至接口
数据格式是json,图片不能以formData形式接后端,就考虑到将图片转为base64格式!
在这里插入图片描述
上传照片后显示,并隐藏上传按钮
在这里插入图片描述
html部分:

<div class="upload-img-div">
            <el-upload class="feedbackUpload-img" accept=".png,.jpg,.jpeg"
                       :style="{backgroundImage:'url(' + dialogImageUrl + ')', backgroundRepeat:'no-repeat', backgroundPosition:'center center', backgroundSize: 'contain'}"
                       action="aaa" :limit="1" :before-upload="beforeUpload" :on-change="handlePictureCardPreview"
                       :show-file-list="false" list-type="picture">
              <i v-show="!dialogImageUrl" class="el-icon-upload avatar-uploader-icon"></i>
              <div v-show="!dialogImageUrl" slot="tip" class="el-upload__text upload__tip">上传照片</div>
            </el-upload>
            <i v-show="dialogImageUrl" class="el-icon-delete delUploadImg" @click="delUploadImg"></i>
          </div>
  • accept属性控制上传类型
  • style属性控制上传后显示图片
  • action是element要求必不可少的,后面字符随便写
  • limit限制上传数量
  • before-upload 上传前的勾子
  • on-change 文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用
  • :show-file-list 是否显示已上传文件列表,这里设为false,否则会显示!
  • list-type 文件列表的类型 这里设为picture,否则会不显示上传的图片(不知道原因)

后面几条判断是否上传,显示不同状态

data数据:

data() {
      return {
        dialogImageUrl: '',//上传图片后的图片地址
        uploadImgBase64: '',//存储将图片转化为base64后的字符
      };
    },

js部分:
图片转base64方法来源:图片转base64

// 文件改变时勾子函数
      handlePictureCardPreview(file) {
        this.dialogImageUrl = file.url;
      },
      // 上传前勾子函数
      beforeUpload(file) {
        this.toBase64(file);
        return false;//取消自动上传
      },
      handleAddFeedback() {
        let self = this;
        if (!self.addFeedbackInfo) {
          this.$message({
            message: '反馈消息不能为空',
            type: 'warning'
          });
        } else {
          let addFeedbackForm = {};
          addFeedbackForm.StudentInf = self.addFeedbackInfo;
          addFeedbackForm.StudentImg = self.uploadImgBase64;
          self.$http.post('feed_back_add', addFeedbackForm)
            .then((res) => {
              ......
            })
            .catch(() => {
              this.$message({
                message: '出错了,请稍后再试',
                type: 'error'
              });
            });
        }
      },
      // 删除已上传图片
      delUploadImg() {
        this.dialogImageUrl = '';
        this.uploadImgBase64 = '';
      },
      // 将图片转为base64(这个方法是网上找的)
      toBase64(file) {
        const self = this;
        let reader = new FileReader();
        reader.onloadend = function () {
          self.uploadImgBase64 = reader.result;
        };
        if (file) {
          reader.readAsDataURL(file);
        }
      },

style样式:

/*上传照片样式*/
  .upload-img-div {
    width: 130px;
    height: 130px;
    position: relative;
    border: 1px dashed #d9d9d9;
    border-radius: 6px;
    text-align: center;
  }

  .addFeedbackUpload-img {
    overflow: hidden;
    width: 130px;
    height: 130px;
  }

  .addFeedbackUpload-img:hover {
    border-color: #C80505;
    color: #C80505;
  }

  .addFeedbackUpload-img .avatar-uploader-icon {
    text-align: center;
    z-index: 100;
    font-size: 50px;
    color: #8c939d;
    width: 130px;
    line-height: 80px;
    height: 100px;
  }

  .addFeedbackUpload-img:hover .avatar-uploader-icon {
    color: #C80505;
  }

  .addFeedbackUpload-img .upload__tip {
    font-size: 12px;
    text-align: center;
    z-index: 10;
  }

  /*上传照片的删除*/
  .delUploadImg {
    border-radius: 50%;
    position: absolute;
    top: -10px;
    font-size: 20px;
    right: -10px;
    z-index: 999;
    color: #8c939d;
  }

  .delUploadImg:hover {
    color: #C80505;
  }

最后请求体的数据就是这样:
在这里插入图片描述
本人菜鸟,有很多地方写的不好~

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: VueElementUI是一对非常强大的前端开发工具,可以帮助我们快速实现增删改查功能。具体实现步骤如下: 1. 安装VueElementUI 首先需要安装VueElementUI,可以使用npm或yarn进行安装。 2. 创建Vue组件 创建一个Vue组件,包含增删改查的功能。可以使用ElementUI提供的组件,如表格、表单、对话框等。 3. 实现数据绑定 使用Vue的数据绑定功能,将组件中的数据和页面中的元素进行绑定。可以使用v-model指令实现双向数据绑定。 4. 实现增删改查功能 使用Vue的方法和事件处理功能,实现增删改查的功能。可以使用axios或fetch等工具进行数据的请求和响应。 5. 完成样式设计 使用ElementUI提供的样式和自定义样式,完成页面的样式设计。 以上就是使用VueElementUI实现增删改查功能的基本步骤。需要注意的是,具体实现过程可能会因为项目需求的不同而有所差异。 ### 回答2: Vue ElementUI 是一套基于 Vue.js 的开源 UI 组件库,提供了丰富的组件和样式库,使开发人员可以更方便、快速地创建美观,符合规范的项目界面。本文将以 Vue ElementUI 为基础,介绍如何实现增删改查功能。 一、安装 Vue ElementUI 首先,需要安装 Vue.js 和 ElementUI。 在命令行中执行以下命令安装: ``` npm install vue npm install element-ui ``` 二、创建 Vue ElementUI 项目 在命令行中执行以下命令来创建一个新的 Vue ElementUI 项目。 ``` vue create vue-elementui-demo ``` 三、在Vue文件中引入ElementUI组件库 修改App.vue文件,引入ElementUI组件库。 ``` <template> <div id="app"> <el-header>Header</el-header> <el-main>Main Content</el-main> <el-footer>Footer</el-footer> </div> </template> <script> import ElementUI from 'element-ui'; import 'element-ui/lib/theme-chalk/index.css'; export default { name: 'app', components: { 'el-header': ElementUI.Header, 'el-main': ElementUI.Main, 'el-footer': ElementUI.Footer } }; </script> ``` 四、创建增删改查页面 首先,在src目录下创建一个名为views的文件夹,用于存放页面组件。在views文件夹中新建一个名为user.vue的组件文件用于实现增删改查页面。 创建一个表格用于显示用户列表,并添加一个操作列,用于添加、编辑和删除操作。代码如下: ``` <template> <div class="user"> <el-button @click="handleCreate">新建</el-button> <el-table :data="tableData" style="width: 100%"> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="gender" label="性别"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> <el-table-column label="操作"> <template slot-scope="scope"> <el-button @click="handleEdit(scope.row)">编辑</el-button> <el-button @click="handleDelete(scope.row)">删除</el-button> </template> </el-table-column> </el-table> </div> </template> <script> export default { data() { return { tableData: [ {name: "张三", gender: "男", age: "18"}, {name: "李四", gender: "女", age: "20"}, {name: "王五", gender: "男", age: "22"} ] } }, methods: { handleCreate() { // TODO: 弹出新建对话框 }, handleEdit(row) { // TODO: 弹出编辑对话框 }, handleDelete(row) { // TODO: 弹出删除确认对话框,确认后从tableData中删除该行数据 } } } </script> ``` 五、实现新建、编辑、删除对话框 为了实现新建、编辑、删除操作,需要实现对应的对话框组件。创建一个名为user-dialog.vue的组件文件用于实现这些对话框。 代码如下: ``` <template> <el-dialog :title="title" :visible.sync="dialogVisible"> <el-form :model="form" label-position="left" label-width="80px"> <el-form-item label="姓名"> <el-input v-model="form.name"></el-input> </el-form-item> <el-form-item label="性别"> <el-radio-group v-model="form.gender"> <el-radio label="男">男</el-radio> <el-radio label="女">女</el-radio> </el-radio-group> </el-form-item> <el-form-item label="年龄"> <el-input v-model="form.age"></el-input> </el-form-item> </el-form> <div slot="footer" class="dialog-footer"> <el-button @click.native="dialogVisible = false">取消</el-button> <el-button type="primary" @click.native="handleSave">保存</el-button> </div> </el-dialog> </template> <script> export default { props: { title: { type: String, required: true }, visible: { type: Boolean, required: true }, form: { type: Object, required: true } }, computed: { dialogVisible: { get() { return this.visible; }, set(val) { this.$emit('update:visible', val); } } }, methods: { handleSave() { this.$emit('save'); } } } </script> ``` 在user.vue中引入user-dialog.vue组件,并为每个操作添加对应的处理函数来弹出对应的对话框。 代码如下: ``` <template> <div class="user"> <el-button @click="handleCreate">新建</el-button> <el-table :data="tableData" style="width: 100%"> <!-- 省略的列 --> </el-table> <user-dialog title="新建用户" :visible.sync="createDialogVisible" :form="createForm" @save="handleCreateSave"/> <user-dialog title="编辑用户" :visible.sync="editDialogVisible" :form="editForm" @save="handleEditSave"/> <el-dialog title="删除确认" :visible.sync="deleteDialogVisible"> <p>确定要删除“{{deleteForm.name}}”吗?</p> <div slot="footer" class="dialog-footer"> <el-button @click.native="deleteDialogVisible = false">取消</el-button> <el-button type="danger" @click.native="handleDelete">删除</el-button> </div> </el-dialog> </div> </template> <script> import UserDialog from '@/views/user-dialog.vue'; export default { components: { UserDialog }, data() { return { tableData: [ {id: 1, name: "张三", gender: "男", age: "18"}, {id: 2, name: "李四", gender: "女", age: "20"}, {id: 3, name: "王五", gender: "男", age: "22"} ], createDialogVisible: false, createForm: { name: "", gender: "男", age: "" }, editDialogVisible: false, editForm: { id: 0, name: "", gender: "", age: "" }, deleteDialogVisible: false, deleteForm: { id: 0, name: "" } } }, methods: { handleCreate() { this.createForm.name = ""; this.createForm.gender = "男"; this.createForm.age = ""; this.createDialogVisible = true; }, handleCreateSave() { const id = Math.max(0, ...this.tableData.map(item => item.id)) + 1; const data = {... this.createForm, id}; this.tableData.push(data); this.createDialogVisible = false; }, handleEdit(row) { this.editForm.id = row.id; this.editForm.name = row.name; this.editForm.gender = row.gender; this.editForm.age = row.age; this.editDialogVisible = true; }, handleEditSave() { const index = this.tableData.findIndex(item => item.id === this.editForm.id); if (index >= 0) { this.tableData.splice(index, 1, this.editForm); } this.editDialogVisible = false; }, handleDelete(row) { const index = this.tableData.findIndex(item => item.id === row.id); if (index >= 0) { this.tableData.splice(index, 1); } this.deleteDialogVisible = false; }, handleDeleteSave() { this.handleDelete(this.deleteForm); } } } </script> ``` 以上就是如何使用 Vue ElementUI 实现增删改查功能的介绍,希望对你有所帮助。 ### 回答3: Vuejs是目前最流行的前端框架之一,随着其火爆的发展,越来越多的公司和开发者喜欢使用Vuejs开发项目,其中Vuejs与element-ui的组合是目前最常用的一种方式,element-ui提供了一整套完整的UI组件库,可以轻松地实现页面开发。在实现增删改查功能时,Vuejs与element-ui非常适合,可以极大地提高我们的开发效率,让我们快速实现各种功能。 首先,我们需要安装Vue-cli 3.x版本,使用Vue-cli创建一个Vue项目,安装element-ui库。我们还需要安装axios库,它可以用来与后端API通信。 接下来,我们需要创建一个列表页,将数据展示页面上,同时还需要添加按钮以执行相应的操作。这个列表页可以通过element-ui的table组件来实现,同时使用axios库与后端api通信,获取数据并将其渲染到页面上。 在实现增加数据功能时,我们可以通过一个Dialog弹窗来实现,通过展示表单进行新增数据操作。此时我们就需要用到element-ui的Dialog组件,将表单组件放在Dialog里面,同时使用axios与后端进行通信。 修改数据同样也可以使用弹窗进行实现,只需要在弹窗的表单里填入需要修改的数据,通过axios向后端发送更新请求即可。 最后,删除数据可以通过一些操作按钮来处理,例如:删除按钮,勾选数据后点击删除按钮即可。在处理完删除数据请求之后,使用axios与后端进行通信。 总之,使用Vuejs与element-ui一起开发增删改查功能是一种很高效的方式,这个组合可以大大提高我们前端开发的效率,减少开发周期。同时各种组件也可以通过element-ui的样式来保证我们UI的一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值