从reactjs中的另一个子组件触发子重新渲染

IT技术 reactjs
2021-05-12 06:39:08

我正在开发一个带有登录页面和主页的应用程序。在我的主页中,我有一个组件 A,它接受请求并将其发布到 nodejs 服务器,该服务器在数据库上更新它。另一个组件 B 从数据库中获取数据并显示它。我希望能够在组件 A 的请求与响应一起返回时重新呈现组件 B。

我知道我可以创建一个虚拟状态变量并将其传递给 B 并将一个 prop 函数传递给 A 以允许它更改它,但是有没有更有效的方法来做到这一点?

A 的获取请求的代码:

const onSubmit = async (event) => {
    event.preventDefault();

    if (vendor === "" || amount === "") {
    } else {
      const res = await axios.post(`http://localhost:4000/newpayment`, {
        vendor,
        amount,
      });
      // want to check res and rerender component B
    }

    setVendor("");
    setAmount("");
  };

组件 B 的代码:

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

const ComponentB= () => {
  const [payments, setPayments] = useState([]);

  const fetchPayments = async () => {
    const res = await axios.get(`http://localhost:4000/paymentspending`);

    setPayments(res.data);
  };

  useEffect(() => {
    fetchPayments();
  }, []);

  const onClick = async (id) => {
    await axios.post(`http://localhost:4000/markpaid`, { id });
    fetchPayments();
  };

  const renderedPayments = Object.values(payments).map((payment) => {
    return (
      <div
        className="card"
        style={{ width: "100%", marginBottom: "20px" }}
        key={payment.id}
      >
        <div className="card-body">
          <h4>{payment.vendor}</h4>
          <h5>{payment.amount}</h5>
          <button
            className="btn btn-success"
            onClick={() => onClick(payment.id)}
          >
            Mark as Paid
          </button>
        </div>
      </div>
    );
  });

  return <div className="d-flex flex-row flex-wrap">{renderedPayments}</div>;
};

export default ComponentB;
1个回答

有几种方法可以在组件之间共享状态:

  1. 抬起状态
  2. 将全局商店添加到应用程序,例如ReduxRecoil

如果是小应用,则解除状态。如果它是一个大项目,请使用 Redux。