避免在可重用组件中直接改变 prop

Posted

技术标签:

【中文标题】避免在可重用组件中直接改变 prop【英文标题】:Avoid mutating a prop directly in reusable components 【发布时间】:2019-10-24 02:01:33 【问题描述】:

我正在尝试重用我在组件文件中创建的自定义下拉列表,其中 props 是下拉列表中的值选项。当我开始选择下拉菜单时,我意识到 vue 警告消息:

[Vue 警告]:避免直接改变 prop,因为每当父组件重新渲染时,该值都会被覆盖。相反,使用基于道具值的数据或计算属性。正在变异的道具:“item”

最佳实践是什么以及我应该如何编写才能不具有道具变异值?

<template>
  <v-app>
    <SearchSelect
        v-model="newItem.a"
        :options="aList"></SearchSelect>
    <SearchSelect
        v-model="newItem.b"
        :options="bList"></SearchSelect>
    <SearchSelect
         v-model="newItem.c"
         :options="cList"></SearchSelect>
  </v-app>
</template>



<script>
export default 
  name: "Sales",
  data() 
    return 
       aList: [
           value: "A1", text: "A1" ,
           value: "A2", text: "A2" ,
           value: "A3", text: "A3" ,
           value: "A4", text: "A4" ,
           value: "A5", text: "A5" 
       ],
       bList: [
           value: "B1", text: "B1" ,
           value: "B2", text: "B2" ,
           value: "B3", text: "B3" 
       ],
       cList: [
           value: "C1", text: "C1" ,
           value: "C2", text: "C2" ,
           value: "C3", text: "C3" 
       ],
     
   
  
;
</script>

【问题讨论】:

请分享&lt;SearchSelect /&gt;组件的代码。 【参考方案1】:

您无需更改属性,而是向父级发出事件。然后,父级会改变该值,并且该新值通常会回流到子级的属性中。

父级中的 v-model 指令通过将它“拥有”的数据 v 绑定到 :value property 并监听 @input v-on 事件来工作。

在您的情况下,newItem.a 的所有者应该更新它,但很可能SearchSelect 正在设置它而不是发出事件。

您还可以通过使用状态管理来避免将$emit 传递给父级,在这种情况下,store 将是真相的来源;然后您将使用commitdispatch 而不是emit

【讨论】:

是的,我在检查我的代码后设法解决了它。似乎突变后的原因是由于我在组件中设置了一个值。 &该值在我正在重用的文件中发生了变化。无论如何,我真的很感激这个

以上是关于避免在可重用组件中直接改变 prop的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Vue.js 在可重用组件之间添加自定义内容

Vue TSX - 如何告诉 Typescript 在可重用组件中允许使用 HTML 属性?

11.将props转成slos方式来提高组件可重用性

Vue 3 可重用错误处理和 handleSubmit 在可重用“useForm”函数中使用组合 api

如何在可重用的应用程序中将命名空间 url 与 django 一起使用

如何在可重用的 tableView 单元格中更新 UITextfield 中的文本值,每个单元格中的值不同