美文网首页
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父子传参场景集锦(一)

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