小程序页面开发中的状态管理

问题背景:

完成小程序订单详情界面的时候,要根据订单的状态以及订单的类型进行页面的区分。

完成方案一:

inStoreService=(status)=>{
    switch (status) {
      case SERVICE_ORDER_STATUS.SERVICE_ORDER_WAIT_PAY:
        return this.inStoreServiceWaitPay();
      case SERVICE_ORDER_STATUS.SERVICE_ORDER_WAIT_USE:
        return this.inStoreServiceWaitUse();
    }
  }
  doorToDoorService=(status)=>{
    switch (status) {
      case SERVICE_ORDER_STATUS.SERVICE_ORDER_WAIT_PAY:
        return this.doorToDoorServiceWaitPay();
      case SERVICE_ORDER_STATUS.SERVICE_ORDER_WAIT_USE:
        return this.doorToDoorServiceWaitUse();
    }
  }

  renderServeContent=(addressType,status)=>{
    switch (addressType) {
      case ORDER_ADDRESS_TYPE.IN_STORE_SERVICE:
        return this.inStoreService(status);
      case ORDER_ADDRESS_TYPE.DOOR_TO_DOOR_SERVICE:
        return this.doorToDoorService(status);
    }
  }

首先根据订单的类型区分为上门服务到店服务

renderServeContent=(addressType,status)=>{
    switch (addressType) {
      case ORDER_ADDRESS_TYPE.IN_STORE_SERVICE:
        return this.inStoreService(status);
      case ORDER_ADDRESS_TYPE.DOOR_TO_DOOR_SERVICE:
        return this.doorToDoorService(status);
    }
  }

再根据订单状态进行进一步区分

inStoreService=(status)=>{
    switch (status) {
      case SERVICE_ORDER_STATUS.SERVICE_ORDER_WAIT_PAY:
        return this.inStoreServiceWaitPay();
      case SERVICE_ORDER_STATUS.SERVICE_ORDER_WAIT_USE:
        return this.inStoreServiceWaitUse();
    }
  }
  doorToDoorService=(status)=>{
    switch (status) {
      case SERVICE_ORDER_STATUS.SERVICE_ORDER_WAIT_PAY:
        return this.doorToDoorServiceWaitPay();
      case SERVICE_ORDER_STATUS.SERVICE_ORDER_WAIT_USE:
        return this.doorToDoorServiceWaitUse();
    }
  }

再渲染出对应的部分

  inStoreServiceFinished=()=>{
    const{items={}} = this.props;
    const {productQuantity,//数量
      productName,//名字
      productPic,//图片
      productPrice,//价格
    }=items;
    return(
      <View>
        <View className='serveContent_Item'>
          <View className='serveContent_Item_A'><Image src={productPic} className='img_card' /></View>
          <View className='serveContent_Item_B'>
            <View className='serveContent_Item_B_1'>{this.sliceString(productName)}</View>
            <View className='serveContent_Item_B_2'>数量{productQuantity}</View>
            <View style={{display:'flex'}}>
              <View className='serveContent_Item_B_3'>
                ¥{productPrice}
              </View>

            </View>
          </View>
        </View>

        <View className='order-card-footer-btns'>
          <View className='btn-one-more-order'>
            再来一单
          </View>
        </View>

      </View>
    )
  }

这样分步进行状态管理的坏处就是当新增了一个状态之后,需要修改多个函数,并且随着时间的推移,维护代码会变得更加困难。

完成方案二:

使用复合状态将两个状态封装起来,这样新增状态之后,只用改两个函数的代码就可以新增一个状态,维护起来更加清晰

