繁体   English   中英

State 在 axios 调用后第一次在 React 的功能组件中没有得到更新

[英]State does not get updated in functional component in React for the first time after axios call

问题:“detectLanguageKey”只有在从下拉列表中选择语言两次后才会更新。

当我第一次从下拉列表中选择 select 时,detectLanguageKey 仍然是“”,并且只有在第二次选择该选项后才会更新。

你能解释一下为什么吗? 我也尝试过使用异步等待和回调。

import React, { useState, useEffect } from "react";
import axios from "axios";
function SearchBar() {
  const [inputText, setInputText] = useState("");
  const [detectLanguageKey, setdetectedLanguageKey] = useState("");
  const [selectedLanguageKey, setLanguageKey] = useState("");
  const [languagesList, setLanguagesList] = useState([]);
  const [resultText, setResultText] = useState("");

  const getLanguageSource = () => {
    axios
      .post(`https://libretranslate.de/detect`, {
        q: inputText,
      })
      .then((response) => {
        setdetectedLanguageKey(response.data[0].language);
      });
  };

  useEffect(() => {
    axios.get("https://libretranslate.de/languages").then((res) => {
      setLanguagesList(res.data);
      console.log("languagesList", languagesList);
    });
  }, [inputText]);

  const languageKey = (selectedLanguage) => {
    setLanguageKey(selectedLanguage.target.value);
  };

  const translateText = async () => {
    await getLanguageSource();
    let data = {
      q: inputText,
      source: detectLanguageKey,
      target: selectedLanguageKey,
    };
    axios.post(`https://libretranslate.de/translate`, data).then((response) => {
      setResultText(response.data.translatedText);
    });
  };

  return (
    <div>
        <textarea
          rows="10"
          cols="80"
          onChange={(e) => setInputText(e.target.value)}
          placeholder="Type text to translate.."
        ></textarea>
        <textarea
          rows="10"
          cols="80"
          placeholder="Your translated text will be here..."
          value={resultText}
          disabled={true}
        ></textarea>
        {languagesList.length > 0 && (
          <select onChange={languageKey} name="selectedLanguageKey">
            <option>Please Select Language..</option>
            {languagesList.map((lang) => {
              return <option value={lang.code}>{lang.name}</option>;
            })}
          </select>
        )}

        <button
          class="submit-btn"
          onClick={(e) => {
            translateText();
          }}
        >
          Submit
        </button>
    </div>
  );
}

translateText function 更改为此

const translateText = async () => {
  const detectedLanguageKey = await getLanguageSource();
  const data = {
    q: inputText,
    source: detectedLanguageKey,
    target: selectedLanguageKey,
  };
    
  axios.post(`https://libretranslate.de/translate`, data).then((response) => {
    setResultText(response.data.translatedText);
  });
};

getLanguageSource function 更改为此

const getLanguageSource = async () => {
    const response = await axios
      .post(`https://libretranslate.de/detect`, {
        q: inputText,
      })

    return response.data[0].language;
  };

从 useEffect 的依赖数组中移除inputText

移除const [detectLanguageKey, setdetectedLanguageKey] = useState("");

您的代码中存在一些问题。

首先,在translateText中,您正在等待不返回 promise 即getLanguageSource

其次,即使getLanguageSource返回 promise,您也希望setdetectedLanguageKey中的getLanguageSource立即生效。 State 更新不是即时的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM