组件拆分
- src/App.js ```jsx import React, { Component } from “react”; import StudentTitle from “./Components/StudentTitle”; import AddStudent from “./Components/AddStudent”; import StudentList from “./Components/StudentList”;
class App extends Component { render() { return (
export default App;
- src/Components/StudentsTitle.js```jsximport React, { Component } from "react";class AddStudent extends Component {render() {return (<div className="col-md-12"><h3 className="title">学生信息管理</h3></div>);}}export default AddStudent;
- src/Components/AddStudent.js ```jsx import React, { Component } from “react”;
class StudentTitle extends Component { render() { return (
export default StudentTitle;
- src/Components/StudentList.js```jsximport React, { Component } from "react";class StudentList extends Component {render() {return (<div className="col-md-6 col-md-offset-1"><table className="table table-striped table-hover"><thead><tr><th>学号</th><th>姓名</th><th>性别</th><th>年龄</th><th>入学时间</th><th>爱好</th><th>所属学院</th><th>操作</th></tr></thead><tbody><tr><td>01</td><td>张三</td><td>男</td><td>20</td><td>2020-08-02</td><td><span>足球</span></td><td>python</td><td><a>删除</a><a>修改</a></td></tr></tbody></table><p className="text-center">无学生信息</p><p>总共有 50 个学生</p><p>学生的平均年龄是 25</p></div>);}}export default StudentList;
添加学生信息
数据绑定需更新
- AddStudents.js ```jsx import React, { Component } from “react”;
class AddStudent extends Component { constructor() { super(); this.stateHandler = this.stateHandler.bind(this); this.hobbyHandler = this.hobbyHandler.bind(this) }
//01 定义组件中的状态 state = { number: “”, name: “”, sex: “男”, age: “”, collage: “大前端”, hobbies: [ { id: 1, title: “篮球”, isChecked: false, }, { id: 2, title: “足球”, isChecked: false, }, { id: 3, title: “网球”, isChecked: false, }, ], }; stateHandler(ev) { // 获取当前输入的值,调用 setState 更新具体的属性 const prop = ev.target.name; this.setState( {
[prop]: ev.target.value,},() => {console.log(this.state);});
} hobbyHandler(index,ev){ // 当前操作需要提前获取被操作选项的索引,事件对象 const isChecked = ev.target.checked const hobbies = […this.state.hobbies] hobbies[index].isChecked = isChecked
this.setState({hobbies}, () => {console.log(this.state)})
} render() { return (
export default AddStudent;
<a name="ob1hD"></a>### 提交学生信息- AddStudent.js```jsximport React, { Component } from "react";class AddStudent extends Component {constructor() {super();this.stateHandler = this.stateHandler.bind(this);this.hobbyHandler = this.hobbyHandler.bind(this)}//01 定义组件中的状态state = {number: "",name: "",sex: "男",age: "",collage: "大前端",hobbies: [{id: 1,title: "篮球",isChecked: false,},{id: 2,title: "足球",isChecked: false,},{id: 3,title: "网球",isChecked: false,},],};// 深拷贝一份状态 用于重置origin = JSON.parse(JSON.stringify(this.state))stateHandler(ev) {// 获取当前输入的值,调用 setState 更新具体的属性const prop = ev.target.name;this.setState({[prop]: ev.target.value,},() => {console.log(this.state);});}hobbyHandler(index,ev){// 当前操作需要提前获取被操作选项的索引,事件对象const isChecked = ev.target.checkedconst hobbies = [...this.state.hobbies]hobbies[index].isChecked = isCheckedthis.setState({hobbies}, () => {console.log(this.state)})}submit = (ev) => {ev.preventDefault()console.log(this.state)//提交时需要将表单里的有用信息整合在一起// 筛选出我们当前次选中的爱好const hobbies = this.state.hobbies.filter(hobby => hobby.isChecked).map(hobby => hobby.title)// 数据组合const fromValue = {...this.state,hobbies}console.log(fromValue)// 将当前数据利用回调传回给上层组件this.props.addStudent(fromValue, () => {// 重置this.setState(this.origin)})}render() {return (<div className="col-md-5"><form onSubmit={this.submit}><div className="form-group"><label>学号</label><inputvalue={this.state.number}onChange={this.stateHandler}name={"number"}type="number"className="form-control"placeholder="请输入学号"/></div><div className="form-group"><label>姓名</label><inputvalue={this.state.name}onChange={this.stateHandler}name={"name"}type="text"className="form-control"placeholder="请输入姓名"/></div><div className="form-group"><label>性别 </label><label className="checkbox-inline"><inputchecked={this.state.sex === "男"}name="sex"onChange={this.stateHandler}type="radio"value="男"/> 男</label><label className="checkbox-inline"><inputchecked={this.state.sex === "女"}name="sex"onChange={this.stateHandler}type="radio"value="女"/> 女</label></div><div className="form-group"><label>年龄</label><inputname={"age"}value={this.state.age}onChange={this.stateHandler}type="text"className="form-control"placeholder="请输入姓名"/></div><div className="form-group"><label>爱好</label>{this.state.hobbies.map((hobby,index) => {return (<div className="checkbox" key={hobby.id}><label><inputchecked={hobby.isChecked}type="checkbox"value={hobby.title}onChange={(ev) => {this.hobbyHandler(index, ev)}}/> {hobby.title}</label></div>);})}</div><div className="form-group"><label>所属学院</label><selectname={"collage"}onChange={this.stateHandler}value={this.state.collage}className="form-control"><option value="大前端">大前端</option><option value="Java">Java</option><option value="python">python</option></select></div><button type="submit" className="btn btn-default">添加</button></form></div>);}}export default AddStudent;
- App.js ```jsx import React, { Component } from “react”; import StudentTitle from “./Components/StudentTitle”; import AddStudent from “./Components/AddStudent”; import StudentList from “./Components/StudentList”;
class App extends Component { // 定义状态用于管理学员信息 state = { studentList: [] } // 处理 studentList 状态 addStudent = (student, callback) => { this.setState({ studentList: […this.state.studentList, student] // 合并更新 },() => { callback() console.log(this.state.studentList) }) } render() { return (
export default App;
<a name="bGtGH"></a>## 学生信息展示- App.js```jsx<StudentList studentList={this.state.studentList} />
- StudentList.js ```jsx import React, { Component } from “react”;
class StudentList extends Component { render() { // 解构出学生信息数据 const { studentList } = this.props; return (
| 学号 | 姓名 | 性别 | 年龄 | 爱好 | 所属学院 | 操作 |
|---|---|---|---|---|---|---|
| {student.number} | {student.name} | {student.sex} | {student.age} | { student.hobbies.map(hobby => { return ( {hobby} ) }) } | {student.collage} | 删除 修改 |
无学生信息
总共有 50 个学生
学生的平均年龄是 25
export default StudentList;
<a name="dawer"></a>## 学生信息删除- StudentList.js```jsximport React, { Component } from "react";class StudentList extends Component {// 删除rmStudent = (index, ev) => {ev.preventDefault()if(window.confirm('是否确定删除当前项')){this.props.removeStudent(index)}}render() {// 解构出学生信息数据const { studentList } = this.props;return (<div className="col-md-6 col-md-offset-1"><table className="table table-striped table-hover"><thead><tr><th>学号</th><th>姓名</th><th>性别</th><th>年龄</th><th>爱好</th><th>所属学院</th><th>操作</th></tr></thead><tbody>{studentList.map((student) => {return (<tr key={student.number}><td>{student.number}</td><td>{student.name}</td><td>{student.sex}</td><td>{student.age}</td><td>{student.hobbies.map(hobby => {return (<span key={hobby}>{hobby} </span>)})}</td><td>{student.collage}</td><td><button onClick={(ev) => {this.rmStudent(student.number,ev)}}>删除</button></td></tr>);})}</tbody></table><p className="text-center">无学生信息</p><p>总共有 50 个学生</p><p>学生的平均年龄是 25</p></div>);}}export default StudentList;
- App.js ```jsx import React, { Component } from “react”; import StudentTitle from “./Components/StudentTitle”; import AddStudent from “./Components/AddStudent”; import StudentList from “./Components/StudentList”;
class App extends Component { // 定义状态用于管理学员信息 state = { studentList: [ { number: “01”, name: “张三”, sex: “男”, age: 10, date: “2020-12-04”, hobbies: [“足球”, “篮球”], collage: “大前端”, }, { number: “02”, name: “李四”, sex: “男”, age: 20, date: “2030-12-05”, hobbies: [“足球”, “橄榄球”], collage: “Java”, }, { number: “03”, name: “王五”, sex: “男”, age: 30, date: “2040-11-03”, hobbies: [“足球”, “橄榄球”, “篮球”], collage: “python”, }, ], }; // 处理 studentList 状态
// 删除学生信息 removeStudent = (number) => { // 利用 number 找到 studentList 中需要删除的项,并删除当前项 // 将处理后的数据重新 setState 给 state,更新视图
// 深拷贝原数据const studentList = JSON.parse(JSON.stringify(this.state.studentList))// 查找 number 对应项const index = studentList.findIndex(student => student.number === number)// 删除studentList.splice(index, 1)// 更新this.setState({studentList})
} render() { return (
export default App;
<a name="HedYQ"></a>## 计算平均值- StudentList.js```jsximport React, { Component } from "react";class StudentList extends Component {// 删除render() {// 解构出学生信息数据const { studentList } = this.props;// 总年龄之和let totalAge = 0studentList.forEach(hobby => totalAge += Number(hobby.age))// 平均年龄let averAge = 0averAge = Math.floor(totalAge / studentList.length)return (<div className="col-md-6 col-md-offset-1">{ studentList.length > 0 ? null : <p className="text-center">无学生信息</p>}<p>总共有 {studentList.length} 个学生</p><p>学生的平均年龄是 {averAge}</p></div>);}}export default StudentList;
