快餐栏自动关闭后如何在vuex中更改状态

时间:2018-07-30 06:03:50

标签: vue.js vuejs2 vuex vuetify.js

我使用vuetify组件创建了Snackbar组件,并将该快餐栏组件导入了其他组件。我正在将道具从父母发送到孩子的快餐栏组件。小吃店会在一段时间后自动关闭。此时出现错误,例如“避免直接更改道具,因为每当父组件重新渲染时,该值就会被覆盖。而是使用基于道具值的数据或计算属性”。

快餐栏会在3秒钟后自动关闭。关闭快餐栏后如何将状态设置为false。

小吃栏组件

<v-snackbar 
                :timeout="timeout"
                :color="color"
                :top="y === 'top'"
                :bottom="y === 'bottom'"
                :right="x === 'right'"
                :left="x === 'left'"
                :multi-line="mode === 'multi-line'"
                :vertical="mode === 'vertical'"
                v-model="snackbar"
            >
                {{ text }}
                <v-btn flat color="pink" @click.native="snackbarClose"><v-icon>{{close}}</v-icon></v-btn>
            </v-snackbar> 

道具

props: ["snackbar", "y", "x", "mode", "timeout", "color", "close", "text", "submit"],

小吃栏组件中的方法

methods: {
        snackbarClose () {
            this.$store.commit("snackbarClose", false)
            // this.$emit('snackbarClose', false)
        }
    }

父组件

<Snackbar 
            :close="close"
            :snackbar="snackbarBox"
            :y="y"
            :x="x"
            :mode="mode"
            :timeout="timeout"
            :color="snackbarColor"
            :text="snackbarText"
            :submit="text"
        />

父组件中的数据

data(){
return{
 y: "top",
      x: "right",
      mode: "multi-line",
      timeout: 3000,
      text: "",
      color: "",
      close: "close",
}
}

在父组件中导入吸气剂

 ...mapGetters([ "snackbarBox"])

vuex 变异

snackbarClose: (state, payload) => {
        state.snackbarBox = payload
    },

状态

snackbarBox: false,

获取者

snackbarBox: state => {
        return state.snackbarBox;
    },

如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

我在准备Snackbar组件时遇到了同样的问题,并且在“超时”完成之前,我使用了观察程序来更改$ state。默认情况下,快餐栏会在6秒钟后关闭,但我使用setTimeout的时间为4秒来修改状态并在6秒钟之前将其关闭。 就我而言,我正在使用ts,但我认为您可以使用它。

小吃栏组件

<template>
  <div>
    <v-snackbar v-model="snackbarData.show"  :color="snackbarData.color" bottom >
      {{snackbarData.message}} 
    </v-snackbar>
  </div>
</template>

<script lang="ts">
import Vue from "vue";
import Component from "vue-class-component";
import { Watch, Prop } from "vue-property-decorator";

@Component({})
export default class SnackBar extends Vue {

@Prop({default:null})    
snackbarData!: Object 

 @Watch("snackbarData.show", { deep: true })
  onShowChanges(value: any) {
    if (value === true) {
      const snackbar: any = {
        show: false,
        message:'',
        color: null, 
     };
    setTimeout( () => {
      this.$store.commit('updateMainSnackbar', snackbar);
      }, 4000)
  } 
  }
}

已存储

这是我的对象,但如果需要更多属性,则应添加它们。

   mainSnackbar: {
        show: false,
        message: '',
        color: null
    }

静音

  updateMainSnackbar (state:any, data: any){
      state.mainSnackbar.show = data.show;
      state.mainSnackbar.message = data.message;
      state.mainSnackbar.color = data.color;
    }

导入并包含组件

导入组件并传递属性

<template>
   <SnackBar :snackbarData="mainSnackbar" />
</template>

// ----------
<script lang="ts">
import Vue from "vue";
import { Component } from "vue-property-decorator";

import SnackBar from "SnackBar.vue"
@Component({
  components: { SnackBar }
})
export default class OurComponent extends Vue {

// Computed

 get mainSnackbar(){
    return this.$store.state.mainSnackbar;
  }

执行该突变以激活Snackbar

使用您想要在小吃栏中显示的数据调用变异。就我而言,我正在使用一种方法。

setSnackBar(){
  const data= {
        show: true,
        message:'The message you want to show',
        color: '#ffff', 
     };
  this.$store.commit('updateMainSnackbar', data);
}

我希望它能为您提供帮助。

答案 1 :(得分:-1)

您可以在snackbar中观看Snackbar component吗?

类似:

watch: {
  snackbar: function(newVal) {
    if (!newVal) {
       this.snackbarClose()
    }
  }
}