首页 > 其他分享 >React & TS 里面两个实用小技巧

React & TS 里面两个实用小技巧

时间:2023-09-25 17:31:53浏览次数:35  
标签:status 实用 逻辑 const 支付 TS React 按钮 statusData

在工作中我们会经常使用技巧黑魔法,本篇主要讲两个,希望能帮助到大家!

文章内容看情况而定,不一定是React里面专属的!

TS动态取数据

这里其实也不知道起什么标题,具体还是看内容吧。

平常做法(JS)

JS中,我经常使用对象去定义数据,然后去获取它,像下面这样

// 订单状态 
// 只是举个栗子 不代表真实订单状态就是这样

const statusData = {
  1:"待支付",
  2:"已支付",
  3:"已完成",
  4:"已取消",
  5:"已评价"
}


// 中文状态
// status 是后端给的

const statusText = statusData[status] || "无效订单"

或者是下面这种

// 订单状态 
// 只是举个栗子 不代表真实订单状态就是这样

const statusData = {
  "WAITING":"待支付",
  "PAID":"已支付",
  "FINISHED":"已完成",
  "CANCELED":"已取消",
  "EVALUATED":"已评价"
}


// 中文状态
// status 是后端给的

const statusText = statusData[status] || "无效订单"

上面这两种的区别是状态是否是数字形式的,其他的是类似的

TS中

TS中上述方法都不行,会提示错误的,虽然没有实质影响,但是红杠提示就很难受!

第一种数字
const status:number = 1
const statusData = {
  1:"待支付",
  2:"已支付",
  3:"已完成",
  4:"已取消",
  5:"已评价"
}
console.log(statusData[status])

React & TS 里面两个实用小技巧_React

错误提示

第二种字符串
const status:string = "WAITING"
const statusData = {
  "WAITING":"待支付",
  "PAID":"已支付",
  "FINISHED":"已完成",
  "CANCELED":"已取消",
  "EVALUATED":"已评价"
}
console.log(statusData[status])

React & TS 里面两个实用小技巧_React_02

错误提示

解决办法

数字类型

使用数组代替对象

这样其实取的就是数组的下标了

const status:number = 1
const statusData = [null,"待支付","已支付","已完成","已取消","已评价"]

const statusText = statusData[status] || "无效订单"
字符串类型
enum  statusData {
    WAITING="待支付",
    PAID="已支付",
    FINISHED="已完成",
    CANCELED="已取消",
    EVALUATED="已评价"
}
    
type statusDataKey = keyof typeof statusData;

const status:statusDataKey = "WAITING"

const statusText = statusData[status]

这种方式就是先定义枚举,然后使用keyof typeof获取一个字符串字面量联合类型

即上述的"WAITING" | "PAID" | "FINISHED" | "CANCELED" | "EVALUATED"

这样status的类型就符合对应的了

额外多嘴一下:
有些时候数字状态并没有我们想象的那么简单怎么办

比如后端是1、5、7、100,那我使用数组岂不是很麻烦也不优雅

我们可以采取上述字符串的方法,把后端的状态转化为ORDER_1、ORDER_5、ORDER_7

只有连续的纯数字使用数组才方便一点!

antdesign弹框按钮隐藏的问题

这里有多种解决方案,我是之前有按钮的情况下,后期加上了无按钮情况的显示,采取的最小改动

原逻辑

const ReactDemo = () => {
  
  const cancle = () => {
    // 关闭逻辑
  }
  
  const handleFinish = () => {
    // 确定按钮逻辑
  }

  return (
    <Modal 
      title="我是弹框"
      width="1200"
      open={true}
      maskClosable={false}
      destroyOnClose={true}
      centered={true}
      onCancel={cancle}
      onOk={handleFinish}
    >
    </Modal>
  )
}

上述示例是React中使用ant design里面Model弹框组件的基本示例

先如今我们要增加某种情况下隐藏底部确定取消按钮,这里有多种方案

footer自定义

footer={null}时底部将不存在,我们可以做一下改变

const ReactDemo = () => {
  
  const cancle = () => {
    // 关闭逻辑
  }
  
  const handleFinish = () => {
    // 确定按钮逻辑
  }
  
  // 是否显示底部
  const flag = true

  return (
    <Modal 
      title="我是弹框"
      width="1200"
      open={true}
      maskClosable={false}
      destroyOnClose={true}
      centered={true}
      footer={footer ? (
        <Button onClick={cancle}>取消</Button>
        <Button onClick={handleFinish}>确定</Button>
      ) : null}
    >
    </Modal>
  )
}

上面是简单的书写,并未有样式和相关逻辑调整,也能实现效果,但可能还需要调整方法内部,比如loading状态等

障眼法

我采用的是这种方式,直接障眼法,隐藏按钮

