本文首發在我的的博客上,地址:重慶崽兒Brand,歡迎訪問~~~~html
最近作公司項目遇到這樣一個需求:
因爲以前一直在工做中用的mui這個前端框架,框架本身封裝有實現這個需求的方法,因此實現就很簡單,可是如今公司項目用的是Vue,首先想到的方法可能就是用localstorage或者Vuex來實現了,因爲項目比較小,幾乎不會用到Vuex,若是隻是這裏用到的話,感受Vuex不是特別合適,因而就pass掉了。localstorage又感受逼格不夠高,因而也pass掉了,在羣裏和網上一番諮詢,因而準備使用Vue官方也有推薦的一個非父子組件通訊的方法:eventBus
HomePage:前端
<template> <div> <div> <router-link to="/">首頁</router-link> <router-link to="/second">secondPage</router-link> <div style="margin-top: 30px;"> this HomePage {{msg}} </div> </div> </div> </template> <script> export default { name: 'HomePage', data () { return { msg: 'Home' } } } </script>
SecondPage:vue
<template> <div> <router-link to="/" >首頁</router-link> <router-link to="/second">secondPage</router-link> <button @click="toHome()">點擊事件</button> <div style="margin-top: 30px;">this secondPage</div> </div> </template> <script> export default { name: 'SecondPage', data() { return {} }, methods: { toHome() { history.back(); } } } </script>
頁面效果如圖:vue-router
根據官方文檔( 官方文檔地址 ),先在main.js文件中聲明一個全局的空的Vue實例:
window.Bus = new Vue();
而後修改HomePage和SecondPage兩個頁面的代碼,segmentfault
// HomePage <script> export default { name: 'HelloWorld', data () { return { msg: 'Home' } }, methods: { fn() { Bus.$on("postData",data=> { console.log(data) //console.log(this.msg) this.msg = data; }) } }, mounted() { this.fn(); } } </script>
<script> export default { name: 'SecendPage', data() { return {} }, methods: { toHome() { Bus.$emit("postData","hello00"); history.back(); } } } </script>
從控制檯能夠看到,當咱們從SecondPage返回到HomePage的時候控制檯已經打印出咱們從SecondPage傳過來的值了。可是!!!!,不要高興的太早。。。。。,看看頁面上!!!並非顯示的咱們傳過來的值。。。而是初始值,這是什麼狀況!!!????前端框架
最後,經過羣裏大佬給的資料(資料再此!!!!),終於實現了想要的效果框架
資料中說:由於vue-router在切換時,先加載新的組件,等新的組件渲染好可是還沒掛在前,銷燬舊的組件,而後再掛載組件ide
在路由切換時,執行的方法依次是:post
新組件: beforeCreate 新組件: created 新組件: beforeMount 舊組件: beforeDestroy 舊組件: destroy 新組件: mounted
因此,新組件只要在舊組件beforeDestroy以前,$on事件就能成功接收到。ui
現將兩個頁面的部分代碼作以下修改:
// HomePage <script> export default { name: 'HelloWorld', data () { return { msg: 'Home' } }, created(){ Bus.$on("postData",data=> { this.msg = data; }) } } </script>
<script> export default { name: 'SecendPage', data() { return {} }, methods: { toHome() { history.back(); } }, destroyed(){ Bus.$emit("postData","hello00"); } } </script>
歡迎留言說說大家在vue開發中遇到的一些值得卸載小本本上的問題唄~~~