我使用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;
},
如何解决这个问题?
答案 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;
}
使用您想要在小吃栏中显示的数据调用变异。就我而言,我正在使用一种方法。
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()
}
}
}