首页 > 编程语言 >微信小程序中组件通信的性能优化方法有哪些?

微信小程序中组件通信的性能优化方法有哪些?

时间:2024-10-24 19:19:19浏览次数:10  
标签:哪些 微信 更新 callbacks user 组件 data setData

  1. 减少不必要的数据传递

    • 原理
      • 组件间传递的数据量越小,通信的开销就越小。每次数据传递都涉及到数据的序列化、传输和反序列化等过程,过多或过大的数据传递会增加这些操作的频率和资源消耗。
    • 示例
      • 比如在父子组件通信中,如果子组件只需要使用父组件中一个数据字段的部分信息,那么在父组件传递数据时,可以只传递该部分信息,而不是整个数据对象。假设父组件有一个包含多个属性的用户信息对象userInfo,子组件只需要用户的名字,那么父组件可以这样传递数据:
      <my - child user - name="{{userInfo.name}}"></my - child>
      
      • 而不是传递整个userInfo对象。
  2. 使用事件总线(Event Bus)优化兄弟组件通信

    • 原理
      • 传统的通过共同父组件进行兄弟组件通信的方式可能会导致父组件代码复杂,尤其是当兄弟组件较多、通信频繁时。事件总线提供了一种更直接的方式,它可以作为一个中间件,让组件之间可以直接发布和订阅事件,而不需要经过多层的属性绑定和事件触发。
    • 示例
      • 首先创建一个事件总线模块event - bus.js
      const eventBus = {
        callbacks: {},
        on(eventName, callback) {
          if (!this.callbacks[eventName]) {
            this.callbacks[eventName] = [];
          }
          this.callbacks[eventName].push(callback);
        },
        emit(eventName, data) {
          const callbacks = this.callbacks[eventName] || [];
          callbacks.forEach(callback => {
            callback(data);
          });
        }
      };
      export default eventBus;
      
      • 然后在需要通信的兄弟组件中使用它。例如,组件A发布事件:
      const eventBus = require('../../event - bus.js');
      Component({
        methods: {
          sendDataToBrother() {
            let data ='message from ComponentA';
            eventBus.emit('brother - communication - event', data);
          }
        }
      });
      
      • 组件B订阅事件:
      const eventBus = require('../../event - bus.js');
      Component({
        attached() {
          eventBus.on('brother - communication - event', this.receiveDataFromBrother);
        },
        detached() {
          eventBus.off('brother - communication - event', this.receiveDataFromBrother);
        },
        methods: {
          receiveDataFromBrother(data) {
            console.log('Received data from ComponentA:', data);
          }
        }
      });
      
  3. 优化数据更新机制 - 精准更新和批量更新

    • 精准更新(setData)
      • 原理
        • 在微信小程序中,setData方法用于更新组件的数据,从而更新视图。但是,setData的频繁调用或者传递大量不必要的数据会导致性能下降。精准更新就是只更新真正发生变化的数据部分,避免不必要的数据更新。
      • 示例
        • 假设组件中有一个包含多个属性的数据对象formData,如果只有其中一个属性inputValue发生了变化,那么在更新数据时,只更新这个属性:
        Component({
          data: {
            formData: {
              inputValue: '',
              otherProperty: 'unchanged'
            }
          },
          methods: {
            handleInputChange(e) {
              let newInputValue = e.detail.value;
              this.setData({
                'formData.inputValue': newInputValue
              });
            }
          }
        });
        
    • 批量更新(使用Object.assign或扩展运算符)
      • 原理
        • 当需要同时更新多个数据且这些更新相互关联时,批量更新可以减少setData的调用次数。通过将多个更新合并为一次setData操作,可以提高性能。
      • 示例
        • 例如,在一个列表组件中,当添加一个新项时,可能需要同时更新列表数据和一个计数变量。可以这样做:
        Component({
          data: {
            list: [],
            count: 0
          },
          methods: {
            addItem(item) {
              let newList = this.data.list.concat(item);
              let newCount = this.data.count + 1;
              this.setData({
                list: newList,
                count: newCount
              });
            }
          }
        });
        
        • 或者使用Object.assign(或扩展运算符...)来合并更新:
        Component({
          methods: {
            addItem(item) {
              let newData = Object.assign({}, this.data, {
                list: this.data.list.concat(item),
                count: this.data.count + 1
              });
              this.setData(newData);
            }
          }
        });
        
  4. 避免频繁的组件渲染(使用shouldComponentUpdate)

    • 原理
      • 在一些复杂的组件结构中,数据的变化可能会导致组件频繁地重新渲染。shouldComponentUpdate生命周期方法可以用于控制组件是否需要重新渲染。通过在这个方法中比较新旧数据,只有当数据真正发生影响视图的变化时,才允许组件重新渲染,从而减少不必要的渲染操作。
    • 示例
      • 假设一个组件接收一个user对象作为属性,只有当user对象中的nameage属性发生变化时,才需要重新渲染组件。可以在组件的.js文件中这样实现:
      Component({
        properties: {
          user: {
            type: Object,
            value: {}
          }
        },
        data: {
          currentUser: {}
        },
        attached() {
          this.setData({
            currentUser: this.properties.user
          });
        },
        methods: {
          shouldComponentUpdate(nextProps, nextData) {
            let shouldUpdate = false;
            if (nextProps.user.name!== this.properties.user.name ||
                nextProps.user.age!== this.properties.user.age) {
              shouldUpdate = true;
            }
            return shouldUpdate;
          }
        }
      });
      

