如何在 React 中使用 props 动态设置 child 组件中的数据?
How to set data in child component dynamically by using props in React?
我已经解决了
中的一个问题
现在我正在向后端发送向数据库添加新记录的请求,我想在添加新记录后立即通过从后端获取所有项目来更新 table。
这是我的 parent App.js class 有两个组件 MainPanel 和 TableFooterPanel :
function App() {
const [customers, setCustomers] = useState([]);
useEffect(() => {
const fetchPostList = async () => {
const response = await service.getCustomerList();
setCustomers(response.data);
};
fetchPostList()
}, []);
const refreshTableData = () => {
const fetchPostList = async () => {
const response = await service.getCustomerList();
setCustomers(response.data);
};
fetchPostList()
}
return (
<div className="App">
<h1>Customer List</h1>
<MainPanel param={customers}/>
<TableFooterPanel funcParam={refreshTableData}/>
</div>
);
}
export default App;
我正在将刷新功能传递给 TableFooterPanel,它有一个添加新记录的按钮,当添加新记录时会触发此功能。这是 TableFooterPanel
function TableFooterPanel(props) {
const [firstName, setFirstName] = useState('');
const [lastName, setLastName] = useState('');
const addNewCustomer = (name, surname) => {
service.addCustomer(name, surname);
props.funcParam();
}
return (
<>
<Card className='buttonFooter'>
<Form className='buttonFooter'>
<input type="text" placeholder="First Name" defaultValue={firstName} onChange={e => setFirstName(e.target.value)}></input>
<input type="text" placeholder="Last Name" defaultValue={lastName} onChange={e => setLastName(e.target.value)}></input>
<Button onClick={() => addNewCustomer(firstName, lastName)}>Add</Button>
</Form>
</Card>
</>
);
}
export default TableFooterPanel;
我想刷新位于 MainPanel:
中的 table 数据
function MainPanel(props) {
const [customers, setCustomers] = useState([]);
const deleteCustomer = (id) => {
service.deleteCustomerById(id);
}
return (
<ReactBootStrap.Table striped bordered hover>
<thead>
<tr>
<th>ID</th>
<th>First Name</th>
<th>Last Name</th>
<th>Delete</th>
</tr>
</thead>
<tbody>
{props.param &&
props.param.map((item) => (
<tr key={item.id}>
<td>{item.id}</td>
<td>{item.firstName}</td>
<td>{item.lastName}</td>
<td><Button onClick={() => deleteCustomer(item.id)} ><FontAwesomeIcon icon={faTrashRestore} /></Button></td>
</tr>
))}
</tbody>
</ReactBootStrap.Table>
);
}
这里发生的是当我添加一条新记录时,table 数据没有动态变化,但是如果我添加第二个数据然后我看到以前的数据并更新 table 但仍然没有显示最后添加的数据。如何刷新数据并将最新数据发送到 MainPanel?
export default MainPanel;
您的问题出在这部分:
const addNewCustomer = (name, surname) => {
service.addCustomer(name, surname);
props.funcParam();
}
您似乎在 addCustomer
服务调用完成之前调用刷新函数 (props.funcParam()
)(因为这是一个 Promise
)。这导致您的提取在更新之前开始提取现有数据。
您需要使函数异步,然后 await
像这样:
const addNewCustomer = async (name, surname) => {
await service.addCustomer(name, surname);
props.funcParam();
}
现在您的函数将等待 service.addCustomer
在执行刷新函数之前完成执行。
假设 service.addCustomer(name, surname) 是一个异步调用并将数据发布到服务器。然后你需要将 addNewCustomer 方法放入异步并等待此调用的响应,一旦你得到响应,你需要调用 props.funcParam( ) 从服务器获取最新数据。
我已经解决了
现在我正在向后端发送向数据库添加新记录的请求,我想在添加新记录后立即通过从后端获取所有项目来更新 table。
这是我的 parent App.js class 有两个组件 MainPanel 和 TableFooterPanel :
function App() {
const [customers, setCustomers] = useState([]);
useEffect(() => {
const fetchPostList = async () => {
const response = await service.getCustomerList();
setCustomers(response.data);
};
fetchPostList()
}, []);
const refreshTableData = () => {
const fetchPostList = async () => {
const response = await service.getCustomerList();
setCustomers(response.data);
};
fetchPostList()
}
return (
<div className="App">
<h1>Customer List</h1>
<MainPanel param={customers}/>
<TableFooterPanel funcParam={refreshTableData}/>
</div>
);
}
export default App;
我正在将刷新功能传递给 TableFooterPanel,它有一个添加新记录的按钮,当添加新记录时会触发此功能。这是 TableFooterPanel
function TableFooterPanel(props) {
const [firstName, setFirstName] = useState('');
const [lastName, setLastName] = useState('');
const addNewCustomer = (name, surname) => {
service.addCustomer(name, surname);
props.funcParam();
}
return (
<>
<Card className='buttonFooter'>
<Form className='buttonFooter'>
<input type="text" placeholder="First Name" defaultValue={firstName} onChange={e => setFirstName(e.target.value)}></input>
<input type="text" placeholder="Last Name" defaultValue={lastName} onChange={e => setLastName(e.target.value)}></input>
<Button onClick={() => addNewCustomer(firstName, lastName)}>Add</Button>
</Form>
</Card>
</>
);
}
export default TableFooterPanel;
我想刷新位于 MainPanel:
中的 table 数据function MainPanel(props) {
const [customers, setCustomers] = useState([]);
const deleteCustomer = (id) => {
service.deleteCustomerById(id);
}
return (
<ReactBootStrap.Table striped bordered hover>
<thead>
<tr>
<th>ID</th>
<th>First Name</th>
<th>Last Name</th>
<th>Delete</th>
</tr>
</thead>
<tbody>
{props.param &&
props.param.map((item) => (
<tr key={item.id}>
<td>{item.id}</td>
<td>{item.firstName}</td>
<td>{item.lastName}</td>
<td><Button onClick={() => deleteCustomer(item.id)} ><FontAwesomeIcon icon={faTrashRestore} /></Button></td>
</tr>
))}
</tbody>
</ReactBootStrap.Table>
);
}
这里发生的是当我添加一条新记录时,table 数据没有动态变化,但是如果我添加第二个数据然后我看到以前的数据并更新 table 但仍然没有显示最后添加的数据。如何刷新数据并将最新数据发送到 MainPanel?
export default MainPanel;
您的问题出在这部分:
const addNewCustomer = (name, surname) => {
service.addCustomer(name, surname);
props.funcParam();
}
您似乎在 addCustomer
服务调用完成之前调用刷新函数 (props.funcParam()
)(因为这是一个 Promise
)。这导致您的提取在更新之前开始提取现有数据。
您需要使函数异步,然后 await
像这样:
const addNewCustomer = async (name, surname) => {
await service.addCustomer(name, surname);
props.funcParam();
}
现在您的函数将等待 service.addCustomer
在执行刷新函数之前完成执行。
假设 service.addCustomer(name, surname) 是一个异步调用并将数据发布到服务器。然后你需要将 addNewCustomer 方法放入异步并等待此调用的响应,一旦你得到响应,你需要调用 props.funcParam( ) 从服务器获取最新数据。