程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了React useEffect onClick Refetch Data - 更改参数大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决React useEffect onClick Refetch Data - 更改参数?

开发过程中遇到React useEffect onClick Refetch Data - 更改参数的问题如何解决?下面主要结合日常开发的经验,给出你关于React useEffect onClick Refetch Data - 更改参数的解决方法建议,希望对你解决React useEffect onClick Refetch Data - 更改参数有所启发或帮助;

如何添加点击处理程序以根据我在点击时的输入从我的 API 重新获取数据?

在我的控制台中,如果我输入“Jon snow”,例如因为 onChange 设置为 e.target.value,但不确定如何在按钮点击时获取它,我会返回数据。

代码沙盒:https://codesandbox.io/s/pedantic-lichteRMAN-4ev6f?file=/src/game.jsx

import React,{ useEffect,useState } from "react";
import axios from "axios";

export default function Game() {
  const [error,setError] = useState(null);
  const [name,setname] = useState("");

  const handlesubmit = e => {
    e.preventDefault();
    console.log( name );
  }
  const handleClick = e => {
    // ??
  }

  useEffect(() => {
    fetch(`https://anAPIoficeandfire.com/API/characters?name=${name}`)
      .then((res) => res.Json())
      .then((data) => {
        console.log(data[0].Name); // the data I want BACk
      })
      .catch((error) => {
        console.log("Error",error);
        setError(error);
      });
  },[name]);

  return (
    
      <form onsubmit={handlesubmit}>
      <input
        type="text"
        value={name}
        onChange={(E) => setname(e.target.value)}
        placeholder="name"
      />
      <input type="submit" value="submit" onClick={handleClick}/>
    </form>
  );
}

解决方法

点击提交按钮时会触发 onSubmit 事件,无需您单独处理 onClick 事件。

import React,{ useEffect,useState } from "react";
import axios from "axios";

export default function Game() {
  const [error,setError] = useState(null);
  const [name,setName] = useState("");

  const handleSubmit = e => {
    e.preventDefault();
    console.log( name );
    fetchData(Name);
  }
  
  const fetchData = (Name) => {
    fetch(`https://anapioficeandfire.com/api/characters?name=${name}`)
      .then((res) => res.json())
      .then((data) => {
        console.log(data[0].Name); // the data I want BACk
      })
      .catch((error) => {
        console.log("Error",error);
        setError(error);
      });
  }

  useEffect(() => {
    fetchData(Name);
  },[]);

  return (
    
      <form onSubmit={handleSubmit}>
      <input
        type="text"
        value={name}
        onChange={(E) => setName(e.target.value)}
        placeholder="Name"
      />
      <input type="submit" value="Submit" onClick={handleClick}/>
    </form>
  );
}
,

添加另一个有状态变量。您不仅需要 输入值 的值和设置器,还需要您希望能够在其他地方使用的 API 结果的值和设置器。也许像

const [searchText,setSearchText] = useState('');
const [result,setResult] = useState('');
// inside fetch callBACk:
setResult(data[0]?.name ?? ''); // use optional chaining to not throw an error
// if there is no result
<input
  type="text"
  value={searchText}
  onChange={(E) => setSearchText(e.target.value)}
  placeholder="Name"
/>

然后您可以在需要的地方使用 result

现场演示:

const App = () => {
  const [error,setError] = React.useState(null);
  const [searchText,setSearchText] = React.useState('');
  const [result,setResult] = React.useState('');

  const handleSubmit = e => {
    e.preventDefault();
    console.log( name );
  }

  React.useEffect(() => {
    fetch(`https://anapioficeandfire.com/api/characters?name=${searchText}`)
      .then((res) => res.json())
      .then((data) => {
        setResult(data[0] ? data[0].name : '');
      })
      .catch((error) => {
        console.log("Error",error);
        setError(error);
      });
  },[searchText]);
  console.log(result);

  return (
    
      <form onSubmit={handleSubmit}>
      <input
        type="text"
        value={searchText}
        onChange={(E) => setSearchText(e.target.value)}
        placeholder="Name"
      />
      <input type="submit" value="Submit" onClick={e => e.preventDefault()}/>
    </form>
  );
}

ReactDOm.render(<App />,document.querySELEctor('.react'));
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div class='react'></div>

,

可以在handleClick函数中直接使用状态变量[name]。

,

其他答案都是正确的,您应该在 handleSubmit 中触发提取。我只是想附上一些用于渲染结果的示例代码,因为您寻求帮助。

API 返回一个字符数组。我们想通过该结果 @H_731_5@map 并显示每个字符。如果没有结果,我们还想告诉用户(特别是因为这个 API 似乎只能使用确切的名称,并且会返回“Arya Stark”的结果,而不是“Stark”的结果)。我们不想在提交之前显示“未找到字符”消息。

我正在使用 setState 钩子来存储 character 中的 API 匹配数组。我将状态初始化为 undefined 而不是 [],以便我们仅在设置为 [] 时才显示无结果消息。

我的代码允许用户多次提交。我们一直显示以前的结果,直到他们提交新的搜索。一旦我们的数组处于 characters 状态,我们就会显示这些结果。

// an example component to render a result
const RenderCharacter = ({ name,aliases }) => {
  return (
    <div>
      <h2>{name}</h2>
      {aliases.length && (
        <div>
          <h3>Aliases</h3>
          <ul>
            {aliases.map((a) => (
              <li key={a}>{a}</li>
            ))}
          </ul>
        </div>
      )}
    </div>
  );
};
export default function Game() {
  // current form input
  const [name,setName] = useState("");
  // save characters returned from the API
  // start with undefined instead of empty array
  // so we know when to show "no characters found" message
  const [characters,setCharacters] = useState();
  // store API errors
  const [error,setError] = useState(null);

  const fetchData = () => {
    fetch(`https://anapioficeandfire.com/api/characters?name=${name}`)
      .then((res) => res.json())
      .then(setCharacters) // store data to state
      .then(() => setError(null)) // clear previous errors
      .catch((error) => {
        console.log("Error",error);
        setError(error);
        setCharacters(undefined); // clear previous character matches
      });
  };

  const handleSubmit = (E) => {
    e.preventDefault();
    fetchData();
  };

  return (
    <div>
      <form onSubmit={handleSubmit}>
        <input
          type="text"
          value={name}
          onChange={(E) => setName(e.target.value)}
          placeholder="Name"
        />
        <input type="submit" value="Submit" />
      </form>
      {Characters !== undefined &&
        (characters.length === 0 ? (
          <div>No Characters Found</div>
        ) : (
          <div>
            {Characters.map((character) => (
              <RenderCharacter key={Character.namE} {...character} />
            ))}
          </div>
        ))}
      {error !== null && <div>Error: {error.messagE}</div>}
    </div>
  );
}

Code Sandbox Demo(带有打字稿注释)

大佬总结

以上是大佬教程为你收集整理的React useEffect onClick Refetch Data - 更改参数全部内容,希望文章能够帮你解决React useEffect onClick Refetch Data - 更改参数所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。