zoukankan      html  css  js  c++  java
  • 干货-vue 中使用 rxjs 进行非父子组件中传值

    一.需求背景:

    • 一般做 商城 项目都会有公共头部与底部组件,会抽出来在项目的最外层,而其他主体部分会在  <router-view class="main"></router-view> 中,
    • 有时主体部分与公共头部 或 底部会有数据交互,如商品分类列表的高亮,(点击主体部分,头部组件高亮),此时已不属于父子组件的数据传递,
    • 若将数据放到缓存中由于公共头部或底部一直都不会刷新,拿不到最新的数据,故不能实现,
    • 可以用vux,今天我们来学习用 rxjs 响应式编程库 来实现数据传输

    二.先将rxjs封装成便于操作的类

    • 安装依赖
    npm install rxjs 
    • main.js中引入,并集成
    import Vue from 'vue'
    import {subjectServer} from '@/utils/subject.server';
    Vue.use(subjectServer);
    • 在utils中创建 subject.server.js 封装类
    import { Observable, BehaviorSubject } from 'rxjs';
    
    class AjaxNoticeOneService {
      subject = new BehaviorSubject(0);
      pushParams(params) {
        this.subject.next(params);
      }
      clearParams() {
        this.subject.next(0);
      }
      getParams() {
        return this.subject.asObservable();
      }
    }
    
    export const subjectServer = {
        install(Vue, options) {
            Vue.prototype.$NotificationOneSub = new 
    }

    三.在需求页面使用

    1.需求:

      点击首页中的列表1的 更多, 跳转到详情页面,且header 上面的 列表1 高亮

     

    2.分析页面

     这个页面就是典型的 header + router-view 页面,  router-view 中又包含 home + detail 页面

    现在需要 home 与 header 之间传递数据

    3.使用封装的方法

    • 先在home中的点击事件中添加
    this.$NotificationOneSub.pushParams({ key: "moduleActive",value: index})
    • 再在 header 中接收这个方法
    <script>
    import { filter } from "rxjs/operators";
    export default { 
     data(){
        return {
           choosePage: -1,
           subscribeSub:null
        }
     },
     mounted(){
        this.subWatch()
      },
      //销毁
      destroyed() {
        if (this.subscribeSub != undefined) {
          this.subscribeSub.unsubscribe();
          this.$NotificationOneSub.clearParams();
        }
      },
      methods: {
        //监听动态表单 接受从home 传来的数据(平行组件中使用甚佳)
        subWatch() {
          const self = this;
          //本地接收提交
          this.subscribeSub = this.$NotificationOneSub
            .getParams()
            .pipe(filter(res => res !== 0))
            .subscribe(item => {
              if (item.key === "moduleActive") {
                this.choosePage = item.value;
                // console.log(item.value);
              }
            });
        },
       }      
    };
    </script>   

    注意事项:

      使用该钩子的页面,在页面销毁时,也需要把该钩子销毁掉,否则每次进来都会获取,会产生重复数据

    分享一刻:

      sjci

      斯坦福大学推出的 JavaScript 加密库,只有 6KB,API 也很简单,但可以提供最佳的安全性。

  • 相关阅读:
    Wazuh配置电子邮件警报(SMTP)
    kafka 分区重新分配脚本
    shell并发及控制并发数
    python2和python3使用pyhive
    k8s1.17安装gitlab
    nginx ssl证书 BEGIN PRIVATE KEY 转换为BEGIN RSA PRIVATE KEY
    Datax:阿里云hbase数据导入到自建hbase集群
    python3连接impala(centos7)
    Effective Java2读书笔记-类和接口(五)
    Effective Java2读书笔记-类和接口(四)
  • 原文地址:https://www.cnblogs.com/huangaiya/p/13181974.html
Copyright © 2011-2022 走看看