## 使用State收集表格資料,傳送表格到後端 在輸入的過程當中,直接把輸入值寫進state當中,後續在呼叫API的時候,state就有資料,不需要再透過javascript收集資料 ```javascript= import React, { Component } from 'react'; import axios from 'axios'; class Table extends Component { constructor(props) { super(props); this.state = { name: "", email: "", address: "", phone: "" }; } // 將input輸入欄位存到state當中,使用以下寫法可以簡化重複的程式碼,動態指定欄位名稱 // 不需要每個欄位都寫一個changeHandler changeHandler = (event) => { this.setState({ [event.target.name]: event.target.value // 如同 name: event.target.value, // 差別是欄位的名稱會依照觸發事件的元件改變 }); } // 如果不使用上述changeHandler的做法,需要針對每個欄位都寫各別的onChange事件 changeNameHandler = (event) => { this.setState({ name: event.target.value // email: event.target.value // address: event.target.value // phone: event.target.value }); } // 送出按鈕 // 直接使用state傳遞,無需將值從form當中取出,話說也沒有form就是了 addTableAction = () => { axios.post("http://localhost:8080/addTable", this.state) .then(response => { console.log(response.data); }); } render() { const { name, email, address, phone } = this.state; return ( <> <table> <tr> <td>姓名:</td> <td><input type="text" name="name" onChange={this.changeHandler} /></td> </tr> <tr> <td>Email:</td> <td><input type="text" name="email"onChange={this.changeHandler} /></td> </tr> <tr> <td>地址:</td> <td><input type="text" name="address" onChange={this.changeHandler}/></td> </tr> <tr> <td>電話:</td> <td><input type="text" name="phone" onChange={this.changeHandler} /></td> </tr> <tr> <td colSpan="2"><input type="button" name="submit" value="送出" onClick={this.addTableAction}/></td> </tr> </table> <hr/> <h3>表格即時輸入值</h3> <table> <tr> <td>姓名:</td> <td>{name}</td> </tr> <tr> <td>Email:</td> <td>{email}</td> </tr> <tr> <td>地址:</td> <td>{address}</td> </tr> <tr> <td>電話:</td> <td>{phone}</td> </tr> </table> </> ); } } export default Table; ``` ## 一個元件依不同的情境,做不同的運算 ### 需要父子兩個元件來達成,透由父元件傳遞不同的運算邏輯給子元件,子元件就不需要撰寫運算,只需要負責呼叫父元件傳遞進來的function即可 ![截圖 2024-01-11 上午12.10.46](https://hackmd.io/_uploads/HkEWGH3Oa.png) ### 父元件 ```javascript= class Parent extends Component { render() { return ( <div> <Child title={'我是加法'} calFun={(x, y) => x + y }/> <hr/> <Child title={'我是乘法'} calFun={(x, y) => x * y }/> </div> ); } } ``` ### 子元件 ```javascript= class Child extends Component { constructor(props) { super(props); this.state = { x: null, y: null, result: null } } // X的欄位有異動時,擷取輸入值更新State xChange = (event) => { this.setState({x: event.target.value}); } // Y的欄位有異動時,擷取輸入值更新State yChange = (event) => { this.setState({y: event.target.value}); } // 計算公式 handleCalculate = () => { // const { x, y } = this.state; 這個用法叫做解構 // 把state裡面的x跟y直接宣告成變數,之後就不用在this.state.x const { x, y } = this.state; const { calFun } = this.props; // 調用父元件傳遞的計算函數 const result = calFun(Number(x), Number(y)); this.setState({result: result}); }; render() { const { x, y, result } = this.state; const { title } = this.props; return ( <div> <h2>{title}</h2> X: <input type="number" onChange={this.xChange}/><br/> Y: <input type="number" onChange={this.yChange}/><br/> <button onClick={this.handleCalculate}>計算</button> <h3>X: {x}</h3><h3>Y: {y}</h3><h3>結果: {result}</h3> </div> ); } } ``` ![截圖 2024-01-11 上午12.22.34](https://hackmd.io/_uploads/Byj8NSnO6.png)