SHooks

SHooks api(0.5.0)

  • https://www.npmjs.com/package/shooks

SHooks

  • yarn add shooks -S
  • import { useDebounce } from ‘shooks’

useBattery [use Battery Status API]

  • 支持部分浏览器
    • Firefox:43+
    • Chrome:38+
    • Opera:25+
  • @return { charging,level,chargingTime,dischargingTime}
    • charging:boolean 正在充电
    • level:number 电量百分比
    • chargingTime:number 充电时间 可能获取失败,返回0
    • dischargingTime:number 未充电时间 可能获取失败,返回Infinity
const data = useBattery()

useWakeLock 屏幕唤醒锁定

  • 实验中的功能
  • 仅支持localhost和https
  • chrome84+
  • 入参 time: number = 1 锁定时间,默认1分钟
  • 出参 operate:boolean 操作成功
useWakeLock()

useFixed 四舍五入的toFixed

  • toFixed满足4舍6入,5根据上个数据判断
    • 1.35.toFixed(1) //1.4
    • 1.45.toFixed(1)//1.4
  • 入参 num, fixed
    • num: string | number 需要转换的数字
    • fixed?: number 选填,小数位数,默认1
  • @return result:string
const fixed = useFixed(1.115,2)
const toFixed = (1.115).toFixed(2)
return <>
    <div>useFixed:{fixed}</div>
    <div>toFixed:{toFixed}</div>
</>

useLegacyState 来合并对象 state 的更新

  • 参数 初始化对象
  • @return [data,setData]
    • data 最新的对象
    • setData 更新,传入新的对象
const [data,setData] = useLegacyState({a:1,b:2})
return <div onClick={()=>setData({a:data.a+1,c:data.a})}>{JSON.stringify(data)}</div>

useOnlyUpdateEffect 忽略初始化的useEffect

  • 同useEffect,但忽略初始化的执行
  • api同useEffect
  • deps使用[]会无法执行
const [num,setNum] = useState(1)
useOnlyUpdateEffect(()=>{
    return ()=>console.log('off')
},[num])
return <div onClick={setNum.bind(this,num+1)}>update{num}</div>

useIP 获取ip地址

  • 基于taobao的接口
  • 多次请求,只在最后一次返回结果
  • 参数 无
  • @return ip
    • ip:string 返回ip结果
const ip = useIP()

useJSONP 使用jsonp⚠

  • ️参数[url,options]
    • url:string 请求链接
    • options? 选填 配置
      • callback? 选填回调函数
      • reqName?:string 请求的cb名称,默认为callback
      • backName?:string 调用本地window的方法名称,默认随机生成 无需求建议不填
  • @return void
 useJSONP("https://www.taobao.com/help/getip.php", {
  callback: getData,
  backName: "ipCallback",
});

useDeepClone 深拷贝

  • 入参 data
    • data?:T 选填,任意参数
  • @return
    • result 结果
const data = [1,{s:[]}]
data[2] = data
const result = useDeepClone(data)
result[1].s.push(1)
console.log(data)

useAnimation 使用部分animate动画效果

  • 参数 (name,options)
    • name: “fadeIn”| “fadeOut”| “zoomIn”| “zoomOut”| “pulse”|“fadeInDownBig”| “bounce” |“flash”|“rubberBand”|“shakeX”|“shakeY” animate名称,必填
    • options?: 配置,选填
      • duration?: number; 选填,持续时长,单位秒 默认为2s
      • count?: number | “infinite”; 选填,重复次数,默认1次,infinite表示无限
      • timing?: “linear” | “ease” | “ease-in” | “ease-out” | “ease-in-out”; 选填,播放速度模式,默认匀速(linear)
      • fillMode?: “none” | “forwards” | “backwards” | “both”;选填,结果后的位置(填充模式),默认为forwards:保留最后一帧
      • delay?: number;选填,延迟加载时长 s或ms
      • alternate?: boolean;选填,是否轮流反向播放,默认false
  • @return [styles,togglePause]
    • styles:css属性
    • togglePause:()=>void 暂停/开始
