vue父子组件传值-06-03

自定义组件:父组件中使用v-model将值传入子组件,并且子组件也能将值传回父组件,v-model是双向传递。

而数据绑定:v-bind(缩写为:)只能将数值传给子组件,而无法将值传给父组件。

大概知道这些就开始写了。

父组件:
            <upload
              v-model="this.uploadFileListTest"
              :uploadFileData="{'category':'insurance'}">
            </upload>
子组件:
<template id="upload">
    <div>        
        <el-upload
            action="/api/public/fileUpload"
            :data="uploadFileData"
            name="files"
            listType="picture-card"
            multiple
            :file-list="uploadFileList"
            :on-success = "fileUploadSucc"
            :on-remove = "pictureRemove"
            :on-preview = "showPic">
            <i class="el-icon-plus"></i>
        </el-upload>
        <el-dialog :visible.sync="showPicDialogVisible">
            <img width="100%" :src="imageUrl" alt="">
        </el-dialog>
    </div>
</template>
<script>
    export default {
        create(){
        }

        ,data:function(){
            return {
                //uploadFileList:[],
                showPicDialogVisible: false
                //操作0表示添加,1表示删除
                ,operate:0
                //用于展示页面的url
                ,imageUrl:''
                ,tempfileList:this.uploadFileList
            }
        },

        props:[
                'uploadFileData'
                ,'listType'
                ,'uploadFileList'
                ],
        methods:{
            fileUploadSucc(response, file, fileList){
                console.log(fileList);
                this.tempfileList.push({url:response.returnData.list[0].url});
                console.log(this.tempfileList);
                this.$emit('input', this.tempfileList);
            },
            pictureRemove(file, fileList){
                console.log(fileList);
                this.tempfileList = [];
                // this.tempfileList = fileList;
                console.log(this.tempfileList);
                for(var item in fileList){
                    this.tempfileList.push({url:fileList[item].response.returnData.list[0].url});
                }
                // this.tempfileList.push({url:file.response.returnData.list[0].url});
                this.$emit('input', this.tempfileList);
            }
            //展示图片弹窗使能,url赋值
            ,showPic(file){
                this.imageUrl = file.url;
                this.showPicDialogVisible = true;
            }

        },
        mounted(){
        },
        computed: {

        }
    }
</script>

数据通过父组件中的v-model传入子组件中props中的同名变量中。不对呀,如果是v-bind:后面接的是子组件中props的中的变量名,等于后面接的是父组件中的变量名,(如::uploadFileData="{'category':'insurance'}")。这样才能实现父子传值,但是v-model中并没有说传到props 中的哪个变量中,如何匹配呢?

公司的代码如下:

子组件:
<template>
  <div>
    <el-upload ref="upload"
               action="/api/public/uploadimage"
               :data="uploadPicData"
               name="upfile"
               accept="image/*"
               listType="picture-card"
               :multiple="false"
               :file-list="uploadPicList"
               :show-file-list="false"
               :on-preview="handlePictureCardPreview"
               :on-success="handlePictureSuccess">
                <i class="el-icon-plus"></i>
    </el-upload>
    <el-dialog :visible.sync="dialogVisible">
      <img width="100%" :src="dialogImageUrl" alt="">
    </el-dialog>
  </div>
</template>
<script>
  export default {
    data: function () {
      return {
        uploadPicList: [],
        imageUrl: this.value,
        dialogImageUrl: '',
        dialogVisible: false
      }
    },

    props: ['value',
      'uploadPicData',
      'show-file-list', 'label'],
    methods: {


      handlePictureSuccess(res, file, filelist) {
        file.name = res.name;
        file.url = res.url;
        this.imageUrl = file.url;
        this.uploadPicList = filelist;
        //this.$emit('handleUpload',file.url);
        this.$emit('input', file.url);
      },
      handlePictureCardPreview(file) {
        this.dialogImageUrl = file.url;
        this.dialogVisible = true;
      }
    },
    mounted() {
    },
    computed: {}
  }
</script>

