You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从客户端组件向React Server Component传参以调用API?

React Server Component 处理用户交互动态API请求的方案

React Server Components(RSC)完全支持基于用户交互动态构造API请求,并非只能使用静态URL。以下是两种最常用的实现方式:

方式一:通过路由查询参数传递数据

用户交互后触发路由跳转,将参数附在URL的查询参数中,对应的服务端组件在渲染时读取这些参数,发起带动态参数的API请求。

客户端交互组件(搜索输入框)

'use client';

import { useRouter } from 'next/navigation';

export default function SearchInput() {
  const router = useRouter();

  const handleSubmit = (e) => {
    e.preventDefault();
    const term = e.target.searchTerm.value.trim();
    if (term) {
      // 跳转至带查询参数的路由,触发服务端组件重新渲染
      router.push(`/search?term=${encodeURIComponent(term)}`);
    }
  };

  return (
    <form onSubmit={handleSubmit}>
      <input type="text" name="searchTerm" placeholder="输入关键词..." />
      <button type="submit">搜索</button>
    </form>
  );
}

服务端结果组件

import { headers } from 'next/headers';
import fetchData from './fetchData';

export default async function SearchResults() {
  // 从请求路由中提取查询参数
  const url = new URL(headers().get('referer') || '');
  const searchTerm = url.searchParams.get('term') || '';

  if (!searchTerm) {
    return <div>请输入搜索关键词</div>;
  }

  // 服务端发起带动态参数的API请求
  const results = await fetchData(searchTerm);

  return (
    <div>
      <h3>关于「{searchTerm}」的搜索结果</h3>
      <ul>
        {results.map(item => (
          <li key={item.id}>{item.name}</li>
        ))}
      </ul>
    </div>
  );
}

方式二:通过服务端Action传递数据

如果不想触发路由跳转,可以用服务端Action(Server Actions)直接将客户端数据传递到服务端,在服务端逻辑中构造API请求,再将结果返回给客户端渲染。

定义服务端Action

'use server';

export async function performSearch(searchTerm) {
  if (!searchTerm.trim()) {
    return { error: '请输入搜索关键词' };
  }

  // 服务端发起动态API请求(支持GET/POST)
  const response = await fetch(`https://myapi.com/api/search?term=${encodeURIComponent(searchTerm)}`);
  // 若需POST请求,可替换为:
  // const response = await fetch('https://myapi.com/api/search', {
  //   method: 'POST',
  //   headers: { 'Content-Type': 'application/json' },
  //   body: JSON.stringify({ term: searchTerm })
  // });

  const results = await response.json();
  return { results };
}

客户端调用Action

'use client';

import { useState } from 'react';
import { performSearch } from './searchActions';

export default function SearchComponent() {
  const [searchTerm, setSearchTerm] = useState('');
  const [results, setResults] = useState([]);
  const [error, setError] = useState('');

  const handleSearch = async () => {
    setError('');
    const res = await performSearch(searchTerm);
    if (res.error) {
      setError(res.error);
    } else {
      setResults(res.results);
    }
  };

  return (
    <div>
      <input
        type="text"
        value={searchTerm}
        onChange={(e) => setSearchTerm(e.target.value)}
        placeholder="输入关键词..."
      />
      <button onClick={handleSearch}>搜索</button>
      {error && <p style={{ color: 'red' }}>{error}</p>}
      <ul>
        {results.map(item => (
          <li key={item.id}>{item.name}</li>
        ))}
      </ul>
    </div>
  );
}

总结

不管是GET请求带查询参数,还是POST请求带请求体,RSC都能通过路由参数或服务端Action实现动态构造API请求,完全支持用户交互驱动的数据传递场景。

内容的提问来源于stack exchange,提问作者Eric

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 17:12:55