const [styles,togglePause] = useAnimation('fadeIn',{
    alternate:true,
    count:'infinite'
})
return <div onClick={togglePause} style={{...styles}}>animation</div>

useStayTimeFn 监听停留时间

  • 同页面跳转生效
  • 参数 callback
    • callback?: (time?: number) => void 选填,跳转/关闭时执行,不可包裹延迟任务
  • @return {stayTime,reset}
    • stayTime : () => number 获取停留时间
    • reset : () => void 重新开始计数
 const {stayTime,reset} = useStayTimeFn((time)=>{
      localStorage.a=time
  });
  function getTime(){
      console.log(stayTime())
      reset()
  }
  return <div onClick={getTime}>time</div>;

useFetch 调用fetch

  • 请求失败则使用上次数据
  • 参数 (url: string, options?: RequestInit)
    • url:请求链接
    • options:选填,fetch的参数
  • @return [data,{request;loading}]
    • data:结果,在没返回结果前是undefined
    • request: () => void;更新
    • loading: boolean;更新数据中
const [value,{
    loading,
    request
}] = useFetch('xxx')
return <div onClick={request}>{!loading&&JSON.stringify(value)}</div>;

useRequest

  • 参数 fn
    • fn:请求的方法
  • @return [data]
    • data:结果
  const [data] = useRequest(fn);

useRem 辅助使用rem

  • 不是使用rem
  • 动态修改html的font-size
  • 监听onResize
  • 参数 options? 配置 选填;每baseWidth–>baseFontSize
    • baseWidth: number; 选填 默认为375
    • baseFontSize: number;选填 默认为16px
    • maxWidth: number;选填 默认无
  • @return fontSize:number
    • fontSize:number,返回font-size
// const fontSize = useRem({maxWidth:800})
const fontSize = useRem()

useCookie 设置/获取cookie

  • 参数:{key,options}
    • key:cookie的键
    • options 可选
      • defaultValue?: string | number; 默认值
      • expires?: Date | number;过期时间/有效时长(ms)
      • path?: string;可用的路径
      • domain?: string;可用的域
      • secure?: boolean;https 安全协议
      • ameSite?: “strict” | “lax” | “none”;跨域请求
  • @return [data,update]
    • data:string 取出的值
    • update:(value:string)=>void 更新
  const [data,update] =useCookie('a',{
      // defaultValue:210,
      path:'/',
      // expires:new Date(2023,0,1),
      expires:1000*60,
      domain:'localhost',
      secure:true,
      sameSite:'strict'
  });

useUUID 获取随机uuid

  • 支持自定义长度
  • 默认为 [8, 4, 4, 4, 12] // 如 902e95e8-5101-0c54-374e-dfd89dc98523
  • 参数:
    • len?:number | number[] 选填,纯数字或数字数组,用数组会用-隔开
  • @return [uuid, refresh]
    • uuid 结果
    • refresh 更新
const [uuid, refresh] = useUUID()
// const [uuid, refresh] = useUUID(80)
// const [uuid, refresh] = useUUID([1,2,3,4])
return <>
    <div onClick={refresh}>{uuid}</div>
</>

useParams 解析params

  • 解析params或location.search
  • 支持重复key
  • 参数 (params)
    • params:string 选填,默认为location.search
  • @return {}: Record<string, string | string[]>
    • 返回对象,如果key重复,返回数组
const [params,setParams] = useState(undefined as string)//init use location.search
const data= useParams(params)
return <>
    <div onClick={()=>setParams('a=1&a=2&a=1')}>update</div>
</>

useSetState setState

  • 参数 object
  • @return [state,setState]
    • state 最新的对象
    • setState 更新,类似Class的
const [state,setState] = useSetState({a:1,b:2})
return <>
    <div onClick={()=>setState({a:state.a+1})}>{JSON.stringify(state)}</div>
    <div onClick={()=>setState({c:1})}>add c</div>
    <div onClick={()=>setState(prev=>({
        a:prev.a-1
    }))}>update</div>
