Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否更新其他组件中的已删除项?_Javascript_Reactjs - Fatal编程技术网

Javascript 是否更新其他组件中的已删除项?

Javascript 是否更新其他组件中的已删除项?,javascript,reactjs,Javascript,Reactjs,我正在建立一个预算计算器,计算交易和收入,并返回余额。我可以选择删除收入和交易,但当我单击按钮时,它会消失,但不会更新余额。余额在一个组件中,而删除列表的按钮在另一个组件中。我不知道从哪里开始。有人能给我指出正确的方向吗 这是我的密码: class App extends React.Component { constructor(props) { super(props); this.state = { balance: [0] } } get

我正在建立一个预算计算器,计算交易和收入,并返回余额。我可以选择删除收入和交易,但当我单击按钮时,它会消失,但不会更新余额。余额在一个组件中,而删除列表的按钮在另一个组件中。我不知道从哪里开始。有人能给我指出正确的方向吗

这是我的密码:

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      balance: [0]
    }

  }
  getBalance = (total) => {
    console.log(total)
    this.setState((prevState) => ({
      balance: [prevState.balance, total].reduce((acc, currentVal) => {
        return Number(acc) + Number(currentVal)
      }, 0)
    }));
  }

  render() {
    return (
      <div className="App" >
        <div className="count">
          <h2 className="balancetitle">Your Balance</h2>
          <h1 style={{ color: this.state.balance >= 0 ? 'green' : 'red' }}>${this.state.balance}</h1>
        </div>
        <Transactions getBalance={(total) => this.getBalance([total])} />
        <Income getBalance={(total) => this.getBalance([total])} />
      </div>
    );
  }
}
const Transactions = (props) => {
    const [expenses, setExpense] = useState([])
    const [amount, setAmount] = useState([])
    const [id, setId] = useState([])
    const [listOfTrans, setListofTrans] = useState([])
    const [total, setTotal] = useState([0])


    //fires on click or enter
    const handleSubmit = (e) => {
        e.preventDefault();
        addExpense({
            amount,
            expenses,
            id
        });
        props.getBalance(-Math.abs(amount));
        setAmount('');
        setExpense('');

    }


    //get value of inputs
    const getValue = (hookSetter) => (e) => {
        let { value } = e.target;
        return hookSetter(value)
    }
    // turn amount and expense into objects and put them setListofTranas
    const addExpense = (expenseObject) => {
        setListofTrans([...listOfTrans, expenseObject])

    }

    // get total amount of listoftrans
    const getAmount = () => {

        if (listOfTrans.length >= 0) {
            let listAmount = listOfTrans.map(list => {
                if (list.amount) {
                    return -Math.abs(list.amount);
                } else {
                    return 0;
                }
            })

            return listAmount.reduce((acc, currentValue) => {
                return Number(acc) + Number(currentValue)

            }, 0)
        } else return 0

    }


    //update amount total on click
    useEffect(() => {
        setTotal(getAmount())

    }, [listOfTrans])

    // delete item from array
    const deleteExpense = (i) => {
        let objExpense = i
        setListofTrans(listOfTrans.filter((list) => {
            return list.id !== objExpense
        }))
    }


    return (

        <div className="transactions">
            <div className="expenses">
                <span>{amount === '' || expenses === '' ? <p>Please Fill Out Input Fields</p> : ''}</span>
                <form onSubmit={handleSubmit}>
                    <input
                        type="text"
                        id="expense"
                        className="formfield"
                        name="expense"
                        placeholder="Expense..."
                        value={expenses}
                        onChange={getValue(setExpense)}
                    />
                    <input
                        type="text"
                        id="amount"
                        className="formfield"
                        name="amount"
                        placeholder="Amount..."
                        value={amount}
                        onChange={getValue(setAmount)}
                    />
                    <button type="submit">Submit</button>
                </form>
            </div>
            <div className="finalbalance ">
                <div className="finalexpense final">

                    <table>
                        <tbody>
                            <tr>
                                <th>Total Expenses: ${total}</th>
                            </tr>
                            <tr>
                                <th>EXPENSES</th>
                                <th>AMOUNT</th>
                            </tr>
                        </tbody>
                        {
                            listOfTrans.map((trans, i) => {
                                return (
                                    <tbody key={trans.id}>
                                        <tr key={trans.id++}>
                                            <td>{trans.expenses}</td>
                                            <td>{"$" + trans.amount}</td>
                                            <td>
                                                <button onClick={() => deleteExpense(trans.id)}>
                                                    <i className="fas fa-trash-alt"></i>
                                                </button>
                                            </td>
                                        </tr>
                                    </tbody>
                                )
                            })
                        }
                    </table>
                </div>
            </div>
        </div>


    )
}
类应用程序扩展了React.Component{
建造师(道具){
超级(道具);
此.state={
余额:[0]
}
}
getBalance=(总计)=>{
console.log(总计)
this.setState((prevState)=>({
余额:[prevState.balance,total]。减少((acc,currentVal)=>{
返回编号(acc)+编号(currentVal)
}, 0)
}));
}
render(){
返回(
你的余额
=0?'green':'red'}>${this.state.balance}
此.getBalance([total])}/>
此.getBalance([total])}/>
);
}
}
常量事务=(道具)=>{
const[expenses,setExpense]=useState([])
const[amount,setAmount]=useState([])
const[id,setId]=useState([])
const[listOfTrans,setListofTrans]=useState([])
常量[total,setTotal]=useState([0])
//单击或输入即可激发
常量handleSubmit=(e)=>{
e、 预防默认值();
附加费用({
数量
费用,
身份证件
});
道具.getBalance(-Math.abs(amount));
设定金额(“”);
固定费用(“”);
}
//获取输入值
const getValue=(hookSetter)=>(e)=>{
设{value}=e.target;
返回钩子设置器(值)
}
//将金额和费用转化为对象,并将其放在Tranas的setListofTranas中
const addExpense=(expenseObject)=>{
setListofTrans([…listOfTrans,expenseObject])
}
//获取listoftrans的总量
常量getAmount=()=>{
if(listOfTrans.length>=0){
让listAmount=listOfTrans.map(列表=>{
如果(列表金额){
return-Math.abs(list.amount);
}否则{
返回0;
}
})
返回listAmount.reduce((acc,currentValue)=>{
返回编号(acc)+编号(currentValue)
}, 0)
}否则返回0
}
//点击更新总金额
useffect(()=>{
setTotal(getAmount())
},[listOfTrans])
//从数组中删除项
成本费用=(i)=>{
设objExpense=i
SetListOftTrans(ListOftTrans.filter((列表)=>{
return list.id!==对象费用
}))
}
返回(
{金额==''| |费用==''?请填写输入字段

:'} 提交 总费用:${Total} 费用 数量 { listOfTrans.map((trans,i)=>{ 返回( {交易费用} {“$”+交易金额} deleteExpense(trans.id)}> ) }) } ) }
删除交易时,您需要将金额添加(或减去,以与添加费用相反的金额为准)回总余额

const deleteExpense = (i) => {
  let objExpense = i;
  setListofTrans(
    listOfTrans.filter((list) => {
      if (list.id === objExpense) {
        props.getBalance(Math.abs(list.amount)); // <-- add the amount back to balance
        return false;
      }
      return true
    })
  );
};
const deleteExpense=(i)=>{
设objExpense=i;
setListofTrans(
listOfTrans.filter((列表)=>{
if(list.id==对象费用){

props.getBalance(Math.abs(list.amount));//还有,我本来打算这么做的,但我一直认为你必须在不同的区域保留不同的组件,我对组件的拆分做得太多了。@Alanaj啊,不客气,再一次!)当然。不过,我认为一个好的经验法则是,不要将任何状态存储在任何可以从现有状态轻松派生/计算的地方,比如数组上的值的总和。大概数组只有在更新时才会重新排序,所以余额只会同时更新。