vue props传值层级多,子级孙子级怎么修改传参

1.出现背景

本来自己写页面的话是直接全部写在一个vue文件里,一个vue文件几千行代码基本都是小事,压根没用到组件传参,所以自己的组件传参也很烂。现在写都是把页面拆的很细的那种了,正好练练自己的组件间传参。
先上一份代码:

//主组件
<template>
  <div class='app-container'>
    <p>父组件</p>
    a {{ params.a }} -- b {{ params.b }} -- num {{ num }}
    <child :params.sync="params" :num.sync="num"></child>
  </div>
</template>
<script>
import child from './child.vue';
export default {
  data() {
    return {
      params: {
        a: 10, b: 20
      },
      num: 26
    }
  },
  components: { child },
  methods: {
    changeParams(data) {
      this.params = data
    }
  },
  provide() {
    return {
      changeParams: this.changeParams
    }
  }
}
</script>
//子组件
<template>
  <div class='app-container'>
    <p></p>
    <p>子组件</p>
    a {{ params.a }} -- b {{ params.b }} -- num {{ num }}
    <grandson :params.sync="params" :num.sync="num"></grandson>
  </div>
</template>
<script>
import grandson from './grandson.vue';
export default {
  props: {
    params: Object,
    num: Number
  },
  components: { grandson },
}
</script>
//孙组件
<template>
   <div class='app-container'>
      <p></p>
      <p>孙组件</p>
      a {{ params.a }} --num {{ num }} b <el-input v-model="params.b"></el-input>
      <el-button @click="change">change</el-button>
   </div>
</template>
<script>
export default {
   props: {
      params: Object,
      num: Number
   },
   methods: {
      change() {
         //错误的
         // this.params = {
         //    a:10,b:10
         // }
         //错误的
         //this.num = 10;
         //修改一个属性是可以的
         //this.params.b = 10
         //this.params.a = 1
         // this.$emit('update:params',{
         //    a:10,b:10
         // })
         // this.$root.eventHub.$emit('changeParams')

         // this.changeParams({ a: 10, b: 10 })

      }
   },
   inject: ['changeParams']
}
</script>

可以看到的是我们主要讲params和num传了下去
大概页面效果是这样吧
在这里插入图片描述

2.怎么在孙组件里改变传过来的值呢

2.1这样改是不行的

    //错误的
          this.params = {
             a:10,b:10
          }
         //错误的
         this.num = 10;

直接在change事件里这样改变是不可以的,直接报错
在这里插入图片描述

 this.$emit('update:params',{
            a:10,b:10
         })

这样写的话,子组件的值是可以改变的,但是依然会报错
在这里插入图片描述
在这里插入图片描述

2.2可行的方法

2.2.1 引用对象只改变单属性

可行的方法 发现只改引用对象的单属性是可以成功的!

 this.params.b = 10
         this.params.a = 1

在这里插入图片描述
但是属性多了的话可能就不太优雅了

2.2.2 provide和inject

最后可以用provide和inject来实现

//主组件
methods: {
    changeParams(data) {
      this.params = data
    }
  },
  provide() {
    return {
      changeParams: this.changeParams
    }
  }
  //孙组件
   methods: {
      change() {
         this.changeParams({ a: 10, b: 10 })

      }
   },
   inject: ['changeParams']
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue中,props是一种用于父组件向子组件传递数据的方式。通过在子组件上声明props选项,可以定义子组件可以接收的属性名和类型,并在父组件中通过绑定属性的方式将数据传递给子组件。 以下是使用props传值的基本步骤: 1. 在子组件中声明props选项,指定可以接收的属性名和类型。例如: ```javascript // 子组件 props: { message: String, count: { type: Number, default: 0 } } ``` 2. 在父组件中使用子组件,并通过绑定属性的方式将数据传递给子组件。例如: ```html <!-- 父组件 --> <template> <div> <child-component :message="parentMessage" :count="parentCount" /> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { parentMessage: 'Hello', parentCount: 10 }; } } </script> ``` 在上述代码中,父组件通过绑定属性的方式将`parentMessage`和`parentCount`传递给子组件。 3. 在子组件中使用props接收父组件传递的数据,并在模板中使用。例如: ```html <!-- 子组件 --> <template> <div> <p>{{ message }}</p> <p>{{ count }}</p> </div> </template> <script> export default { props: { message: String, count: { type: Number, default: 0 } } } </script> ``` 在子组件中,可以通过`this.message`和`this.count`来获取父组件传递的数据,并在模板中使用。 通过props传值,可以实现父子组件之间的数据传递,使得组件之间可以更好地进行通信和协作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值