public/index.html
p<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta
name="description"
content="Web site created using create-react-app"
/>
<link rel="stylesheet" href="%PUBLIC_URL%/base.css">
<link rel="stylesheet" href="%PUBLIC_URL%/bootstrap.min.css">
<title>React App</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
App.js
import React, {
Component
} from 'react'
import StudentTitle from './Components/StudentTitle'
import AddStudents from './Components/AddStudents'
import StudentList from './Components/StudentList'
class App extends Component {
state = {
studentList: [
{
number: '1',
name: 'Links',
age: '22',
sex: '男',
college: '大前端',
hobbies: ['篮球']
},
{
number: '2',
name: 'ReoNa',
age: '22',
sex: '女',
college: 'python',
hobbies: ['网球']
},
{
number: '3',
name: 'Aimyon',
age: '25',
sex: '女',
college: 'Java',
hobbies: ['网球']
}
]
}
addList = (student, cb) => {
this.setState({
studentList: [ ...this.state.studentList, student ]
}, () => {
cb()
})
}
removeStudent = (number) => {
const studentList = JSON.parse(JSON.stringify(this.state.studentList))
const index = studentList.findIndex(student => student.number === number)
studentList.splice(index, 1)
this.setState({
studentList
}, () => {
console.log(this.state.studentList)
})
}
render() {
return (
<div className="container">
<StudentTitle />
<AddStudents addList={ this.addList } />
<StudentList
studentList={ this.state.studentList }
removeStudent={ this.removeStudent }
/>
</div>
)
}
}
export default App
src/Components/StudentTitle.js
import React, { Component } from 'react'
class StudentTitle extends Component {
render () {
return (
<div className="col-md-12">
<h3 className="title">学生信息管理</h3>
</div>
)
}
}
export default StudentTitle
src/Components/AddStudents.js
import React, { Component } from 'react'
class AddStudents extends Component {
constructor(props) {
super()
this.handler = this.handler.bind(this)
}
state = {
number: '',
name: '',
sex: '女',
age: '',
college: '大前端',
hobbies: [
{
id: 1,
title: '篮球',
isChecked: false
},
{
id: 2,
title: '足球',
isChecked: false
},
{
id: 3,
title: '网球',
isChecked: false
}
]
}
origin = JSON.parse(JSON.stringify(this.state))
handler = (e) => {
const value = e.target.value
const prop = e.target.name
this.setState({
[prop]: value
})
}
hobbyHandler = (e, index) => {
const isChecked = e.target.checked
const hobbies = [...this.state.hobbies]
hobbies[index].isChecked = isChecked
this.setState({
hobbies
})
}
submit = (e) => {
e.preventDefault()
const hobbies = this.state.hobbies
.filter(item => item.isChecked)
.map(item => item.title)
const formVal = {
...this.state, hobbies
}
this.props.addList(formVal, () => {
this.setState(this.origin)
})
}
render() {
return (
<div className="col-md-5">
<form onSubmit={ this.submit }>
<div className="form-group">
<label>学号</label>
<input
name="number"
value={this.state.number}
onChange={this.handler}
type="number"
className="form-control"
placeholder="请输入学号" />
</div>
<div className="form-group">
<label>姓名</label>
<input
name="name"
value={this.state.name}
onChange={this.handler}
type="text"
className="form-control"
placeholder="请输入姓名"
/>
</div>
<div className="form-group">
<label>性别 </label>
<label className="checkbox-inline">
<input
name="sex"
checked={this.state.sex === '男'}
onChange={this.handler}
type="radio" value="男" /> 男
</label>
<label className="checkbox-inline">
<input
name="sex"
checked={this.state.sex === '女'}
onChange={this.handler}
type="radio"
value="女" /> 女
</label>
</div>
<div className="form-group">
<label>年龄</label>
<input
name="age"
value={this.state.age}
onChange={this.handler}
type="text"
className="form-control"
placeholder="请输入年龄"
/>
</div>
<div className="form-group">
<label>爱好</label>
{
this.state.hobbies.map((item, index) => {
return (
<div
className="checkbox"
key={ item.id }
>
<label>
<input
type="checkbox"
value={ item.title }
checked={ item.isChecked }
onChange={ (e) => { this.hobbyHandler(e, index) } }
/>
{ item.title }
</label>
</div>
)
})
}
</div>
<div className="form-group">
<label>所属学院</label>
<select
name="college"
value={this.state.college}
onChange={this.handler}
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 AddStudents
src/Components/StudentList.js
import React, { Component } from 'react'
class StudentList extends Component {
rmStudent = (e, number) => {
e.preventDefault()
if (window.confirm('是否确定删除当前项')) {
this.props.removeStudent(number)
}
}
render() {
const { studentList } = this.props
let totalAge = 0
let avgAge = 0
studentList.forEach(student => totalAge += Number(student.age))
avgAge = Math.floor(totalAge / studentList.length )
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>
{
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>2020-08-02</td>
<td>
{ student.hobbies.map((hobby, index) => (<span key={ index }>{ hobby }</span>)) }
</td>
<td>{ student.college }</td>
<td>
<span
onClick={ (e) => this.rmStudent(e, student.number) }
>删除</span>
</td>
</tr>
)
})
}
</tbody>
</table>
{ studentList.length === 0 ?
<p className="text-center">无学生信息</p> :
'' }
<p>总共有 { studentList.length } 个学生</p>
<p>学生的平均年龄是 { avgAge }</p>
</div>
)
}
}
export default StudentList