如何将参数传递给 useEffect 挂钩

Posted

技术标签:

【中文标题】如何将参数传递给 useEffect 挂钩【英文标题】:How to pass argument to useEffect hook 【发布时间】:2020-08-15 13:30:12 【问题描述】:

我有几个按钮,单击它们会调用不同的 API。我的 React App 只使用 Hooks 和 Context API。 之前是这样的:

      <button class="btn margin-1-lr" onClick=this.couchbaseCallApi('/couchbase/sync/initiate/sanity')>Sync Sanity</button>
          <button class="btn margin-1-lr" onClick=this.couchbaseCallApi('/couchbase/sync/initiate/performance')>Sync Performance</button>
          <button class="btn margin-1-lr" onClick=this.couchbaseCallApi('/couchbase/sync/initiate/endurance')>Sync Endurance</button>

couchbaseCallApi 函数将使用 fetch API 调用 URL。

如何将这些端点传递给 useEffect 挂钩以调用正确的端点?

【问题讨论】:

需要查看更多代码才能提供帮助。您不需要 useEffect 来设置端点。因为这听起来不像是副作用。 【参考方案1】:

我的第一个建议是使用现有的解决方案,例如 React Query,这是一个通过 Hooks 实现的强大查询解决方案。

我不知道useEffect 是否是执行此类异步操作的最佳方法,但这是一个潜在的解决方案。您希望useEffect 在其查询的数据发生更改时重新运行,以便进入其依赖项列表。您可以使用useState 通过更改查询值来触发重新渲染。

let [query, setQuery] = useState(null);
let [results, setResults] useState(null);

useEffect(() => 
    if (!query) return;

    let cancelled = false;

    // TODO: Perform query for sanity, performance, or endurance
    // This is an example using Promises, but callbacks also work
    couchbaseCallApi(query)
        .then((results) => 
            if (!cancelled) 
                setResults(results);
            
        );

    // Cancel any on-going queries
    return () => 
        cancelled = true;
    
, [query]);

应该注意的是,这只允许您一次“同步”一件事。如果您希望每个同步(健全性、性能、持久性)都是它们自己的查询,那么您需要为每个同步提供一个 useEffect,并且依赖关系列表需要更改(我建议使用时间戳)。

要触发 api 调用,您只需更新查询:

<button class="btn margin-1-lr" onClick=() => setQuery('/couchbase/sync/initiate/sanity')>Sync Sanity</button>
<button class="btn margin-1-lr" onClick=() => setQuery('/couchbase/sync/initiate/performance')>Sync Performance</button>
<button class="btn margin-1-lr" onClick=() => setQuery('/couchbase/sync/initiate/endurance')>Sync Endurance</button>

【讨论】:

以上是关于如何将参数传递给 useEffect 挂钩的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SwiftUI 将参数传递给 Button 的操作

如何将多个重复的参数传递给 CUDA 内核

jQuery UI 问题。如何将参数传递给函数

如何将参数传递给配置单元视图,以便视图根据传递的内容进行更改?

如何通过 JCL 将参数传递给 REXX 程序

如何将条目参数传递给 Xamarin MVVM 视图模型