【问题标题】:Change buton color when get axios response获取 axios 响应时更改按钮颜色
【发布时间】:2021-11-26 12:46:58
【问题描述】:

我有一个调用端点的反应控制器。当我收到响应时,我会在一个对象中显示信息,并且我想更改按钮的颜色以表示响应是 200 还是 404。

import React, { useState, useEffect } from "react";
import "./../App.css";
import axios from "axios";
const MicroService = (props) => {
  const [personsGet, setPersonGet] = useState([]);

  function llamadaAxiosGet (url) {
    axios
      .get(url)
      .then((res) => {
        setPersonGet(res.data);
        return res.status;
      })
      .catch(function (error) {
        return error.status;
      });
  }

  return (
    <div>
      <h2>Microservicio:</h2>
      <BotonLlamada
        url={`https://jsonplaceholder.typicode.com/users`}
        textBoton={"Llamada al servicio y display all"}
        llamadaAxiosGet={llamadaAxiosGet}
      />
      {personsGet.map((person) => (
        <li key={person.name}>{person.name}</li>
      ))}
    </div>
  );
};

function BotonLlamada(props) {
  const [colorButon, setColorButon] = useState("");
  const [estado , setEstado]= useState(0);

  const onClickbuton = () => {
    setEstado(props.llamadaAxiosGet(props.url));
    setEstado(props.llamada);
    if (estado === 200) {
      setColorButon("buttonGreen");
    } else if (estado > 399) {
      setColorButon("buttonRed");
    }
  };

  useEffect(() => {
    if (estado > 399) {
      setColorButon("buttonRed");
    } else if (estado === 200) {
      setColorButon("buttonGreen");
    }
  },[estado]);
  return (
    <div>
      <button onClick={onClickbuton} className={colorButon}>
        {props.textBoton}
      </button>
      <br />
    </div>
  );
}

export default MicroService;

所以在代码中,因为 axios 是异步的,所以在完成按钮中的 onClick 方法后会收到响应,但按钮不会改变颜色。 有人可以帮忙吗?

【问题讨论】:

  • 您正在更改按钮的类别。某处是否有根据类更改按钮颜色的 CSS 规则?
  • 是的,setColorButon("buttonRed");这将检查一个 CSS 并更改它
  • 你能发一个Minimal, Reproducible Example吗?

标签: javascript reactjs axios


【解决方案1】:

我认为你应该在BotonLlamada 组件中移动llamadaAxiosGet 函数调用并将setPersonGet 状态属性传递给它:

const MicroService = (props) => {
  const [personsGet, setPersonGet] = useState([]);

  return (
    <div>
      <h2>Microservicio:</h2>
      <BotonLlamada
        textBoton={"Llamada al servicio y display all"}
        setPersonGet={setPersonGet}
      />
      {personsGet.map((person) => (
        <li key={person.name}>{person.name}</li>
      ))}
    </div>
  );
};

function BotonLlamada(props) {
  const [colorButon, setColorButon] = useState("");
  const [estado , setEstado]= useState(0);

  function llamadaAxiosGet () {
    axios
      .get(`https://jsonplaceholder.typicode.com/users`)
      .then((res) => {
        props.setPersonGet(res.data);
        setEstado(res.status);
        setColorButon("buttonGreen");
      })
      .catch(function (error) {
        setEstado(error.status);
        setColorButon("buttonRed");
      });
  }

  useEffect(() => {
    if (estado > 399) {
      setColorButon("buttonRed");
    } else if (estado === 200) {
      setColorButon("buttonGreen");
    }
  },[estado]);

  return (
    <div>
      <button onClick={() => llamadaAxiosGet() } className={colorButon}>
        {props.textBoton}
      </button>
      <br />
    </div>
  );
}

export default MicroService;

【讨论】:

  • 太完美了!我虽然我必须调用父级中的 axios,因为信息将在父级中接收,但是使用 props.setPersonGet(res.data) 你解决了所有问题!先生,你真是个天才!
【解决方案2】:

您的问题是您将状态设置为数字承诺。

一个简单的解决方法是:

const onClickbuton = () => {
  props.llamadaAxiosGet(props.url)
    .then(status => setEstado(status));
};

您还可以重构并将您的逻辑转移到父组件。

import React, { useState } from "react";
import "./../App.css";
import axios from "axios";

function BotonLlamada({ colour, onClick, textBoton }) {
  return (
    <div>
      <button onClick={onClick} className={colour}>
        {textBoton}
      </button>
      <br />
    </div>
  );
}

const MicroService = (props) => {
  const [personsGet, setPersonGet] = useState([]);
  const [colour, setColour] = useState("");

  function llamadaAxiosGet(url) {
    axios
      .get(url)
      .then((res) => {
        setPersonGet(res.data);
        return res.status;
      })
      .catch(function (error) {
        return error.status;
      })
      .then((status) => {
        if (status > 399) {
          setColour("buttonRed");
        } else if (status === 200) {
          setColour("buttonGreen");
        }
      });
  }

  return (
    <div>
      <h2>Microservicio:</h2>
      <BotonLlamada
        textBoton={"Llamada al servicio y display all"}
        onClick={() =>
          llamadaAxiosGet(`https://jsonplaceholder.typicode.com/users`)
        }
        colour={colour}
      />
      {personsGet.map((person) => (
        <li key={person.name}>{person.name}</li>
      ))}
    </div>
  );
};

export default MicroService;

【讨论】:

  • 我知道这条评论稍微改变了我原来问题的范围,如果你有 2 个 botons 因为它们共享颜色状态,你就改变它们。但是对于一个 boton 来说效果很好:) 非常感谢!你也是个天才!
猜你喜欢
  • 2019-08-31
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 2014-07-11
相关资源
最近更新 更多