const ReactDemo = () => {
  
  const cancle = () => {
    // 关闭逻辑
  }
  
  const handleFinish = () => {
    // 确定按钮逻辑
  }
  
  // 是否显示底部
  const flag = true

  return (
    <Modal 
      className={flag ? 'noFooter' : ''}
      title="我是弹框"
      width="1200"
      open={true}
      maskClosable={false}
      destroyOnClose={true}
      centered={true}
      onCancel={cancle}
      onOk={handleFinish}
    >
    </Modal>
  )
}
.noFooter .ant-modal-footer{
   display: none;
}

这里最好在确定事件加上处理,但不需要考虑之前的逻辑

// 确定时间处理
const handleFinish = () => {
    // 确定按钮逻辑
    if(!flag) return 
    // 之前的逻辑
}

具体还是看改动量吧!

如果感觉有帮助,麻烦3连(关注、赞、在看),谢谢! 后面会更新更多。

React & TS 里面两个实用小技巧_技巧_03

关注公众号了解更多

标签:status,实用,逻辑,const,支付,TS,React,按钮,statusData
From: https://blog.51cto.com/u_16123566/7597759

相关文章

  • Python爬虫基础(四):使用更方便的requests库
    文章目录系列文章索引一、requests库的使用1、官方文档2、安装requests库3、简单使用4、使用get请求5、使用post请求6、使用代理二、实战1、实战:实现古诗文网的登录(1)找到登录页面(2)登录操作需要的数据(3)获取隐藏域中的数据(4)获取验证码图片(5)登录操作(6)获取我的收藏2、实战:使用超级鹰验......
  • React:我们的用法习惯可能是错误的(不优雅)
    React:我们的用法习惯可能是错误的(不优雅)今天学到了2023-01-088,361阅读4分钟 在我们React的日常开发中一些常用的写法,看似运行的很好,实际可能并不优雅。学习React并不是如何如何使用它,而是如何写出优雅,干净的代码。下面举一些例子,总结了一些React开发中不好的写法及相......
  • immerjs:React开发必会技能
    immerjs:React开发必会技能龙骑士尹道长 ​关注 2人赞同了该文章我们都知道React追求的泛式是数据不可变,一般情况下state或者props改变才进入render阶段;如果我们创建的state是一个一般数据类型,他就是一个不可变的值,如果需要改变我们需要重新创建一个state......
  • WPF中以MVVM方式,实现RTSP视频播放
    前言视频播放在上位机开发中经常会遇到,基本上是两种常见的解决方案1.采用厂家提供的sdk和前端控件进行展示,常见的海康/大华都提供了相关sdk及文档2.开启相机onvif协议,捅过rtsp视频流进行播放,前端可以采用web方式,或者wpf中的视频控件进行展示。项目需求,决定了最终采用开启相机on......
  • 支撑位和阻力位在Renko和烛台图如何使用?FPmarkets澳福3秒回答
    很多投资者都知道,Renko图表和普通日本烛台都会采用相同的交易信号,即支撑位和阻力位。那么支撑位和阻力位在Renko和烛台图如何使用?FPmarkets澳福3秒回答。这些信号在任何时间框架上都会出现,且在蜡烛图交易中颇受欢迎。对于Renko图表而言,确定关键支撑位和阻力位同样重要吗?我们以GPB......
  • React Hooks中父组件中调用子组件方法
    import {useState,useImperativeHandle,forwardRef}from 'react';//props子组件中需要接受reflet ChildComp=(props,ref)=>{    //此处注意useImperativeHandle方法的的第一个参数是目标元素的ref引用    useImperativeHandle(ref,()=>({      ......
  • Consider using `allow_partial_search_results` setting to by
    Elasticsearchdatanode重啟導致sharding找不到家 今天遇到單位同仁重啟 Elasticsearch datanode後發現Cluster狀態變成Red的狀況,這篇記錄遇到這個問題時該怎麼處理 會遇到這個問題通常是「遺失的Datanode」大於「index.number_of_replicas」,Elasticsearchr......
  • [LeetCode] 1353. Maximum Number of Events That Can Be Attended 最多可以参加的会
    Youaregivenanarrayof events where events[i]=[startDayi,endDayi].Everyevent i startsat startDayi andendsat endDayi.Youcanattendanevent i atanyday d where startTimei<=d<=endTimei.Youcanonlyattendoneeventatanytime ......
  • ARTS打卡---第四周
    原本应该为第六周,中间两周在各种原因未打卡(需反省)Algorithm力扣中等题:https://leetcode.cn/problems/product-of-array-except-self/description/解题思路:一次遍历,由于不能用除法,因而需要按正序和逆序输出前缀积,再得出每个位置除自身的积。Review完成部件,Android的启动流程学......
  • 03_Bootstrap基础组件03
    7表单7.1基本实例设置了.form-control类的表单元素,默认设置宽度属性为width:100%;。将label元素和表单元素包裹在.form-group中可以按照排好的样式进行展示。<formaction="#"method="post"><divclass="form-group"><labelfor="email1">邮箱......