</>

useRandom 随机获取

  • 参数 […args]
    • args:任意参数
  • @return [data,update]
    • data 取出的随机值
    • update 更新随机值

useAdd 大数相加

  • 不支持负数
  • 参数 […nums]
    • 数字/字符串表示的数字
  • @return [data,add]
    • 计算结果
    • add:累加
const [data,add] = useAdd('99999999999999999999999999999','9999999999999999999999999999999999','9999999999999999999999999999999999')
return <div onClick={()=>add('99999999999999999999999999999')}>{data}</div>;

useCountDown 标准时间倒计时

  • 以秒为单位的倒计时
  • 参数 [time,options:{interval,callback}]
    • time:number,倒计时(s)
    • options
      • interval?:number,可选,触发间隔,单位秒
      • callback?:function,可选,倒计时归0后触发
    • @return [remain,{stop,wait,start}]
      • remain 剩余时间,单位秒
      • stop 停止
      • wait 暂停
      • start 开始/继续
 const [remain,{
      stop,
      wait,
      start
  }] = useCountDown(10,{
      interval:2,
      callback:()=>{
          console.log('done')
      }
  })

  return <>
      <div>{remain}</div>
      <span onClick={wait}>wait</span>
      <span onClick={stop}>stop</span>
      <span onClick={start}>start</span>
  </>

useScroll

  • 监听元素的滚动位置
    • 支持ref,未绑定返回0
    • document
  • @return [left,top]
    • left:number,坐边距
    • top:number,上边距

useSize

  • 基于ResizeObserver
  • 初始化参数
    • ref/Element
  • @return
    • [width,height]
const ref = useRef()
const [width,height] = useSize(ref)//正常的ref

const refNull = useRef()
const [wNull] = useSize(refNull)//空ref 返回0

const [wApp] = useSize(document.getElementById('app'))// document
const [nullApp] = useSize(document.getElementById('app1'))// 不存在的DOM 返回0

return <>
    <div ref={ref}>{width}</div>
    <div>{wNull}</div>
    <div>{wApp}</div>
    <div>{nullApp}</div>
</>

useFullScreen 全屏

  • 支持全屏的浏览器才有效果
  • 参数 element
    • element:ref,()=>dom 非必填,默认document
  • 返回 [isFullScreen, {enterFullscreen, exitFullscreen, toggleFullscreen,isEnabled}]
    • isFullScreen 现在是否是全屏
    • enterFullscreen 进入全屏
    • exitFullscreen 退出全屏
    • toggleFullscreen 切换全屏
    • isEnabled 是否支持全屏
const ref = useRef()
const [isFullScreen, {
    enterFullscreen, exitFullscreen, toggleFullscreen,isEnabled
// }] = useFullScreen(ref)
}] = useFullScreen(()=>document.querySelector('img'))

return <>
    {`${isFullScreen}`}
    <img ref={ref} src="https://www.baidu.com/favicon.ico" alt=""/>
    <div onClick={enterFullscreen}>enterFullscreen</div>
    <div onClick={exitFullscreen}>exitFullscreen</div>
    <div onClick={toggleFullscreen}>toggleFullscreen</div>
</>

useUpdate 强制刷新

const update= useUpdate()
return <>
    <div onClick={update}>update</div>
</>

useFavicon 更改网站的favicon

  • 参数
    • url:string 初始化favicon
  • @return
    • url:string 现在的favicon
    • update:(newUrl:string)=>void 更新
const [url,update] = useFavicon('xx')
  return <>
      <div onClick={update.bind(null,'xxx')}>update</div>
  </>

useTitle 修改修改title

useTitle('shooks')

useDebounceValue 值防抖

  • 数值改变后nms后响应
  • 初始化参数
    • 初始化的值
    • timeout:number,防抖数值 默认1000ms
  • @return
    • value:最新的值
  const [num,setNum] = useState(1)
  const value = useDebounceValue(num)

  function add(){
      setNum(num+1)
  }
  return <>
      <div onClick={add}>{num}</div>
      <div>{value}</div>
  </>

