【问题标题】:Vue closing component returns avoid mutating a prop directlyVue关闭组件返回避免直接改变道具
【发布时间】: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>

【问题讨论】:

    标签: vue.js vuejs2 vue-component


    【解决方案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;
     }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-11-07
      • 2021-05-10
      • 2017-11-11
      • 2020-06-23
      • 1970-01-01
      • 2018-03-05
      • 2019-02-07
      • 2018-08-25
      • 2019-09-11
      相关资源
      最近更新 更多