标签:哪些,微信,更新,callbacks,user,组件,data,setData
From: https://blog.csdn.net/alankuo/article/details/143196259

相关文章

  • 如何在微信小程序中使用事件总线进行组件通信?
    创建事件总线(EventBus)模块目的:事件总线是一个独立的模块,用于管理事件的发布和订阅。它提供了一个集中的机制,使得组件之间可以通过发布和订阅事件来进行通信,而不需要依赖组件之间的父子关系或其他复杂的层级结构。代码实现:创建一个名为event-bus.js的文件,......
  • 如何避免在微信小程序中使用事件总线进行组件通信时出现内存泄漏?
    理解内存泄漏问题的产生原因在微信小程序中使用事件总线进行组件通信时,内存泄漏可能是由于组件在销毁后仍然被事件总线持有引用,导致无法被垃圾回收机制正常回收。例如,组件订阅了事件总线的某个事件,当组件被销毁时,如果没有正确地取消订阅,那么事件总线中仍然保存着对该组件......
  • 量化交易软件开发需要哪些技能?
    Python股票接口实现查询账户,提交订单,自动交易(1)Python股票程序交易接口查账,提交订单,自动交易(2)股票量化,Python炒股,CSDN交流社区>>>Python的优势Python在量化交易软件开发中极为重要。它易于学习,这使得开发人员能够快速上手。其丰富的库支持是一大亮点,像NumPy提供强大的......
  • Genymotion 模拟器上安装最新版本的微信并正常运行
    安装Genymotion安装步骤1安装虚拟机VirtualBox https://www.virtualbox.org/wiki/Downloads2注册Genymotion帐号 https://www.genymotion.com/account/create/3登录,下载并安装Genymotion https://www.genymotion.com/download/ android9版本的:  Genymotion-ARM-Tran......
  • element-ui 时间组件date-picker 去掉“此刻”二字
    用element-ui的时间组件时,想去掉“此刻”二字官方文档没有提供去掉这个的属性,网上查了一下,主要是通过给这个标签添加css属性,display:none,来隐藏。但是我在组件内的<el-col:span="span"><el-form-item:label="$t('historicalDataRetransmission.taskBeginTime')......
  • Zabbix添加企业微信机器人告警
    环境查看系统环境#cat/etc/redhat-releaseCentOSStreamrelease9#uname-aLinuxCentOSStream9Zabbix2035.14.0-391.el9.x86_64#1SMPPREEMPT_DYNAMICTueNov2820:35:49UTC2023x86_64x86_64x86_64GNU/Linux软件环境#zabbix_server--versionzabbix_......
  • KubeSphere 社区双周报|KubeSphere v4 添加 KubeEdge 扩展组件
    KubeSphere社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过commit的贡献者,并对近期重要的PR进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。本次双周报涵盖时间为:2024.10.11-10.24。贡献者名单近期重要更新KubeSphere......
  • 安全:centos系统默认运行的服务有哪些?(centos stream9/linux)
    一,默认自启动服务和默认运行服务的区别服务的类型:Type:定义启动时的进程行为。它有以下几种值。 simple:默认值,执行ExecStart指定的命令,启动主进程 forking:以fork方式从父进程创建子进程,创建后父进程会立即退出 oneshot:一次性进程,Systemd会等当前服务退出,再继续往......
  • 基于微信小程序的外卖点餐餐厅点餐美食点餐系统的设计与开发
    基于微信小程序的外卖点餐餐厅点餐美食点餐系统的设计与开发视频介绍:基于微信小程序的外卖点餐餐厅点餐美食点餐系统的设计与开发具体贴图链接:贴图链接缩略图如下:开发环境及工具:大等于jdk1.8,大于mysql5.5,idea,微信开发者工具技术说明:vue.js小程序java......
  • 基于微信小程序的健康生活运动社交系统的设计与开发
    基于微信小程序的健康生活运动社交系统的设计与开发视频介绍基于微信小程序的健康生活运动社交系统的设计与开发具体贴图链接:项目贴图缩略图如下:开发环境及工具:大等于jdk1.8,大于mysql5.5,idea,微信开发者工具技术说明:vue.js小程序javaspringbootmybatis......