当前位置: 首页 > 知识库问答 >
问题:

避免直接的prop突变会增加变量的重新声明

曾鸿振
2023-03-14

我有一个对话框组件:

<div v-if="dialog">
    <p>Worlds smallest dialog</p>
    <button @click="dialog = false>Close Dialog</button> // Avoid mutating props directly...
</div>
//Instance options:
props: {
    dialog: {
        type: Boolean,
        default: false
    }

}

如果我想在父组件中使用它:

<button @click="dialog = true">Open Dialog</button>
<dialog :dialog="dialog"></dialog>
// Data object:
data: {
    dialog: false,
}

这是有效的,我的意思是应用程序不会崩溃。但是我被警告说,我应该声明一个数据/计算属性;这很奇怪,因为如果我想变异5-7个道具,对于它们中的每一个,我也必须在子组件上声明一个数据属性?如果父级有xyz数据道具,那么如果我想在子级上变异它们,子级也应该声明它们?我们不是在重复自己吗?我如何防止这种重复?

共有1个答案

锺离自明
2023-03-14

父级和子级都应该彼此独立地声明数据/道具。这样做的目的是分离每个组件的关注点。只有组件知道它实际需要什么。如果删除或向子级或父级添加属性,这两种实现都会发生变化,因为它们直接由数据/道具耦合。通过在两个组件中声明,更改一个不会立即破坏两个组件的API。

此外,直接注入组件的突变道具被认为是一种反模式,原因如下。从文档支柱突变中考虑这一点:

现在,在本地变异一个道具被认为是一种反模式,例如,声明一个道具,然后在组件中设置this.myProp='someOtherValue'。由于新的渲染机制,每当父组件重新渲染时,子组件的本地更改都将被覆盖。

Vue的咒语之一是“道具放下,事件上升”。事件不关心父母的实现,不管父母是否在听,它们都会触发。这进一步缓解了父级数据更改的情况,因为您也不必更改子级的道具来防止API崩溃。

在您的示例中,具有的子对话框

下面是一个对话框组件发出“关闭”事件且根本不需要使用道具的示例:

Vue.component('my-dialog', {
  template: `
    <div>
      <p>Worlds smallest dialog</p>
      <button @click="$emit('close')">
        Close Dialog
      </button>
    </div>
  `
})

new Vue({
  el: '#app',
  data() {
    return { dialog: false }
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js"></script>

<div id="app">
  <button @click="dialog = true">Show Dialog</button>
  <my-dialog v-show="dialog" @close="dialog = false">
  </my-dialog>
</div>

 类似资料:
  • 我得到警告: app.js:87486[Vue警告]:避免直接更改prop,因为每当父组件重新呈现时,该值将被覆盖。相反,使用基于道具值的数据或计算属性。被变异的道具:“喜欢计数” 我的刀锋 Vue代码

  • 我有一个带有道具的组件,我想将值从false修改为true,但我有一个消息表单chrome控制台 在父组件中,我有一个函数(myFunction),它接受一个参数(value)。 我需要像这样保留我的参数,但我还需要从子组件检索emit的值,以更改myData的值,而不改变child中的props。 https://codesandbox.io/s/distracted-wiles-w8vwf 谢

  • 如何解决此错误消息: [Vue warn]:避免直接改变道具,因为每当父组件重新渲染时,该值将被覆盖。相反,使用基于道具值的数据或计算属性。道具变异:“抽屉” 父组件: 子组件:

  • 我是Vue JS的新手,我遇到了这个问题,我试图通过将父道具传递给孩子来制作数据表 我犯了这个错误 [Vue warn]:避免直接改变道具,因为每当父组件重新渲染时,该值将被覆盖。相反,使用基于道具值的数据或计算属性。道具正在变异:“editem” 这是我的密码 这是我的页面: 这是我的组件:

  • 目前有4种组合 增加小时。 增加天数。 减去小时。 减去天。 如果增加了一个新的期间(比如年),则有必要在每种情况下添加一个新的If语句: 此外,如果添加了新的意外情况(组合,特别是情况),则有必要重复逻辑以验证周期。 您有改进解决方案的建议吗?模式推荐,功能接口实现,欢迎任何推荐。 提前谢谢!

  • 问题内容: 如何在简短的变量声明中从其他块中重新声明变量? 关于此问题有很长的话题,但现在我很感兴趣如何解决此问题。 问题答案: 简短的变量声明的Go规范很明确: 短变量声明可以重新声明变量,只要它们最初是在同一块中以相同类型声明的,并且至少一个非空变量是新变量。 因此,在简短的变量声明中,您无法重新声明最初在其他块中声明的变量。 这是一个如何通过在内部块中声明局部变量()并将其()分配给在外部块