开发者问题收集

React 从 key:value 数组获取值

2022-02-16
5438

初学者问题。我知道这是一个简单的问题,但我无法让它工作。我正在将一个包含 k:v 对数组的对象传递给一个组件。最终,这个 props 将包含多个 k:v 对,但现在我只传递一个。

[{goal: 20000}]

在组件中,我试图获取值 20000,以便我可以将其显示在屏幕上。我似乎无法只得到数字。如果我查看 props.goal,我会得到整个 k:v。

[{goal: 20000}]

如果我尝试 props[0].goal,我会得到“TypeError:undefined 不是对象(评估‘props[0].goal’)”

我遗漏了什么?感谢您的帮助。

更新: 以下是相关组件的完整代码。

import { React, useState } from "react";
import Form from "react-bootstrap/Form";
import { Row, Col, Button } from "react-bootstrap";
import "./../css/Goal.css";

const Goal = (props) => {
  // const [goal, setGoal] = useState("");
  const [record, setRecord] = useState("");
  const monthlyGoal = 2;

  console.log("props[0]");
  console.log(props[0]); //undefined
  console.log("props");
  console.log({ props }); //See below

props: Object

goal: Object

goals: [{goal: 20000}] (1)

const handleInput = (event) => {
    console.log(event);
    event.preventDefault();
    setRecord(event.target.value);
    console.log(record);
  };

  const defaultOptions = {
    significantDigits: 2,
    thousandsSeparator: ",",
    decimalSeparator: ".",
    symbol: "$",
  };

  const formattedMonthlyGoal = (value, options) => {
    if (typeof value !== "number") value = 0.0;
    options = { ...defaultOptions, ...options };
    value = value.toFixed(options.significantDigits);

    const [currency, decimal] = value.split(".");
    return `${options.symbol} ${currency.replace(
      /\B(?=(\d{3})+(?!\d))/g,
      options.thousandsSeparator
    )}${options.decimalSeparator}${decimal}`;
  };

  return (
    <Form>
      <Row className="align-items-center flex">
        <Col sm={3} className="goal sm={3}">
          <Form.Control
            id="inlineFormInputGoal"
            placeholder="Goal"
            // onChange={(e) => setGoal(e.target.value)}
          />
          <Button type="submit" className="submit btn-3" onSubmit={handleInput}>
            Submit
          </Button>
        </Col>
        <Col>
          <h1 className="text-box">
            Goal: {formattedMonthlyGoal(monthlyGoal)}
          </h1>
        </Col>
      </Row>
    </Form>
  );
};
export default Goal;

更新 2:以下是父组件:

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

const Dashboard = () => {
  const [dashboardinfo, setdashboardinfo] = useState([]);
  useEffect(() => {
    async function fetchData() {
      try {
        const data = (await axios.get("/api/goals/getgoals")).data;
        setdashboardinfo(data);
      } catch (error) {
        console.log(error);
      }
    }
    fetchData();
  }, []);

  return (
    <React.Fragment>
      <Goal dashboardinfo={dashboardinfo} />
     
    </React.Fragment>
  );
};

export default Dashboard;
3个回答

如果您从控制台记录解构的 props 中获得如下对象:

{
  dashboardinfo: {goals: [{goal: 20000}]}
}

您需要使用 props.dashboardinfo.goals[0].goal 来获取该值。

Sean
2022-02-16

你的 props 包含对象“dashboardinfo”,因此你需要执行

props.dashboardinfo.goals[0].goal

或者更好的方法是像这样解构你的 props 对象

const Goal = ({dashboardinfo: { goals }}) => {
  ...
  goals[0].goal
  ...
}
LucasStbnr
2022-02-16

我相信我已经解决了我的问题。这并不是我想象中的访问 key:value 的问题,因为当页面初始化时,我能够获取值并正常显示它。但是,当我刷新页面时,我丢失了所有的 props 数据,这导致了错误。我追踪到 useState 似乎在我尝试读取它之前没有更新值。所以我在子组件中添加了一个 useEffect。

const Goal = (props) => {
  const [goal, setgoal] = useState([]);

  useEffect(() => {
    setgoal(props.goal);
    console.log("the goal", goal);
  }, [props.goal, goal]);

...

这似乎有效,因为我得到了我想要的信息,并且在刷新时没有收到任何错误。这可能不是解决这个问题的理想方法,但它确实有效。

VonHugenstein
2022-02-19