父组件:
                </el-form-item>
                <el-form-item label="车型视频" prop="carModelVideo">
                  <newLifeUploadFile :uploadFileData="uploadPicData"
                                          v-model="tempModel.carModelVideo"></newLifeUploadFile>
                </el-form-item>

我们观察上面的例子可以知道:父组件v-model的变量名和子组件中props没有相同的,所以肯定不是以同名变量进行匹配,而是将v-mdel中的值传入props 的value中,后端通过$emit()调用v-model的预设事件input,传回给父组件,从而实现v-model值的双向传递。

          <el-table-column align="center" prop="" label="测试" width="150">
            <upload
              v-model="this.uploadFileList"
              :uploadFileData="{'category':'insurance'}">
            </upload>
          </el-table-column>
props:[
                'uploadFileData'
                ,'listType'
                // ,'uploadFileList'
                ,'value'
                ],
        methods:{
            fileUploadSucc(response, file, fileList){
                console.log(this.value);
                console.log(fileList);
                this.tempfileList.push({url:response.returnData.list[0].url});
                console.log(this.tempfileList);
                this.$emit('input', this.value);
            },

使用emit的时候会报错:
Cannot use 'in' operator to search for 'uploadFileList' in null"


image.png

错误原因:The in operator can only be used to check if a property is in an object. You can't search in strings, or in numbers, or other primitive types.
参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/in_operator_no_object
emit会在使用的时候用in ,in 操作的不能为null 或者 undefined。

只要在props 中加多一个和父类同名的变量就不会了
不知道为什么

之后又会了,不是很明白

官方文档:
https://cn.vuejs.org/v2/guide/components.html#%E5%9C%A8%E7%BB%84%E4%BB%B6%E4%B8%8A%E4%BD%BF%E7%94%A8-v-model

emit改为:this.emit('input',event.target.value);
报错:$event is not defined

如果将this.value通过JSON.parse()转成json,则报错如下
VM841:1 Uncaught SyntaxError: Unexpected token o in JSON at position 1
at JSON.parse (<anonymous>)
at VueComponent.fileUploadSucc (0.9ca2d645166ada457aec.hot-update.js:49)
at VueComponent.boundFn (app.js:266086)
at VueComponent.handleSuccess (app.js:116089)
at VueComponent.boundFn (app.js:266086)
at Object.onSuccess (app.js:116611)
at XMLHttpRequest.onload (app.js:116763)

最后发现是因为点出dialog的时候就有报错导致的,不是用el-form-item。所以传值有问题,解决之后就没有问题了。
<el-form-item label="备注照片" prop="uploadFileList2">

语法部分知道怎么做了,现在需要将逻辑完善。
图片的操作只有两种,删除和添加
添加:直接将返回的url push到list中即可,如果传过来的list有初始值也没有什么逻辑问题。
删除:1.将数组清空,再将数据放入:如果初始有值如何处理?
这个时候我们需要知道fileList 和 传入的value有什么区别。
value:


image.png

fileList:


image.png

说明经过fileUploadSucc能够将push成功,并且fileList只是将包括了所有显示出来的文件,然后呢?如果想要清空之后再来添加,必须要原来的传入的list,即value,以及。。想不明白了

情况1:传入的是null,没有删除
情况2:传入的list有一个项,点击删除,清空,fileList放入,因为fileList已经为null了,所以不会传入,循环的时候会报错吗?

2.找到对应的项,进行删除:多用一个项存储uid

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容

  • 组件(Component)是Vue.js最核心的功能,也是整个架构设计最精彩的地方,当然也是最难掌握的。...
    六个周阅读 5,614评论 0 32
  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 5,050评论 0 29
  • Vue 实例 属性和方法 每个 Vue 实例都会代理其 data 对象里所有的属性:var data = { a:...
    云之外阅读 2,210评论 0 6
  • 主要还是自己看的,所有内容来自官方文档。 介绍 Vue.js 是什么 Vue (读音 /vjuː/,类似于 vie...
    Leonzai阅读 3,350评论 0 25
  • VUE介绍 Vue的特点构建用户界面,只关注View层简单易学,简洁、轻量、快速渐进式框架 框架VS库库,是一封装...
    多多酱_DuoDuo_阅读 2,710评论 1 17