• 【Vue.js】自定义事件,全局事件总线,订阅与发布


    目录

    一,自定义事件

    1 绑定事件 

    2 @ 或 v-on  

    3 代码展示 小案例

     二,全局事件总线

    1 安装

    2 组件的使用

    三,订阅与发布

    1,含义

    2,安装 pubsub:npm i pubsub-js

    3,发布消息 接收消息 取消订阅 将由下列代码展示


    一,自定义事件

    1 绑定事件 

    定义:子给父传递数据:通父组件给子组件绑定自定义事件

    简单来讲就是:子组件通过自定义事件给父组件传递数据

    2 @ 或 v-on  

    3 代码展示 小案例

    下面是父组件中的代码块

    1. <script>
    2. import Person from './components/Person.vue';
    3. export default {
    4. name: 'app',
    5. data() {
    6. return {
    7. title: 'web2209',
    8. msg: '自定义事件'
    9. }
    10. },
    11. components: {
    12. Person
    13. },
    14. methods:{
    15. showName(name){//这个参数是子组件传的值
    16. console.log("App得到了姓名",name);
    17. }
    18. }
    19. }
    20. script>
    21. <style>
    22. style>

    接下来是子组件的代码块

    1. <script>
    2. export default {
    3. name: 'Person',
    4. data() {
    5. return {
    6. name: '张三',
    7. age: 19
    8. }
    9. },
    10. methods: {//调用父组件中的自定义事件
    11. sendName() {
    12. this.$emit('getName',this.name)
    13. }
    14. },
    15. }
    16. script>
    17. <style>
    18. style>

    效果图

     二,全局事件总线

    作用: 一种组件间通信的方式 适用于任意组件间通信。

    1 安装

    安装全局事件总线:在入口文件main.js中,给VM添加$bus,任意组件都可以在原型中调用

    1. new Vue({
    2. render: h => h(App),
    3. //给VM添加$bus
    4. beforeCreate() {
    5. Vue.prototype.$bus = this
    6. }
    7. }).$mount('#app')

    2 组件的使用

    给全局事件总线,绑定自定义事件getName 谁需要接收数据就再谁绑定。

    子组件①:LiSi中

    1. <script>
    2. export default{
    3. name:'LiSi',
    4. data(){
    5. return{
    6. name:'李四',
    7. age: 20
    8. }
    9. },
    10. methods:{
    11. sendName(){
    12. this.$bus.$emit("getName",this.name)
    13. }
    14. },
    15. mounted() {
    16. this.$bus.$on("getAge",(age)=>{
    17. console.log("李四组件得到的age:",age);
    18. })
    19. }
    20. }
    21. script>
    22. <style>
    23. style>

    子组件②:ZhangSan中   

    注意:组件销毁之前卸载自定义事件

    1. <script>
    2. export default{
    3. name:'ZhangSan',
    4. data(){
    5. return{
    6. name:'张三',
    7. age: 19
    8. }
    9. },
    10. mounted() {
    11. this.$bus.$on('getName',(name)=>{
    12. console.log("张三组件得到的name:",name);
    13. })
    14. },
    15. methods:{
    16. sendAge(){
    17. this.$bus.$emit("getAge",this.age)
    18. },
    19. estroyGetName(){
    20. this.$destroy();
    21. }
    22. },
    23. beforeDestroy() {
    24. // console.log('正在销毁中.....');
    25. this.$bus.$off();//销毁全部组件
    26. // this.$bus.$off("getName");//销毁getName
    27. // this.$bus.$off("getAge");//销毁getAge
    28. }
    29. }
    30. script>
    31. <style>
    32. style>

    父组件中的代码块为