Vue关闭组件返回避免直接改变道具
Posted
技术标签:
【中文标题】Vue关闭组件返回避免直接改变道具【英文标题】:Vue closing component returns avoid mutating a prop directly 【发布时间】:2018-11-26 04:10:17 【问题描述】:我有一个想要在不同页面上使用的组件。嗯,它运行良好,直到第一次切换。它像以前一样显示,但是当我单击“关闭”按钮时,它会关闭,但控制台输出:
[Vue 警告]:避免直接改变一个 prop,因为它的值是 每当父组件重新渲染时被覆盖。相反,使用 基于道具值的数据或计算属性。道具存在 变异:“可见”
发现于
---> 在 src/components/Snackbar.vue 在 src/views/Login.vue
然后点击就不显示了
有什么办法解决这个问题?
Snackbar.vue
<template>
<v-snackbar v-model.sync="visible" :timeout="5000" bottom>
content
<v-btn flat color="primary" @click.native="visible = false">Close</v-btn>
</v-snackbar>
</template>
<script>
export default
name: 'snackbar',
props: [
'visible',
'content'
]
</script>
登录.vue
<template>
<div class="login">
<Snackbar :visible="snackbar.visible" :content="snackbar.content"></Snackbar>
</div>
</template>
<script>
import Snackbar from '@/components/Snackbar.vue'
export default
components:
Snackbar
,
data: function()
return
email: '',
password: '',
snackbar:
visible: false,
content: ''
,
methods:
login: function()
if (this.email != '' && this.password != '')
// Do something
else
this.snackbar.content = 'Fields can\'t be empty';
this.snackbar.visible = true;
</script>
【问题讨论】:
【参考方案1】:控制台错误由此触发:
@click.native="visible = false"
组件直接改变传入的道具。如果你想在父组件控制可见性的地方保持这种控制级别,你必须通过让 click 事件发出一个事件来做到这一点,父组件接收并设置 this.snackbar.visible = false
从而触发道具更改和子组件已隐藏。
<Snackbar :visible="snackbar.visible" :content="snackbar.content"
v-on:requestClose="close"></Snackbar>
<v-btn flat color="primary" @click.native="$emit('requestClose')">Close</v-btn>
methods:
close: function()
this.snackbar.visible = false;
【讨论】:
以上是关于Vue关闭组件返回避免直接改变道具的主要内容,如果未能解决你的问题,请参考以下文章