更新 vuejs 后 - 停止监听事件
After the update vuejs - stopped listening to events
- vuejs-2.5.13
- Laravel 框架 5.4.36
- MacOS10.13.3
这是我的事件-bus.js
import Vue from 'vue';
export const EventBus = new Vue();
事件创建于 mediaSelectButton.js
<template>
<router-link :to="'/' + name + '/criterias'" v-on:click.native="selected" class="btn btn-success btn-md col-xs-12">
Выбрать
</router-link>
</template>
<script>
import { EventBus } from '../../additional/event-bus.js';
export default {
props: {
name: {
type: String,
required: true
},
media: {
type: String,
required: true
},
countLikes: {
type: Number,
required: true
},
countComments: {
type: Number,
required: true
},
text: {
type: String
},
hashTags: {
type: Array
}
},
data: ()=> {
return {
}
},
methods: {
selected: function () {
const result = {
media: this.media,
socialName: this.name,
text: this.text,
hashTags: this.hashTags,
countLikes: this.countLikes,
countComments: this.countComments
};
EventBus.$emit('selected-media', result);
}
}
}
</script>
此事件监听table.js组件
<script>
import { EventBus } from '../../additional/event-bus';
export default {
data: () => {
return {
likeIcon: require('./likeHeart.svg'),
commentIcon: require('./comment.svg'),
countLikes: 0,
countComments: 0,
selectedMedia: '',
socialName: '',
text: '',
hashTags: [],
criteriasList: [],
pendingRequest: true,
hashTagChecked: false
}
},
beforeRouteEnter(to, from, next){
if (/^\/\w+\/medies(\/)?$/.test(from.path) || /^\/\w+\/roulette(\/)?$/.test(from.path)) {
next();
} else {
next('/');
}
},
methods: {
goBack() {
this.$route.meta.navBack = true;
window.history.length > 1
? this.$router.go(-1)
: this.$router.push('/')
},
criterias(data) {
axios.post('/api/table/get', {
social: data
})
.then(response => {
this.pendingRequest = false;
this.criteriasList = response.data;
})
.catch(e => {
this.$router.push('/');
});
}
},
created: () => {
EventBus.$on('selected-media', result => {
console.log(result) // <-- fail here!
this.selectedMedia = data.media;
this.socialName = data.socialName;
this.text = data.text;
this.hashTags = data.hashTags;
this.countLikes = data.countLikes;
this.countComments = data.countComments;
this.criterias(this.socialName);
})
}
}
</script>
问题:事件selected-media中的数据使用createdhuck不来
但是,如果我在 beforeRouteEnter 中收听事件
示例:
beforeRouteEnter(to, from, next){
if (/^\/\w+\/medies(\/)?$/.test(from.path) || /^\/\w+\/roulette(\/)?$/.test(from.path)) {
EventBus.$on('selected-media', result => {
console.log(result); // <--- It's work!
});
next();
} else {
next('/');
}
},
一切正常,因为这是必要的。
请告诉我这里的错误在哪里,我需要它在 huck created.
中工作
不确定这是否有效,但让我们试试吧。
由于它在 beforeRouteEnter
中有效但在 created
钩子中无效,我认为原因是 当事件发出时, table.js component
尚未创建.
使用 nextTick 应该可以解决问题。
this.$nextTick(() => {
EventBus.$emit('selected-media', result);
});
- vuejs-2.5.13
- Laravel 框架 5.4.36
- MacOS10.13.3
这是我的事件-bus.js
import Vue from 'vue';
export const EventBus = new Vue();
事件创建于 mediaSelectButton.js
<template>
<router-link :to="'/' + name + '/criterias'" v-on:click.native="selected" class="btn btn-success btn-md col-xs-12">
Выбрать
</router-link>
</template>
<script>
import { EventBus } from '../../additional/event-bus.js';
export default {
props: {
name: {
type: String,
required: true
},
media: {
type: String,
required: true
},
countLikes: {
type: Number,
required: true
},
countComments: {
type: Number,
required: true
},
text: {
type: String
},
hashTags: {
type: Array
}
},
data: ()=> {
return {
}
},
methods: {
selected: function () {
const result = {
media: this.media,
socialName: this.name,
text: this.text,
hashTags: this.hashTags,
countLikes: this.countLikes,
countComments: this.countComments
};
EventBus.$emit('selected-media', result);
}
}
}
</script>
此事件监听table.js组件
<script>
import { EventBus } from '../../additional/event-bus';
export default {
data: () => {
return {
likeIcon: require('./likeHeart.svg'),
commentIcon: require('./comment.svg'),
countLikes: 0,
countComments: 0,
selectedMedia: '',
socialName: '',
text: '',
hashTags: [],
criteriasList: [],
pendingRequest: true,
hashTagChecked: false
}
},
beforeRouteEnter(to, from, next){
if (/^\/\w+\/medies(\/)?$/.test(from.path) || /^\/\w+\/roulette(\/)?$/.test(from.path)) {
next();
} else {
next('/');
}
},
methods: {
goBack() {
this.$route.meta.navBack = true;
window.history.length > 1
? this.$router.go(-1)
: this.$router.push('/')
},
criterias(data) {
axios.post('/api/table/get', {
social: data
})
.then(response => {
this.pendingRequest = false;
this.criteriasList = response.data;
})
.catch(e => {
this.$router.push('/');
});
}
},
created: () => {
EventBus.$on('selected-media', result => {
console.log(result) // <-- fail here!
this.selectedMedia = data.media;
this.socialName = data.socialName;
this.text = data.text;
this.hashTags = data.hashTags;
this.countLikes = data.countLikes;
this.countComments = data.countComments;
this.criterias(this.socialName);
})
}
}
</script>
问题:事件selected-media中的数据使用createdhuck不来
但是,如果我在 beforeRouteEnter 中收听事件
示例:
beforeRouteEnter(to, from, next){
if (/^\/\w+\/medies(\/)?$/.test(from.path) || /^\/\w+\/roulette(\/)?$/.test(from.path)) {
EventBus.$on('selected-media', result => {
console.log(result); // <--- It's work!
});
next();
} else {
next('/');
}
},
一切正常,因为这是必要的。 请告诉我这里的错误在哪里,我需要它在 huck created.
中工作不确定这是否有效,但让我们试试吧。
由于它在 beforeRouteEnter
中有效但在 created
钩子中无效,我认为原因是 当事件发出时, table.js component
尚未创建.
使用 nextTick 应该可以解决问题。
this.$nextTick(() => {
EventBus.$emit('selected-media', result);
});