美文网首页
vue父子传参场景集锦(一)

vue父子传参场景集锦(一)

作者: 追卓2018 | 来源:发表于2019-06-11 21:10 被阅读0次

父传子数据,子修改数据,父不改

场景: 列表(父组件)点击,弹出表单并传递当前行数据到表单(子组件),表单使用双向绑定(elementUI el-form),需求是实现表单可编辑(v-model),且不修改列表数据(取消时列表数据未变).

  1. 直接使用props属性内数据,可以实现表单和列表数据修改同步(不符子不改父的原则),切换点击行时可以同步当前行数据

    <Edit :articleForm='rowData' />//父调用子组件 rowData:{title:"xx",content:"xx"}
     export default {
         data() {
             return {
                 rowData:{},
             }
         },
         methods(){
             edit(row) {//行点击事件
                 this.rowData = row;
             },
         }
     }
    
    <el-form :model="articleForm" ref='articleForm'>//子组件
     <el-form-item label="标题">
         <el-input v-model="articleForm.title" placeholder="请输入标题"></el-input>
     </el-form-item>
    </el-form>
    export default {
     data() {
         return {
         };
     },
     props: [
         'articleForm',
         'type',
         'reload'
     ],
    }
    
  1. 在data里将父组件传递的数据进行一次赋值(别名),实现父子组件取消双向绑定(Object.assign).(无法在切换行时将父组件传递的props同步到articleForm数据)

    <Edit :rowData='rowData' />//父调用子组件 rowData:{title:"xx",content:"xx"}
    export default {
         data() {
             return {
                 rowData:{},
             }
         },
         methods(){
             edit(row) {//行点击事件,copy行数据
                 this.rowData = row;
             },
         }
     }
    
    <el-form :model="articleForm" ref='articleForm'>//子组件
     <el-form-item label="标题">
         <el-input v-model="articleForm.title" placeholder="请输入标题"></el-input>
     </el-form-item>
    </el-form>
    export default {
     data() {
         return {
             //articleForm:this.rowData,//别名
             articleForm:Object.assign({},this.rowData)//别名,并避免绑定
         };
     },
     props: [
         'rowData',
         'type',
         'reload'
     ],
    }
    
  2. props接受数据,使用computed赋值,实现切换行更改articleForm.

    <Edit :rowData='rowData' />//父调用子组件 rowData:{title:"xx",content:"xx"}
     export default {
         data() {
             return {
                 rowData:{},
             }
         },
         methods(){
             edit(row) {//行点击事件
                 this.rowData = row;
             },
         }
     }
    
    <el-form :model="articleForm" ref='articleForm'>//子组件
     <el-form-item label="标题">
         <el-input v-model="articleForm.title" placeholder="请输入标题"></el-input>
     </el-form-item>
    </el-form>
    export default {
         data() {
             return {
             };
         },
         props: [
             'rowData',
             'type',
             'reload'
         ],
         computed: {
             articleForm: function() {
                 //return this.rowData//切换行可以同步父组件传递的新数据,且子组件会更改父组件数据,等同于方案1
                 return Object.assign({},this.rowData)//切换行可以同步父组件传递的新数据,但子组件无法编辑数据
             }
         },
     }
    
  3. 在data里将父组件传递的数据进行copy,实现父子组件取消双向绑定.使用watch监听实现切换行时将父组件数据同步到articleForm数据,符合需求

    <Edit :rowData='rowData' />//父调用子组件 rowData:{title:"xx",content:"xx"}
     export default {
         data() {
             return {
                 rowData:{},
             }
         },
         methods(){
             edit(row) {//行点击事件
                 this.rowData = row;
             },
         }
     }
    
    <el-form :model="articleForm" ref='articleForm'>//子组件
     <el-form-item label="标题">
         <el-input v-model="articleForm.title" placeholder="请输入标题"></el-input>
     </el-form-item>
    </el-form>
    export default {
     data() {
         return {
             img_file: [],
             articleForm:{}
             //articleForm:Object.assign({},this.rowData)//别名,并copy
         };
     },
     props: [
         'rowData',
         'type',
         'reload'
     ],
     watch:{
             rowData: {
                 deep: true,
                 immediate: true,//立刻监听,不用在data里进行第一次赋值
                 handler: function (val, oldVal) { 
                     this.articleForm = Object.assign({},val);
                 },
             }
         },
     }
    
  4. 在父组件进行数据源深copy,子组件就可以随意了,符合需求(最佳)

    <Edit :articleForm='rowData' />//父调用子组件 rowData:{title:"xx",content:"xx"}
     export default {
         data() {
             return {
                 rowData:{},
             }
         },
         methods(){
             edit(row) {//行点击事件,copy行数据
                 this.rowData = Object.assign({},row);
             },
         }
     }
    
    <el-form :model="articleForm" ref='articleForm'>//子组件
     <el-form-item label="标题">
         <el-input v-model="articleForm.title" placeholder="请输入标题"></el-input>
     </el-form-item>
    </el-form>
    export default {
     data() {
         return {
             img_file: [],
         };
     },
     props: [
         'articleForm',//或者使用computed赋值(改名)
         'type',
         'reload'
     ],
     }
    

相关文章

  • vue父子传参场景集锦(一)

    父传子数据,子修改数据,父不改 场景: 列表(父组件)点击,弹出表单并传递当前行数据到表单(子组件),表单使用双向...

  • 06.父子组件 (VUE全栈开发学习笔记)

    以下,节选自08.Vue传值方式 3.父子组件传参 使用场景:父子组件间 3.1. 父传子 子组件定义属性: 父组...

  • vue父子组件传参(异步请求数据)

    vue父子组件传参采用props方式 异步请求数据采用watch监听数据的更改

  • Vue组件通信

    Vue 组件之间的通信,通常我们遇到的都是父子组件之间的通信 一、父子组件传参 子组件定义 Props 属性; 父...

  • vue 父子组件传参

    引用组件时,首先import引入,再注册,最后方可使用。同时注意,如果是驼峰式helloWorld ,在调用时就要...

  • vue 父子组件传参

  • vue父子组件传参

    1、父组件可以使用 props 把数据传给子组件。2、子组件可以使用 $emit 触发父组件的自定义事件。 vm....

  • 31.vue传参

    1.vue传参 vue传参使用路由传参params,query,或者使用vuex,localStorage,vue...

  • vue组件传参问题

    在vue项目中会经常遇到组件传参问题,今天就来了解一下父子组件和兄弟组件传参 父组件传值给子组件 *父组件通过 ...

  • vue组件通信

    vue的组件传参的方式父子组件传参1.prop和emit是子传父,子组件监听一个事件,父组件调用并接受子组件传递过...

网友评论

      本文标题:vue父子传参场景集锦(一)

      本文链接:https://www.haomeiwen.com/subject/aodcfctx.html