reactjs - 如何更改我在 ReactJS 中动态状态的余额
问题描述
我是 useContext 的新手。我有一个提供者将我的源数据发送到我的名为 CheckBook 的函数。在 CheckBook 内部,我有可以显示我的 sourceData 的列和行。我想要的是根据贷方和借方属性更改余额属性。
const sourceData = [
{
tid: 1,
date: '2020-03-10T10:47:02-05:00',
credit: 100,
description: 'initial deposit',
},
{
tid: 2,
check_no: 1,
date: '2020-03-10T16:50:59Z',
debit: 3.14,
description: 'gum',
canceled: true,
},
{
tid: 3,
check_no: 2,
date: '2020-03-10T16:49:21-05:00',
debit: 3.14,
description: 'gum',
}
];
这是我的提供者
const CheckContext = React.createContext({
entries: [],
getEntries: async () => {},
setCancel: async (tid, value) => {},
});
export function CheckProvider(props) {
const [entries, setEntries] = React.useState(() =>
sourceData.map((item, rid) => ({
...item,
rid,
date: new Date(Date.parse(item.date)),
canceled: !!item.canceled,
}))
);
const contextValue = React.useMemo(() => {
const setCancel = async (tid, value) => {
setEntries((currentEntries) =>
currentEntries.map((item) => ({
...item,
canceled: item.tid === tid ? value : item.canceled,
}))
);
};
return {
entries: entries.map((item,index,array) => ({ ...item, balance:
index===0?item.credit:(
item.credit===undefined?(array[index-1].balance-item.debit):(array[index-1].balance+item.credit)
)
})),
setCancel,
};
}, [entries]);
我有一个名为 CheckBook 的函数。它在行和列中显示了我的 sourceData 属性。我创建了一个输入元素来将取消的属性更改为 true 或 false。但我不知道如何使用上下文来更改它。
// component to render the check book
export function CheckBook(props) {
const value=React.useContext(CheckContext)
console.log(value)
const [sortedField, setSortedField] = React.useState({
sortBy: '',
});
const toggleSort = (key) => {
let sortBy = 'asc';
setSortedField({ key, sortBy });
};
function renderRows(state) {
return (
<>
{entries.map((entry, index, array) => (
<tr key={entry.tid}>
<th scope="row">{entry.date.toUTCString()}</th>
<th scope="row">{entry.tid}</th>
<th scope="row">{entry.debit}</th>
<th scope="row">{entry.credit}</th>
<th scope="row">{entry.balance}</th>
<th scope="row">{entry.description}</th>
<th scope="row">
<input
onChange={(e) => setCancel(entry.tid, e.target.checked)}
type="checkbox"
></input>
</th>
</tr>
))}
</>
);
}
return (
<CheckContext.Consumer>
{(state) => (
<div className={'tableWrapper'}>
<table>
<thead>
<HeaderRow sortedField={sortedField} toggleSort={toggleSort} />
</thead>
<tbody>{renderRows(state)}</tbody>
</table>
</div>
)}
</CheckContext.Consumer>
);
}
解决方案
如果您按创建条目的顺序对条目进行排序,您可以创建一个新条目数组,其中每个条目包含余额,直到该条目使用reduce
下面是一个简单的示例代码,可以帮助
const entries = [
{ credit: 100, order: 1 },
{ debit: 50, order: 2 },
{ credit: 12, order: 3 },
{ debit: 5, order: 4 },
{ credit: 62, order: 5 }
];
const getValueToAdd = (entry) => 'credit' in entry ? entry.credit : -1 * entry.debit;
const { result } = entries.reduce((acc, entry) => {
acc.balance = acc.balance + getValueToAdd(entry);
acc.result.push({ ...entry, balance: acc.balance });
return acc;
}, { balance: 0, result: [] });
console.log(result)
结果将是
[
{ credit: 100, order: 1, balance: 100 },
{ debit: 50, order: 2, balance: 50 },
{ credit: 12, order: 3, balance: 62 },
{ debit: 5, order: 4, balance: 57 },
{ credit: 62, order: 5, balance: 119 },
]
推荐阅读
- node.js - 数据在数据库中发生变异但未更新
- r - 在 R 中更改系统发育中的尖端标签
- javascript - 如何停止打印“[object Object]”而不是对象本身?
- php - 使用imagick将AI文件转换为PNG
- extjs - 如何为 ext.js 网格中新添加的记录应用过滤器?
- javascript - 如何将 Winston 限制为每个日志文件只有 1 个文件描述符
- flutter - 如何访问 showModalBottomSheet 中提供的 (Provider.of()) 值?
- c# - 在基于网格的游戏中将对象放置在多个单元格上
- javascript - Discord JS:我将如何创建打开/关闭命令?
- mysql - 如何使用 GROUP_CONCAT 获取行 ID 的数据?