parseServiceOrderStatus = (addressType,status) => {
    let compositeStatus = 0;
    switch (addressType){
      case ORDER_ADDRESS_TYPE.IN_STORE_SERVICE:
        switch (status){
          case SERVICE_ORDER_STATUS.SERVICE_ORDER_WAIT_PAY:
            compositeStatus = SERVICE_ORDER_COMPOSITE_STATUS.SERVICE_ORDER_WAIT_PAY_IN_STORE_SERVICE;
            break;
          case SERVICE_ORDER_STATUS.SERVICE_ORDER_WAIT_USE:
            compositeStatus = SERVICE_ORDER_COMPOSITE_STATUS.SERVICE_ORDER_WAIT_USE_IN_STORE_SERVICE;
            break;
          case SERVICE_ORDER_STATUS.SERVICE_ORDER_UNDER_SERVICE:
            compositeStatus = SERVICE_ORDER_COMPOSITE_STATUS.SERVICE_ORDER_UNDER_SERVICE;
            break;
          case SERVICE_ORDER_STATUS.SERVICE_ORDER_FINISHED:
            compositeStatus = SERVICE_ORDER_COMPOSITE_STATUS.SERVICE_ORDER_FINISHED_IN_STORE_SERVICE;
            break;
        }
        break;
      case ORDER_ADDRESS_TYPE.DOOR_TO_DOOR_SERVICE:
        switch (status){
          case SERVICE_ORDER_STATUS.SERVICE_ORDER_WAIT_PAY:
            compositeStatus = SERVICE_ORDER_COMPOSITE_STATUS.SERVICE_ORDER_WAIT_PAY_DOOR_TO_DOOR_SERVICE;
            break;
          case SERVICE_ORDER_STATUS.SERVICE_ORDER_WAIT_USE:
            compositeStatus = SERVICE_ORDER_COMPOSITE_STATUS.SERVICE_ORDER_WAIT_USE_DOOR_TO_DOOR_SERVICE;
            break;
          case SERVICE_ORDER_STATUS.SERVICE_ORDER_UNDER_SERVICE:
            compositeStatus = SERVICE_ORDER_COMPOSITE_STATUS.SERVICE_ORDER_UNDER_SERVICE;
            break;
          case SERVICE_ORDER_STATUS.SERVICE_ORDER_FINISHED:
            compositeStatus = SERVICE_ORDER_COMPOSITE_STATUS.SERVICE_ORDER_FINISHED_DOOR_TO_DOOR_SERVICE;
            break;
          case SERVICE_ORDER_STATUS.SERVICE_ORDER_AFTER_SALE:
            compositeStatus = SERVICE_ORDER_COMPOSITE_STATUS.SERVICE_ORDER_AFTER_SALE_DOOR_TO_DOOR_SERVICE;
            break;
        }
        break;
    }
    return compositeStatus;
  }

...

renderByCompositeStatus = (compositeStatus) => {
    console.log("compositeStatus",compositeStatus);
    switch (compositeStatus) {
      case SERVICE_ORDER_COMPOSITE_STATUS.SERVICE_ORDER_WAIT_PAY_DOOR_TO_DOOR_SERVICE://上门服务 待付款
        return this.doorToDoorServiceWaitPay();
      case SERVICE_ORDER_COMPOSITE_STATUS.SERVICE_ORDER_WAIT_PAY_IN_STORE_SERVICE://到店服务 待付款
        return this.inStoreServiceWaitPay();
      case SERVICE_ORDER_COMPOSITE_STATUS.SERVICE_ORDER_WAIT_USE_DOOR_TO_DOOR_SERVICE://上门服务 待使用
        return this.doorToDoorServiceWaitUse();
      case SERVICE_ORDER_COMPOSITE_STATUS.SERVICE_ORDER_WAIT_USE_IN_STORE_SERVICE://到店服务 待使用
        return this.inStoreServiceWaitUse();
      case SERVICE_ORDER_COMPOSITE_STATUS.SERVICE_ORDER_UNDER_SERVICE://上门服务 服务中
        return this.underService();
      case SERVICE_ORDER_COMPOSITE_STATUS.SERVICE_ORDER_FINISHED_DOOR_TO_DOOR_SERVICE://上门服务 已完成
        return this.doorToDoorServiceFinished();
      case SERVICE_ORDER_COMPOSITE_STATUS.SERVICE_ORDER_FINISHED_IN_STORE_SERVICE://到店服务 已完成
        return this.inStoreServiceFinished();
      case SERVICE_ORDER_COMPOSITE_STATUS.SERVICE_ORDER_AFTER_SALE_DOOR_TO_DOOR_SERVICE://上门服务 售后
        return this.doorToDoorServiceAfterSale();
      case -1:
        return null;
    }
  }
// 对应的复合状态
const SERVICE_ORDER_COMPOSITE_STATUS = {
  SERVICE_ORDER_WAIT_PAY_DOOR_TO_DOOR_SERVICE: 0,//订单状态为待使用,服务类型为上门服务
  SERVICE_ORDER_WAIT_PAY_IN_STORE_SERVICE: 1,//订单状态为待使用,服务类型为到店服务
  SERVICE_ORDER_WAIT_USE_DOOR_TO_DOOR_SERVICE: 2,//订单状态为待使用,服务类型为上门服务
  SERVICE_ORDER_WAIT_USE_IN_STORE_SERVICE: 3,//订单状态为待使用,服务类型为到店服务
  SERVICE_ORDER_UNDER_SERVICE: 4,//订单状态为服务中
  SERVICE_ORDER_FINISHED_IN_STORE_SERVICE:5,//订单状态为已完成,服务类型为上门服务
  SERVICE_ORDER_FINISHED_DOOR_TO_DOOR_SERVICE:6,//订单状态为已完成,服务类型为到店服务
  SERVICE_ORDER_AFTER_SALE_DOOR_TO_DOOR_SERVICE:7,//订单状态为售后,服务类型为上门服务
}

结语

这种封装状态,再根据不同的状态定义不同的行为的设计模式是状态模式,具体的可以看看菜鸟教程里的介绍或者其他大佬的博客。

这种设计模式简单来说,优点是利于扩展以及减少大量的条件语句,但缺点就是每次新增状态又要重新维护一遍代码。当状态过多时要慎用状态模式
状态模式 | 菜鸟教程 (runoob.com)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值