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