zoukankan      html  css  js  c++  java
  • 自定义hook

    自定义hook

    hook就是一个函数,有一些特定逻辑的封装函数
    1,用于处理字符串(url)
    2,数据格式化(日期)
    3,业务逻辑性
    // 自定义hook相对于普通js复用逻辑的抽离,然后可以在页面调用

    // 自定义hook一般放在src下面hooks文件夹里面
    // 自定义 Hook 是一个函数,其名称以 “use” 开头,函数内部可以调用其他的 Hook。

    示例1: 处理字符串url

    src/hooks/index.jsx
    
    import url from 'url'
    import qs from 'querystring'
    
    // use就是hook标识
    // 封装了一个将string的url中的search处理成obj的自定义hook
    function useUrlHandler(str){
      const {search} = url.parse(str)
      return qs.parse(search.slice(1))
    }
    
    // 在需要的页面调用该hook函数
    import React,{useState} from 'react'
    import {useUrlHandler} from './hooks'
    
    export default function App(){
      const urlObj = useUrlHandler('https://jd.com/phone/18?a=2&b=3#hash')
      const [url] = useState(urlObj)
      console.log(url,77)
      return (
        <div>
          <h5>自定义hook使用</h5>
        </div>
      )
    }
    

    示例2: 日期处理hook

    export function useTimeHandler(date,type='/'){
      const d = new Date(date)
      const arr = ['星期日','星期一','星期二','星期三','星期四','星期五','星期六']
      return d.getFullYear() + type + useNumber(d.getMonth() + 1) + type + useNumber(d.getDate()) + '' + arr[d.getDay()]
    }
    
    // 判断月日是否需要加0
    export function useNumber(n){
      if(isNaN(n)) return 'n格式不正确'
      if(n<10) return '0' + n
      return n
    }
    
    // 调用
    const t = useTimeHandler(Date.now(),'-')
    const [time] = useState(t)
    

    示例3 axios封装,返回结果数据类型检查

    import axios from 'axios'
    import React, {useEffect} from 'react'
    
    export function useRequest(url){
      // 数据请求的处理
      const [data,setData] = useState(null)
      const [error,setError] = useState(null)
      const [loading,setLoading] = useState(true)
      useEffect(() =>{
        axios.get(url)
          .then(re =>{
            setData(res.data)
          })
          .catch(error => {
            setError(error)
          })
          .finally(() => {
            setLoading(false)
          })
      },[])
      return {data ,error,loading}
    }
    
    // 数据类型验证hook
    export function useDataTypeCheck(data){
      if(typeof data != 'object') return 0    //string/number/undefiend
      if(Object.prototype.toString.call(data) == '[object Null]') return 1  //null
      if(Object.prototype.toString.call(data) == '[object Object]'){
        // 证明是一个对象了
        if(Object.keys(data).length != 0){
          return data
        }else{
          return 2 //对象是空的{}
        }
      }
      if(Array.isArray(data)){
        if(data.length != 0){
          return data
        }else{
          return 3 //数组是空的[]
        }
      }
    }
    
    // 界面唯一性处理
    export function useOnlyView(status,loading,error){
      if(status == 0) return '非引用类型'
      if(status == 1) return '数据加载中...'
      if(status == 2) return '空对象'
      if(status == 3) return '空数组'
    }
    if(loading) return <div>数据加载中</div>
    if(error) return '数据请求失败'
    
    // 调用
    import React from 'react'
    import {useRequest,useDataTypeCheck,useOnlyView} from './hooks'
    export default function App(){
      const {data,error,loading} = useRequest('/mock/data.json')  //数据请求
      const checkResult = useDataTypeCheck(data)    //数据校验
      useOnlyView(checkResult,loading,error)   //界面化处理,避免出现报错页面,只出现一个页面
      return (
        <div>
          {/* //到了这里一定是有结果的,前面处理过,不会报错 */}
          {checkResult.username}  
        </div>
      )
    }
    
    
  • 相关阅读:
    Spark算子--join
    Spark算子--filter
    Spark算子--reduceByKey
    Spark算子--mapPartitions和mapPartitionsWithIndex
    Spark算子--map和flatMap
    Flume环境搭建_五种案例
    枚举深入剖析
    Oracle_基本函数查询综合
    Oracle_复杂查询综合
    softmax 杂谈
  • 原文地址:https://www.cnblogs.com/xm0328/p/14421516.html
Copyright © 2011-2022 走看看