Vue 子组件向父组件传值

臭大佬 2020-11-21 21:14:09 131
Vue 
简介 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)
 }