Reactjs 为什么我得到的TypeError无法读取未定义的属性映射,尽管我的事务状态对象正在动态更新?
“添加事务”按钮未在事务历史记录容器中呈现事务列表 这段代码Reactjs 为什么我得到的TypeError无法读取未定义的属性映射,尽管我的事务状态对象正在动态更新?,reactjs,typeerror,map-function,Reactjs,Typeerror,Map Function,“添加事务”按钮未在事务历史记录容器中呈现事务列表 这段代码{transaction&&transaction.map(trans)…正在呈现应用程序UI,但添加事务按钮没有在事务历史容器中动态生成事务组件} 我的Transaction.js文件有一个包含输入文本和金额的ul列表,但该组件未在应用程序UI中呈现 import React from 'react' const Transaction = ({transaction,text,amount}) => { return (
{transaction&&transaction.map(trans)…
正在呈现应用程序UI,但添加事务按钮没有在事务历史容器中动态生成事务组件}
我的Transaction.js
文件有一个包含输入文本和金额的ul列表,但该组件未在应用程序UI中呈现
import React from 'react'
const Transaction = ({transaction,text,amount}) => {
return (
<div className='transaction'>
{text}<span>{amount}</span>
</div>
)
}
export default Transaction;
从“React”导入React
常量事务=({Transaction,text,amount})=>{
返回(
{text}{amount}
)
}
出口违约交易;
我重新创建了这个应用程序,它可以正常工作,没有任何问题
以下是工作演示的链接:
import React,{useState,useffect}来自“React”;
从“/TransactionList”导入TransactionList;
从“/AddTransaction”导入AddTransaction;
常量应用=()=>{
const[transaction,setTransaction]=useState([]);
const handleTransaction=值=>{
setTransaction([…事务,值]);
};
const expenseList=transaction.filter(trans=>Number(trans.amount)<0);
const expense=expenseList.reduce(
(会计科目,当前)=>会计科目+数字(当前金额),
0
);
const amountList=transaction.filter(trans=>Number(trans.amount)>0);
const amount=amountList.reduce((acc,curr)=>acc+Number(curr.amount),0);
useffect(()=>{
console.log(“来自应用:”,事务);
},[交易];
返回(
收入:{JSON.stringify(金额)}{”“}
总费用:{JSON.stringify(费用)}
余额:{金额+费用}
);
};
导出默认应用程序;
从“React”导入React;
从“/Transaction”导入事务;
常量TransactionList=({transaction})=>{
日志(“来自tl:”,事务);
返回(
交易历史
{transaction.map(trans=>(
))}
);
};
导出默认事务列表;
从“React”导入React;
常量事务=({text,amount})=>{
返回(
{text}
{amount}
);
};
出口违约交易;
import React,{useState}来自“React”
const AddTransaction=
({handleTransaction})
=> {
const[item,setItem]=useState(“”)
const[amount,setAmount]=useState(0)
const onSubmit=(e)=>{
e、 预防默认值();
手交易(
{
案文:项目,
金额:金额,,
id:Math.floor(Math.random()*1000),
}
);
设置项(“”);
设定金额(“”);
}
返回(
添加新事务
正文
setItem(e.target.value)}
占位符=“输入文本…”/>
金额
(负-费用,正-收入)
setAmount(e.target.value)}
占位符=“输入金额…”/>
添加事务
);
}
导出默认AddTransaction;
您已经向我们展示了您在哪里更新事务状态,但您能否向我们展示您首先在哪里创建它?App.js const[transaction,setTransaction]=useState([]);感谢您的努力……但我想知道我的代码有什么问题,为什么它没有在UI中呈现列表?检查TransactionList
的代码,您错误地传递了文本和金额。此外,所提供的CodeSandbox链接缺少一些代码,因为我必须自己创建整个应用程序。是的,但我试图在没有contextApi的情况下构建它
import React from 'react'
import './App.css';
import Transaction from './Transaction.js';
const TransactionList = ({text,transaction,amount}) => {
return (
<div className='transactionlist-container'>
<div className='transactionlist-header-container'>
<h4>
Transaction History
</h4>
</div>
<ul>
<li>
{ transaction.map(trans =>
<Transaction
amount={transaction.amount}
text={transaction.text}
key={transaction.id} />
)}
</li>
</ul>
</div>
)
}
export default TransactionList;
import React from 'react'
const Transaction = ({transaction,text,amount}) => {
return (
<div className='transaction'>
{text}<span>{amount}</span>
</div>
)
}
export default Transaction;
import React, { useState, useEffect } from "react";
import TransactionList from "./TransactionList";
import AddTransaction from "./AddTransaction";
const App = () => {
const [transaction, setTransaction] = useState([]);
const handleTransaction = value => {
setTransaction([...transaction, value]);
};
const expenseList = transaction.filter(trans => Number(trans.amount) < 0);
const expense = expenseList.reduce(
(acc, curr) => acc + Number(curr.amount),
0
);
const amountList = transaction.filter(trans => Number(trans.amount) > 0);
const amount = amountList.reduce((acc, curr) => acc + Number(curr.amount), 0);
useEffect(() => {
console.log("From app:", transaction);
}, [transaction]);
return (
<div className="transactionlist-container">
<div>
<span>income: {JSON.stringify(amount)}</span>{" "}
<span> total expense: {JSON.stringify(expense)}</span>
<span> balance: {amount + expense}</span>
</div>
<TransactionList transaction={transaction} />
<AddTransaction
transaction={transaction}
handleTransaction={handleTransaction}
/>
</div>
);
};
export default App;
import React from "react";
import Transaction from "./Transaction";
const TransactionList = ({ transaction }) => {
console.log("from tl:", transaction);
return (
<div className="transactionlist-container">
<div className="transactionlist-header-container">
<h4>Transaction History</h4>
</div>
{transaction.map(trans => (
<Transaction amount={trans.amount} text={trans.text} key={trans.id} />
))}
</div>
);
};
export default TransactionList;
import React from "react";
const Transaction = ({ text, amount }) => {
return (
<div className="transaction">
{text}
<span>{amount}</span>
</div>
);
};
export default Transaction;
import React,{useState} from "react"
const AddTransaction =
({handleTransaction})
=> {
const [item,setItem] = useState("")
const [amount, setAmount] = useState(0)
const onSubmit = (e) => {
e.preventDefault();
handleTransaction(
{
text: item,
amount: amount,
id: Math.floor(Math.random()*1000),
}
);
setItem('');
setAmount('');
}
return (
<div
className="inputBox"
>
<div className='add-trans-header'>
<h4>Add New Transaction</h4>
</div>
<form>
<div className="form-control">
<label htmlFor="text">Text</label>
<input type="text" value={item}
onChange={(e) => setItem(e.target.value)}
placeholder="Enter text..." />
</div>
<div className="form-control">
<label htmlFor="amount"
>Amount <br />
(negative - expense, positive - income)
</label>
<input type="number" value={amount}
onChange={(e) => setAmount(e.target.value)}
placeholder="Enter amount..." />
</div>
<button type='button' onClick={onSubmit}
value='submit'
className="btn">
Add transaction
</button>
</form>
</div>
);
}
export default AddTransaction;