当前位置: 首页 > 知识库问答 >
问题:

如何在UseEffect中使用自定义方法?

罗飞宇
2023-03-14

如何在useEffect中使用自定义方法??如果我创建了许多组件,它们使用相同的fetch函数,我应该在每个组件的效果中声明fetch函数吗??这个函数做同样的工作??

据我所知,如果我想在use效应中使用组件的状态,我应该声明并调用use效应中的函数,就像例子1一样。

但是我想声明其他js文件的函数。因为它被称为其他组件。

根据Dan Abramov(https://overreacted.io/a-complete-guide-to-useeffect/),如果我想移动函数,我必须使用useCallback方法。但是我没有很好地理解。这个问题请给我任何建议。

1. Component.js
const Component = () => {
    const [id,setId] = useState(0);
    const dispatch = useDispatch();

    useEffect(() => {
        fetch(`url/${id}).then(res => dispatch({type: success, payload: res}))
    },[id])
}

2. Component.js 
const Component = () => {
    const [id, setId] = useState(0);

    useEffect(()=> {
        callApi(id)
    },[id])
}

Api.js
const callApi = (id) => {
    const dispatch = useDispatch();
    return fetch(`url/${id}).then(res => dispatch({type:success, payload:res})
}

共有2个答案

劳鹏云
2023-03-14

由于多个组件在useEffect中执行相同的操作,因此可以将代码提取到自定义挂钩中,并在所有组件中使用它

USFetch.js

export const useFetch = () => {
    const dispatch = useDispatch();

    useEffect(() => {
        fetch(`url/${id}).then(res => dispatch({type: success, payload: res}))
    },[id])
}

现在在组件中你可以写

const Component = () => {
    const [id, setId] = useState(0);
    useFetch(id);
}
贺彬
2023-03-14

我应该在每个组件的效果中声明提取函数吗?

提取自定义钩子,useFetch(),具有相同的提取功能。

// custom hook
const useFetch = (id) => {
    const [data, setData] = useState(null);

    useEffect(
      () => {
        async function fetchData() {
          const res = await fetch(`url/${id})
          setData(res);
        }
        fetchData();
      }, [id] // id as dependency
    )

    return data;
}

// sample component using custom hook
const Component = (props) => {
    const dispatch = useDispatch();
    const data = useFetch(props.id); // use custom hook

    useEffect(
      () => {
        if (data) {
          dispatch({type: success, payload: data});
        }
      }, [data] // dispatch every time data changes
    )
}
 类似资料:
  • 问题内容: 因此,JSON.stringify提供了一种转换JS对象的好方法: 输入JSON字符串,例如: 它使用一个可选的第二个参数来执行此操作,该参数控制应序列化哪些字段: 很好,但是有一个问题。假设您的“ baz”实际上是另一个对象的属性,并且您想要序列化另一个对象: 好吧,通常您只需要在baz上定义一个toJSON方法,例如: 现在,正如我前面提到的,我们已经有了完美的逻辑来“ toJSO

  • 我正在使用IText7从html字符串生成pdf。现在,我需要对段落应用自定义颜色和自定义字体或字体系列。 如何使用Itext7实现这一点? 谢谢

  • 问题内容: 我正在尝试在Go中创建和使用自定义包。这可能很明显,但是我找不到很多信息。基本上,我在同一个文件夹中拥有这两个文件: mylib.go main.go 当我尝试时,出现此错误: 我尝试先运行,但似乎没有做任何事(没有生成文件,没有错误消息)。所以有什么想法我该怎么做? 问题答案: 首先,请务必阅读并理解“如何编写Go代码”文档。 实际答案取决于您“定制包装”的性质。 如果打算用于一般用

  • 我正在尝试在Go中创建和使用自定义包。这可能是非常明显的事情,但我找不到有关此的太多信息。基本上,我在同一个文件夹中有这两个文件: mylib。去 主要的去 当我尝试时,我得到这个错误: 我试着运行,但它似乎什么都没做(没有生成文件,没有错误消息)。你知道我该怎么做吗?

  • 假设我想有一个方法,它是获得超级主要客户,它有。 其中声明了方法。 然后我的公开存储库界面变成以下内容: 它扩展了和my。 我写的 bot不知道,在实现中写什么。如何接触客户?

  • 问题内容: 我正在使用Python的应用程序编写一些测试用例。现在,我需要将一个对象列表与另一个对象列表进行比较,以检查第一个列表中的对象是否符合我的期望。 如何编写自定义方法?应该怎么办?是否应该在失败时引发例外?如果是,哪个例外?以及如何传递错误消息?错误消息应该是unicode字符串还是字节字符串? 不幸的是,官方文档没有解释如何编写自定义断言方法。 如果您需要一个真实的示例,请继续阅读。