vue 如何在子组件中修改 props 的值

13,247 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解。

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

图片.png

解决方案

(1)data 中重定义数据

这种情况适用于用 prop 用来传递一个初始值;这个子组件接下来希望将其作为一个本地的 prop 数据来使用。 在这种情况下,最好定义一个本地的 data property 并将这个 prop 用作其初始值:

props: ['initialCounter'],
data: function () {
  return {
    counter: this.initialCounter
  }
}

(2)通过计算属性

这个 prop 以一种原始的值传入且需要进行转换。 在这种情况下,最好使用这个 prop 的值来定义一个计算属性:

props: ['size'],
computed: {
  normalizedSize: function () {
    return this.size.trim().toLowerCase()
  }
}

(3)通过 $emit 事件传递

父组件:

<template>//父组件
   <CommonDialog
     :title="dialogTitle"
     :showDialog.sync="isShowDialog"
     :footer="true"
     :width="dialogWidth"
   >
  	....
   </CommonDialog>
</template>

子组件

//子组件 弹框是否打开props: showDialog
<el-dialog :title="title" :visible="showDialog" :show-close="false" :width="width">
  <i class="el-dialog__headerbtn" @click="closeModal">
    <span class="iconfont iconclose"></span>
  </i>
  <div class="dialog-body">
      <slot></slot>
  </div>
  <div v-if="!footer" slot="footer" class="dialog-footer">
    <slot name="footer"></slot>
  </div>
</el-dialog>

事件:

closeModal() {
   this.$emit("update:showDialog", false);
 },