自定義hook復用組件代碼

  1. 概念: 自定義hook是react中最新的組件代碼復用方案
    注意點: hook必須以use開頭镇眷,并需要使用別的hook
  2. 例子
    1)useEffect
useEffect(() => {
    fetch(`${apiUrl}/users`).then(async response => {
      if (response.ok) {
        setUsers(await response.json())
      }
    })
  }, [])

改造后

export const useMount = (callback) => {
  useEffect(() => {
    callback();
  }, []);

useMount(() => {
    fetch(`${apiUrl}/users`).then(async response => {
      if (response.ok) {
        setUsers(await response.json())
      }
    })
  })
  1. useDebounce

常用debounce

const debounce = (func, delay) => {
  let timeout;
  return (...param) => {
    if (timeout) {
      clearTimeout(timeout);
    }
    timeout = setTimeout(function() {
      func(...param);
    }, delay);
  }
}

const log = debounce(() => console.log('call'), 5000)
log()
log()
log()

但在以下場景使用并不優(yōu)雅

const [param, setParam] = useState({
    name: '',
    personId: ''
  })

useEffect(() => {
    fetch(`${apiUrl}/projects?${qs.stringify(cleanObject(param))}`).then(async response => {
      if (response.ok) {
        setList(await response.json())
      }
    })
  }, [param])

通過useDebounce來

export const useDebounce = (value, delay) => {
  const [debouncedValue, setDebouncedValue] = useState(value);

  useEffect(() => {
    // 每次在value變化以后,設置一個定時器
    const timeout = setTimeout(() => setDebouncedValue(value), delay);
    // 每次在上一個useEffect處理完以后再運行
    return () => clearTimeout(timeout);
  }, [value, delay]);

  return debouncedValue;
};

const [param, setParam] = useState({
    name: '',
    personId: ''
  })
const debouncedParam = useDebounce(param, 2000)

useEffect(() => {
    fetch(`${apiUrl}/projects?${qs.stringify(cleanObject(debouncedParam))}`).then(async response => {
      if (response.ok) {
        setList(await response.json())
      }
    })
  }, [debouncedParam])

  1. useArray
import { useArray, useMount } from "utils";
import React, { useState } from "react";

export const TsReactTest = () => {
  const persons: { name: string; age: number }[] = [
    { name: "jack", age: 25 },
    { name: "ma", age: 22 },
  ];
  const { value, clear, removeIndex, add } = useArray(persons);

  return (
    <div>
    {value.map((person, index) => (
        <div style={{ marginBottom: "30px" }}>
          <span style={{ color: "red" }}>{index}</span>
          <span>{person.name}</span>
          <span>{person.age}</span>
        </div>
      ))}
      {/* 點擊以后清空列表*/}
      <button style={{ marginBottom: "50px" }} onClick={() => clear()}>
        clear
      </button>
      {/* 點擊以后刪除第一項*/}
      <button onClick={() => removeIndex(0)}>remove 0</button>
      {/* 點擊以后增加 john */}
      <button onClick={() => add({ name: "john", age: 22 })}>add john</button>
    </div>
  );


export const useArray = <T>(initialArray: T[]) => {
  const [value, setValue] = useState(initialArray);
  return {
    value,
    setValue,
    add: (item: T) => setValue([...value, item]),
    clear: () => setValue([]),
    removeIndex: (index: number) => {
      const copy = [...value];
      copy.splice(index, 1);
      setValue(copy);
    },
  };
};

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市季希,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌野瘦,老刑警劉巖句喜,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贯被,居然都是意外死亡眼五,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門彤灶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來看幼,“玉大人,你說我怎么就攤上這事幌陕∷薪” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵搏熄,是天一觀的道長棚唆。 經(jīng)常有香客問我,道長心例,這世上最難降的妖魔是什么宵凌? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮止后,結(jié)果婚禮上摆寄,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好微饥,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布逗扒。 她就那樣靜靜地躺著,像睡著了一般欠橘。 火紅的嫁衣襯著肌膚如雪矩肩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天肃续,我揣著相機與錄音黍檩,去河邊找鬼。 笑死始锚,一個胖子當著我的面吹牛刽酱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瞧捌,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼棵里,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了姐呐?” 一聲冷哼從身側(cè)響起殿怜,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎曙砂,沒想到半個月后头谜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡鸠澈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年柱告,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笑陈。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡末荐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出新锈,到底是詐尸還是另有隱情,我是刑警寧澤眶熬,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布妹笆,位于F島的核電站,受9級特大地震影響娜氏,放射性物質(zhì)發(fā)生泄漏拳缠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一贸弥、第九天 我趴在偏房一處隱蔽的房頂上張望窟坐。 院中可真熱鬧,春花似錦、人聲如沸哲鸳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽徙菠。三九已至讯沈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間婿奔,已是汗流浹背缺狠。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留萍摊,地道東北人挤茄。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像冰木,于是被迫代替她去往敵國和親穷劈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容