Vue 子组件向父组件传值

问题

开发中,会发现很多公共部分,可以独立封装起来,让更多的地方统一调用,这就是组件的作用,今天简单封装了一个图片上传的组件,当子组件中图片上传成功后,怎么传到父级组件呢?

代码

直接上代码

父组件
<upload-image
label="网站LOGO"
prop="site_logo"
:value="basicForm.site_logo"
@func="getImg"
/>
<script>
import uploadImage from '../../components/uploadImage.vue'
export default {
  components: { uploadImage },
    // 其他代码
}
子组件
<!--
 * @Description:单图上传
 * @User: Vijay <1937832819@qq.com>
 * @Date: 2020-11-21 20:42:50
-->
<template>
  <div>
    <el-form-item :label="label" :prop="fieldName">
      <el-upload
        class="avatar-uploader"
        :action="uploadUrl"
        :headers="{ Authorization: 'Bearer ' + this.token }"
        :show-file-list="false"
        :on-success="handleAvatarSuccess"
        :before-upload="beforeAvatarUpload"
      >
        <img v-if="img" :src="img" class="avatar" />
        <i v-else class="el-icon-plus avatar-uploader-icon"></i>
      </el-upload>
    </el-form-item>
  </div>
</template>
<script>
import util from '@/libs/util'
import axios from 'axios'
export default {
  props: {
    label: {
      type: String,
      default: ''
    },
    value: {
      type: String,
      default: ''
    },
    fieldName: {
      type: String,
      default: ''
    }
  },
  data() {
    return {
      img_file: {},
      token: util.cookies.get('token'),
      uploadUrl: process.env.VUE_APP_API + 'admin/article/upload',
      img: this.value
    }
  },
  methods: {
    beforeAvatarUpload(file) {
      const isJPG = file.type === 'image/jpeg'
      const isLt2M = file.size / 1024 / 1024 < 2
      if (!isJPG) {
        this.$message.error('上传头像图片只能是 JPG 格式!')
      }
      if (!isLt2M) {
        this.$message.error('上传头像图片大小不能超过 2MB!')
      }
      return isJPG && isLt2M
    },
    handleAvatarSuccess(res, file) {
      this.img = URL.createObjectURL(file.raw)
      // func: 是父组件指定的传数据绑定的函数,this.img:子组件给父组件传递的数据
      this.$emit('func', this.img)
    },
    // 绑定@imgAdd event
    $imgAdd(pos, $file) {
      // 第一步.将图片上传到服务器.
      var formdata = new FormData()
      formdata.append('file', $file)
      this.img_file[pos] = $file
      axios({
        url: this.uploadUrl,
        method: 'post',
        data: formdata,
        headers: {
          Authorization: 'Bearer ' + this.token,
          'Content-Type': 'multipart/form-data'
        }
      })
        .then((res) => {
          // let _res = res.data
          // 第二步.将返回的url替换到文本原位置![...](0) -> ![...](url)
          // this.$refs.md.$img2Url(pos, _res.url)
        })
        .catch((err) => {
          console.log('err', err)
        })
    },
    $imgDel(pos) {
      delete this.img_file[pos]
    }
  }
}
</script>

解释

子组件通过this.$emit()的方式将值传递给父组件

// func: 是父组件指定的传数据绑定的函数,this.img:子组件给父组件传递的数据
this.$emit('func', this.img)

注意:这里的func是父组件中绑定的函数名
父组件中接收传递值

@func="getImg"
 getImg(data) {
 // 这里可以拿到传过来的值
 console.log(data)
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Galloping-Vijay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值