美文网首页
自定义hook复用组件代码

自定义hook复用组件代码

作者: 马建阳 | 来源:发表于2022-07-03 18:28 被阅读0次
  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()

但在以下场景使用并不优雅

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);
    },
  };
};

相关文章

  • 自定义hook复用组件代码

    概念: 自定义hook是react中最新的组件代码复用方案注意点: hook必须以use开头,并需要使用别的hoo...

  • React Hook笔记

    1. Hook优缺点 优势: 提供组件间复用功能 同一业务逻辑代码相对集中 劣势: 没有对应getSnapshot...

  • [CocosCreator]滚动地图自定义组件

    CocosCreator滚动地图功能代码,可复用,可自定义组件,没有代码耦合和入侵。转载自CocosCreator...

  • 在React中创建自定义hook

    什么是自定义hook? 使用自定义hook可以将某些组件逻辑提取到可重用的函数中。 自定义hook是一个从use开...

  • vue的组件使用方法

    代码复用和抽象的主要形式是组件 注册一个组件: 组件在注册之后,便可以作为自定义元素 ...

  • react的一些总结

    什么时候自定义Hook? 当多个组件之间有一些公共的逻辑,可以将他们抽取成自定义的Hook,Hook本质是自定义的...

  • 自定义Hook & 高阶组件

    自定义Hook 自定义Hook: 将一些常用的、跨越多个组件的Hook功能,抽离出去形成一个函数,该函数就是自定义...

  • 使用angular2的自定义组件

    为了减少代码的编写,将复用率高的代码组件化,是angular提倡的一种方式。在angular1中,自定义组件还是比...

  • 自定义hook

    多个组件有相同的逻辑的时候,可以把他抽取到一个独立的hook里面。自定义hook的本质就是函数代码的抽取,他本身不...

  • React深入(二)

    Hook React 16.8.0 是第一个支持 Hook 的版本; 使用原因 使用组件之间复用逻辑更容易(对比高...

网友评论

      本文标题:自定义hook复用组件代码

      本文链接:https://www.haomeiwen.com/subject/kwzlbrtx.html