useThrottleValue 值节流

useDebounceValue,获得节流效果

useDebounce 防抖

  • 初始化参数
    • 初始化的值
    • timeout:number,防抖数值 默认1000ms
  • @return
    • value:最新的值
      • fn:设置最新的结果
        • fn(value)
  const [num,setNum] = useDebounce(1)
  const [age,setAge] = useDebounce(1,10)
  function add(){
      setNum(num+1)
      setAge(age+1)
  }
  return <>
      <div onClick={add}>{num}</div>
      <div>{age}</div>
  </>

useThrottle 节流

用法同useDebounce,获得节流效果

useThrottleFn 处理函数节流

  • 参数 (fn: (…args: unknown[]) => void, wait?: number)
    • fn:函数
    • wait:延迟时间,选填 默认1000(ms)
  • @return () => void
    • 执行函数
const [value, setValue] = useState(0);
const run = useThrottleFn(
    () => {
        setValue(value + 1);
    },
    500,
);

return (
    <div>
        <p> count: {value} </p>
        <button type="button" onClick={run}>
            Click fast!
        </button>
    </div>
);

useLatest 返回最新值,处理闭包问题

  • 参数 value/fn
  • @return ref
    • ref.current
const [value,setValue] = useState(1)
const ref = useLatest(value)
useEffect(()=>{
    setInterval(()=>{
        // setValue(value+1)
        setValue(ref.current+1)
    },1000)
},[])
return <div>{value}</div>

useHover 监听鼠标是否在指定dom元素上

  • 参数 (dom,options)
    • dom:ref或者document
    • options 选填,回调事件
      • onHover? 鼠标进入dom时触发
      • onLeave? 鼠标离开dom时触发
  • @return hover
    • hover:boolean 现在鼠标是否在dom内
const ref = useRef(null);
const isHovering = useHover(ref,{
    onHover:()=>console.log('enter'),
    onLeave:()=>console.log('leave')
});
// const isHovering = useHover(document);
return <div ref={ref}>{isHovering ? 'hover' : 'leaveHover'}</div>;

useLocalStorage

  • 参数
    • key:string 必填
    • options 选填
      • defaultValue:初始值 选填
      • force:boolean;覆盖老数据,如果没有defaultValue,则设置local为’‘’
const [data,{set,reset}] = useLocalStorage('store',{
    defaultValue:{
        age:10,
    },
    force:true
})
const [name,upName] = useLocalStorage('reset',{
    force:true
})

function add(){
    set({
        age:data.age+1
    })
    upName.set('reset')
}


return <>
    <div onClick={add}>{data.age}</div>
    <div onClick={reset}>{name}</div>
    </>

useSessionStorage

useLocalStorage

useMap

import { useMap } from 'shooks'

const [value, { set, remove, clear, reset, has, size }] = useMap([
    ["a", "b"],
]);

useSet

import { useSet } from 'shooks'

const [value, { set, remove, clear, reset, has, size }] = useSet(1);

useBoolean

  • defaultValue:false
  • toggle:切换
  • setTrue:设为true
  • setFalse:设为false
const [data, {toggle,setTrue,setFalse}] = useBoolean(true)

useWan 转换数字,默认为万

  • 支持正负数
  • 支持小数
  • 不支持转换返回原数值
  • 参数 (num, step)
    • num: number | string 必填,需要转换的数字
    • step: number = 4,选填,小数点前移的数量,默认为4位,即/10000
  • @return [result,changed]
    • result:string 结果
    • changed:boolean 是否转换成功
// const [num,upNum] = useState(-99999.9)//-9.9万
// const [num,upNum] = useState(100000.12)//10.0万
const [num,upNum] = useState(10.1)//10.1元
// const [result,hadChange] = useWan(num,2)
const [result,hadChange] = useWan(num)
return <div onClick={upNum.bind(null,2000000)}>{result}{hadChange?'万':'元'}</div>;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值