如何使用道具 vuejs 在子组件中打开和关闭模式?

Posted

技术标签:

【中文标题】如何使用道具 vuejs 在子组件中打开和关闭模式?【英文标题】:How to open and close a modal within a child component using a prop, vuejs? 【发布时间】:2020-05-03 21:07:27 【问题描述】:

我目前有以下子组件

  <Edit
     @fetchInfo="fetchInfo"
     :agencyData="agency"
     :dialogEdit.sync="dialogEdit"
   ></Edit>

基本上包含一个模态

一开始是假的,以免显示模态:

data()
 return 
    dialogEdit: false
 

通过我做的方法:

open()
  this.dialogEdit = true;

在我的&lt;Edit&gt;&lt;/Edit&gt; 组件中,我有:

<el-dialog title="Editar" :visible.sync="dialogEdit" >
</el-dialog>

并通过道具收到:

 props: ["dialogEdit"],

但是当从子组件关闭模式时,我收到一个错误

[Vue 警告]:避免直接改变一个 prop,因为它的值会是 每当父组件重新渲染时被覆盖。相反,使用 基于道具值的数据或计算属性。道具存在 变异:“对话框编辑”

【问题讨论】:

你能显示关闭模式的代码吗?确保您没有直接更改道具的值 This 可能会对您有所帮助。 【参考方案1】:

首先,显然您正在使用 Element UI。

但是,正如错误所暗示的,您正在直接修改dialogEdit。通过单击X 关闭元素ui 模式时,dialogEdit 变为false。您可以使用计算属性解决此问题,例如 this answer 中所建议的。

由于您使用的是 Element UI,因此您还有另一种可能来解决这个问题。该对话框具有事件before-close,该事件在模式关闭之前触发。在那里,您可以将 dialogEdit 的新布尔值发送给父级。因此,将:dialogEdit.sync="dialogEdit" 保留在子标签中,并将before-close 添加到对话框和要处理的函数中,在其中发出新的false 值:

<el-dialog title="Editar" :before-close="handleClose" ....>

JS:

methods: 
  handleClose() 
    this.$emit('update:dialogEdit', false);
  
,

如果你的模态中有一些按钮来关闭模态,你可以在那里添加相同的功能:

<el-button type="primary" @click="handleClose">Close</el-button>

SANDBOX

【讨论】:

【参考方案2】:

很难理解你的问题。你应该详细说明。

所有这些都在同一个文件中吗?如果在这种情况下您不需要创建props,因为data() 部分中已经有 dialogEdit。 props 值永远不会重新定义,所以如果是这种情况,只需删除道具。

如果这不能解决您的问题,请更新您的问题并提供更好的解释,因为我只看到一个文件。

【讨论】:

以上是关于如何使用道具 vuejs 在子组件中打开和关闭模式?的主要内容,如果未能解决你的问题,请参考以下文章

如何在子组件和父组件之间捕获或同步道具值?

如何根据父组件的点击事件打开添加模式-vuejs

使用传播属性时如何在子组件中获取道具

Vuejs 2将道具对象传递给子组件并检索

vue js 2:在挂载函数中访问道具

Vuejs如何在子组件中使用Vue-slick?