直接修改props中的值,浏览器发出警告

改变了子组件中的props中的值,浏览器会发出警告
在vue文档中的单向数据流也提到了

每次父级组件发生更新时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器的控制台中发出警告。

在一次项目中,我直接更改了父组件传递给子组件的值。浏览器果然报错了。代码如下

父组件:

<template>
    <components :orderdata="orderdata" :is="tabCom[ind]"></components>
</template>
<script>
export default {
  data() {
    return {
        orderdata: []
    }
  }
}
</script>

子组件

<template>
    <div :key="index" class="bigbox" v-for="(item,index) of orderdata">
</template>
<script>
export default {
  props: {
    orderdata: {
      type: Array,
      required: true
  },
  methods: {
    cancelOrderlist(id) {
      this.$messagebox
        .confirm('确定取消此订单?')
        .then(action => {
          if (action === 'confirm') {
            cancelOrder(this.token, id).then(res => {
              getOrder(this.token).then(res => {
                this.orderdata = res.data.data.data // 这里直接更改props中的值,浏览器发出警告
              })
            })
          }
        })
        .catch(err => {
          if (err === 'cancel') {
          }
        })
    }
}
</script>

但是我确实需要修改props的值,并将其数据渲染给dom元素
那么解决办法就是不直接更改props的值,而是更改其引用类型,这样控制台就不会报错了。

父组件:

<template>
    <components :orderobj="orderobj" :is="tabCom[ind]"></components>
</template>
<script>
export default {
  data() {
    return {
      orderobj: {
        orderdata: []
      }
    }
  }
}
</script>

子组件

<template>
    <div :key="index" class="bigbox" v-for="(item,index) of orderobj.orderdata">
</template>
<script>
export default {
  props: {
    orderobj: {
      type: Object,
      required: true
  },
  methods: {
    cancelOrderlist(id) {
      this.$messagebox
        .confirm('确定取消此订单?')
        .then(action => {
          if (action === 'confirm') {
            cancelOrder(this.token, id).then(res => {
              getOrder(this.token).then(res => {
                this.orderobj.orderdata = res.data.data.data // 这里直接更改props中的值,浏览器发出警告
              })
            })
          }
        })
        .catch(err => {
          if (err === 'cancel') {
          }
        })
    }
}
</script>

这样就不是改变值,而是通过改变引用类型。这是因为父组件传递给子组件的是一个引用,也就是内存地址。我们改变了orderdata的值,并没有改变内存地址。所以不会发出警告

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Vue ,`props` 是父组件向子组件传递的属性,它是单向数据流,子组件不能直接修改 `props` 的。但是,如果你需要在子组件内部修改 `props` 的,你可以使用 `data` 属性来创建一个与 `props` 同名的数据属性,并在子组件内部对该数据属性进行修改。 以下是一个示例代码: 父组件模板: ```html <template> <div> <h1>父组件</h1> <ChildComponent :message="message"></ChildComponent> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { message: 'Hello from parent!' }; } }; </script> ``` 子组件模板(ChildComponent.vue): ```html <template> <div> <h2>子组件</h2> <p>{{ modifiedMessage }}</p> <button @click="updateMessage">修改消息</button> </div> </template> <script> export default { props: ['message'], data() { return { modifiedMessage: this.message }; }, methods: { updateMessage() { this.modifiedMessage = 'Modified message in child!'; } } }; </script> ``` 在上述代码,父组件通过 `:message="message"` 将 `message` 属性传递给子组件。子组件的 `props` 定义了接收该属性,并将其赋给 `modifiedMessage` 数据属性。 在子组件的 `updateMessage` 方法,我们可以直接使用 `this.modifiedMessage` 来修改 `modifiedMessage` 的。这个修改只会影响子组件内部的数据,而不会影响到父组件传递的 `message` 属性。 这样,子组件可以在内部修改 `props` 的,并在模板展示修改后的。但需要注意的是,这种修改仅限于子组件内部,在父组件 `message` 的不会受到影响。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值