首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将响应从API保存到状态,以便显示旧的搜索/响应?

如何将响应从API保存到状态,以便显示旧的搜索/响应?
EN

Stack Overflow用户
提问于 2022-05-14 00:06:12
回答 2查看 123关注 0票数 2

下面是我要做的事情:首先,我想显示从API接收到的响应(我可以这样做),但是接下来我想显示以前调用API的提示和响应。

代码语言:javascript
复制
import { useEffect, useState } from "react";
import Navbar from "./components/navbar/Navbar";
import Form from "./components/form/Form";
import Ideas from "./pages/Ideas";
import "./app.scss";

const { Configuration, OpenAIApi } = require("openai");

export default function App() {
 
  const [companyType, setCompanyType] = useState("");
  const [prompt, setPrompt] = useState("");
  const [response, setResponse] = useState("");
  const [list, setList] = useState({});


  useEffect(() => {
    console.log("use effect ran");
  }, []);

  const configuration = new Configuration({
    apiKey: process.env.REACT_APP_API_KEY,
  });

  const openai = new OpenAIApi(configuration);

  const searchForProductIdeas = (event) => {
    event.preventDefault();
    openai
      .createCompletion("text-davinci-002", {
        prompt: `List new product ideas for a ${companyType} company.`,
        temperature: 1,
        max_tokens: 256,
        top_p: 1,
        frequency_penalty: 0,
        presence_penalty: 0,
      })

      .then((response) => {
        
        // creates a variable to store response in
        const idea = response.data.choices[0].text;
        //sets the prompt
        setPrompt(`List new product ideas for a ${companyType} company.`);
        //sets the response
        setResponse(idea);
        // set the previous prompts and responses
        setList({...prompt, ...idea})

      });
  };
  return (
    <div className="app">
      <Navbar />
      
      <div>{prompt}</div>
      <div>{response}</div>
      <div>{list}</div>
    </div>
  );
}

欢迎任何和所有的帮助。还想知道我是否需要有关于openai API调用的axios?

EN

回答 2

Stack Overflow用户

发布于 2022-05-14 00:29:06

您可能希望将前面的搜索项和结果对存储在数组中。当提出新请求时,将当前的promptresponse状态移动到list状态数组中。

示例:

代码语言:javascript
复制
export default function App() {
  const [companyType, setCompanyType] = useState("");
  const [prompt, setPrompt] = useState("");
  const [response, setResponse] = useState("");
  const [list, setList] = useState([]); // <-- array

  ...

  const searchForProductIdeas = (event) => {
    event.preventDefault();

    openai
      .createCompletion("text-davinci-002", {
        ...
      })
      .then((response) => {
        // creates a variable to store response in
        const idea = response.data.choices[0].text;
        //sets the prompt
        setPrompt(`List new product ideas for a ${companyType} company.`);

        //sets the response
        setResponse(idea);

        // set the previous prompts and responses
        if (prompt && response) {
          setList(list => [...list, { prompt, response }]); // <-- append into new array
        }
      });
  };

  return (
    <div className="app">
      <Navbar />
      
      <div>{prompt}</div>
      <div>{response}</div>
      <div>
        <ul>
          <p>Previous prompts and responses</p>
          {list.map(({ prompt, response }, i) => ( // <-- map previous entries
            <li key={i}>
              <p>{prompt}</p>
              <p>{response}</p>
            </li>
          ))}
        </ul>
      </div>
    </div>
  );
}
票数 0
EN

Stack Overflow用户

发布于 2022-05-14 00:29:57

所以我假设,当我看你的代码时,现在行:

代码语言:javascript
复制
<div>{list}</div>

由于您的问题是如何显示旧的请求列表,所以无法工作。

我要做的是将列表改为对象数组:

代码语言:javascript
复制
const [list, setList] = useState([]);

我会把你的提示符和响应作为一个对象添加到里面。沿着…线的东西:

代码语言:javascript
复制
const idea = response.data.choices[0].text;
const newPrompt = `List new product ideas for a ${companyType} company.`;
setPrompt(newPrompt);
setResponse(idea);

setList([
...list,
{ 
prompt: newPrompt
response: idea
}]);

并显示您将使用map函数:

代码语言:javascript
复制
{
list.map((item) => (
<>
   <div> item.prompt </div
   <div> item.response </div>
</>
))}``
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72236412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档