Компонент рендеринга при изменении реквизита, в противном случае не отображается

#javascript #reactjs

#javascript #reactjs

Вопрос:

У меня есть этот выходной компонент, который должен отображаться, когда он получает реквизит от родительского компонента.

Как я могу это сделать? Прямо сейчас он отображается, когда я нажимаю кнопку, но без вызова функции getTranslate . В отладчике я вижу, что у компонента есть необходимые реквизиты, он просто не запускает мою функцию getTranslate

 import React, { useState } from "react";

import Axios from "axios";

const Output = (props) => {
  const [output, setOutput] = useState(null);
  const [url, setUrl] = useState(null);

  const getUrl = (language, text) => {
    console.log("GetURL ran with: ", language, text);
    let url = "";
    switch (language) {
      case "yoda":
        url =
          " https://api.funtranslations.com/translate/yoda.json?text="   text;
        break;

      case "valyrian":
        url =
          "https://api.funtranslations.com/translate/valyrian.json?text="  
          text;
        break;

      case "sith":
        url =
          "https://api.funtranslations.com/translate/sith.json?text="   text;
        break;

      case "shakespeare":
        url =
          "https://api.funtranslations.com/translate/shakespeare.json?text="  
          text;
        break;

      case "pirate":
        url =
          "https://api.funtranslations.com/translate/pirate.json?text="   text;
        break;

      case "minion":
        url =
          "https://api.funtranslations.com/translate/minion.json?text="   text;
        break;

      case "lolcat":
        url =
          "https://api.funtranslations.com/translate/lolcat.json?text="   text;
        break;

      case "klingon":
        url =
          "https://api.funtranslations.com/translate/klingon.json?text="   text;
        break;

      case "hacker":
        url =
          "https://api.funtranslations.com/translate/hacker.json?text="   text;
        break;

      case "dothraki":
        url =
          "https://api.funtranslations.com/translate/dothraki.json?text="  
          text;
        break;

      default:
        break;
    }

    setUrl(url);
  };

  const getTranslate = () => {
    getUrl(props.language, props.text);
    const axios = require("axios");
    axios.get(function (respone) {
      console.log("Here comes response from api call: ", respone);
      return respone.contents.translated;
    });
  };

  return (
    <div>
      <textarea placeholder="Translated..." value={{ getTranslate }}></textarea>
    </div>
  );
};

export default Output;

  

Ответ №1:

Вероятная проблема заключается в том, что вы не вызываете функцию getTranslate, похоже, она должна быть getTranslate(); также вам необходимо обновить состояние после получения данных .. см. Я разместил комментарии для руководства к решению… getTranslate не возвращает никакого значения, и место, в котором вы его вызываете, не подходит…

 const getTranslate = () => {
    getUrl(props.language, props.text);
    const axios = require("axios");
    axios.get(function (respone) {
      console.log("Here comes response from api call: ", respone);
/// update the variable /state/ prop that you want to bind
      return respone.contents.translated;
    });
  };
  

Затем привяжите значение в шаблоне:

 return (
    <div>
      <textarea placeholder="Translated..." value={ the value to bind from state/prop}></textarea>
    </div>
  )
  

;

Ответ №2:

Для вызова getTranslate() вы можете использовать метод жизненного цикла крючков useEffect() . И значение, возвращаемое из этой функции, может быть установлено в некоторое состояние и привязать установленное состояние к значению текстовой области.

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

import Axios from "axios";

const Output = (props) => {
  const [output, setOutput] = useState('');
  const [url, setUrl] = useState('');

  useEffect(()=>{
    getTranslate();

  })

  const getUrl = (language, text) => {
    console.log("GetURL ran with: ", language, text);
    let url = "";
    switch (language) {
      case "yoda":
        url =
          " https://api.funtranslations.com/translate/yoda.json?text="   text;
        break;

      case "valyrian":
        url =
          "https://api.funtranslations.com/translate/valyrian.json?text="  
          text;
        break;

      case "sith":
        url =
          "https://api.funtranslations.com/translate/sith.json?text="   text;
        break;

      case "shakespeare":
        url =
          "https://api.funtranslations.com/translate/shakespeare.json?text="  
          text;
        break;

      case "pirate":
        url =
          "https://api.funtranslations.com/translate/pirate.json?text="   text;
        break;

      case "minion":
        url =
          "https://api.funtranslations.com/translate/minion.json?text="   text;
        break;

      case "lolcat":
        url =
          "https://api.funtranslations.com/translate/lolcat.json?text="   text;
        break;

      case "klingon":
        url =
          "https://api.funtranslations.com/translate/klingon.json?text="   text;
        break;

      case "hacker":
        url =
          "https://api.funtranslations.com/translate/hacker.json?text="   text;
        break;

      case "dothraki":
        url =
          "https://api.funtranslations.com/translate/dothraki.json?text="  
          text;
        break;

      default:
        break;
    }

    setUrl(url);
  };

  const getTranslate = () => {
    console.log("From get translate")
    getUrl(props.language, props.text);
    Axios.get(function (respone) {
      console.log("Here comes response from api call: ", respone);
     setOutput(respone.contents.translated);
    });

  };

  return (
    <div>
      <textarea placeholder="Translated..." value={output} onChange={()=>console.log("Testing")}></textarea>
    </div>
  );
};

export default Output;
  

Ответ №3:

Вам необходимо переместить функциональность перевода либо в функцию «onChange», либо в функцию «onBlur» (если вы хотите, чтобы текст был переведен после того, как пользователь нажмет кнопку). Также функции, которые вы передаете onChange и onBlur, должны управлять асинхронным характером ваших функций перевода.

Ответ №4:

Вы можете использовать метод useEffect, который будет выполняться каждый раз при изменении реквизита или визуализации компонента.

 useEffect(()=>{
getTranslate();

 }, [props])