多次渲染反应组件 onClick
Render react component multiple times onClick
您好,我正在开发一个费用跟踪器,老实说,我已经坚持了太久了。我试图多次渲染我的 Expense 组件。我知道我需要 .map 它,所以我不确定我应该如何从我所在的地方开始。任何帮助都会很棒,我很难真正突破反应。尽管我在这个基本应用程序上苦苦挣扎,但我觉得我就在那里。
const initialValues = {payment: '', purchase: '', date:'', location: '', price: ''};
const [formValues, setFormValues] = useState([initialValues]);
const onHandleChange = (e) => {
const value = e.target.value;
setFormValues({...formValues,
[e.target.name]: value
});
}
下面是我如何尝试渲染我的多个费用组件
const userRows = Object.keys(formValues).map((value) =>{
<Expense formValues={value} />
})
console.log(userRows)
return(
<table className="expense-container">
<tbody className='expense-list'>
{userRows}
下面是我的费用部分
return(
<tr className='tableRow expense'>
<td className="mr-2">{formValues.payment}</td>
<td className="mr-1">{formValues.purchase}</td>
<td className="mr-1">{formValues.date}</td>
<td className="mr-1">{formValues.location}</td>
<td className="mr-1">{formValues.price}</td>
</tr>
)
正如 Diego 所说,您缺少来自 userRows 映射函数的 return 语句。当您将 formValue prop 传递到 Expense 组件时,您只是从对象传递一个键,而不是对象本身。这是因为您正在映射对象的键。此外,您正在将 formValues 状态初始化为一个包含对象的数组。但是在您的 handleChange 函数中,您将状态设置为一个对象。
我不确定您其余代码的结构,但我假设您正在尝试创建一个用户可以提交新费用的表单。不要对表格和费用使用相同的状态,而应将它们分成两个独立的状态。像这样。
const initialValues = {payment: '', purchase: '', date:'', location: '', price: ''}
const [formValues, setFormValues] = useState(initialValues);
const [expenses, setExpenses] = useState([])
const onHandleChange = (e) => {
const value = e.target.value;
setFormValues({...formValues,
[e.target.name]: value
});
}
const onSubmit = () => {
// Append new expense to the expenses array
setExpenses(previousExpenses => [...previousExpenses, formValues]);
// Reset Form
setFormValues(initialValues);
}
您可以使用括号直接从 map 方法 return。
// map over the expenses array and create a component based on each object in the array
const userRows = expenses.map((expenseObject) =>(
<Expense formValues={expenseObject} />
))
或者只使用 return 语句。
// map over the expenses array and create a component based on each object in the array
const userRows = expenses.map((expenseObject) =>{
return (<Expense formValues={expenseObject} />)
})
还要确保在您的 Expense 组件中您正在解构道具以获取 formValues 道具,我认为这就是您正在做的。
您好,我正在开发一个费用跟踪器,老实说,我已经坚持了太久了。我试图多次渲染我的 Expense 组件。我知道我需要 .map 它,所以我不确定我应该如何从我所在的地方开始。任何帮助都会很棒,我很难真正突破反应。尽管我在这个基本应用程序上苦苦挣扎,但我觉得我就在那里。
const initialValues = {payment: '', purchase: '', date:'', location: '', price: ''};
const [formValues, setFormValues] = useState([initialValues]);
const onHandleChange = (e) => {
const value = e.target.value;
setFormValues({...formValues,
[e.target.name]: value
});
}
下面是我如何尝试渲染我的多个费用组件
const userRows = Object.keys(formValues).map((value) =>{
<Expense formValues={value} />
})
console.log(userRows)
return(
<table className="expense-container">
<tbody className='expense-list'>
{userRows}
下面是我的费用部分
return(
<tr className='tableRow expense'>
<td className="mr-2">{formValues.payment}</td>
<td className="mr-1">{formValues.purchase}</td>
<td className="mr-1">{formValues.date}</td>
<td className="mr-1">{formValues.location}</td>
<td className="mr-1">{formValues.price}</td>
</tr>
)
正如 Diego 所说,您缺少来自 userRows 映射函数的 return 语句。当您将 formValue prop 传递到 Expense 组件时,您只是从对象传递一个键,而不是对象本身。这是因为您正在映射对象的键。此外,您正在将 formValues 状态初始化为一个包含对象的数组。但是在您的 handleChange 函数中,您将状态设置为一个对象。
我不确定您其余代码的结构,但我假设您正在尝试创建一个用户可以提交新费用的表单。不要对表格和费用使用相同的状态,而应将它们分成两个独立的状态。像这样。
const initialValues = {payment: '', purchase: '', date:'', location: '', price: ''}
const [formValues, setFormValues] = useState(initialValues);
const [expenses, setExpenses] = useState([])
const onHandleChange = (e) => {
const value = e.target.value;
setFormValues({...formValues,
[e.target.name]: value
});
}
const onSubmit = () => {
// Append new expense to the expenses array
setExpenses(previousExpenses => [...previousExpenses, formValues]);
// Reset Form
setFormValues(initialValues);
}
您可以使用括号直接从 map 方法 return。
// map over the expenses array and create a component based on each object in the array
const userRows = expenses.map((expenseObject) =>(
<Expense formValues={expenseObject} />
))
或者只使用 return 语句。
// map over the expenses array and create a component based on each object in the array
const userRows = expenses.map((expenseObject) =>{
return (<Expense formValues={expenseObject} />)
})
还要确保在您的 Expense 组件中您正在解构道具以获取 formValues 道具,我认为这就是您正在做的。