现在我们需要一个页面来展现数据库中记录的用户。

/src/pages下新建UserList.js文件。

创建并导出UserList组件:

import React from 'react';

class UserList extends React.Component {

  render () {
return (
...
);
}
} export default UserList;

当页面加载的时候需要调用接口来获取用户列表,并把获取到的用户列表数据存放到组件的state中(this.state.userList):

class UserList extends React.Component {
constructor (props) {
super(props);
this.state = {
userList: []
};
} componentWillMount () {
fetch('http://localhost:8000/user')
.then(res => res.json())
.then(res => {
this.setState({
userList: res
});
});
} render () { ... }
}

render方法中,使用数组的map方法将用户数据渲染为一个表格:

src / pages / UserList.js

import React from 'react';

// 用户列表
class UserList extends React.Component {
// 构造器
constructor(props) {
super(props);
// 定义初始化状态
this.state = {
userList: []
};
} /**
* 生命周期
* componentWillMount
* 组件初始化时只调用,以后组件更新不调用,整个生命周期只调用一次
*/
componentWillMount(){
// 请求数据
fetch('http://localhost:8000/user')
.then(res => res.json())
.then(res => {
/**
* 成功的回调
* 数据赋值
*/
this.setState({
userList: res
});
});
} render() {
// 定义变量
const { userList } = this.state; return (
<div>
<header>
<h1>用户列表</h1>
</header> <main>
<table>
<thead>
<tr>
<th>用户ID</th>
<th>用户名</th>
<th>性别</th>
<th>年龄</th>
</tr>
</thead> <tbody>
{
userList.map((user) => {
return (
<tr key={user.id}>
<td>{user.id}</td>
<td>{user.name}</td>
<td>{user.gender}</td>
<td>{user.age}</td>
</tr>
);
})
}
</tbody>
</table>
</main>
</div>
);
}
} export default UserList;

/src/index.js文件中添加指向这个页面的路由,并在/src/pages/Home.js中加入相应的链接:

src / index.js

// 配置路由
import React from 'react';
import ReactDOM from 'react-dom';
// 引入react-router
import { Router, Route, hashHistory } from 'react-router';
import HomePage from './pages/Home';
import UserAddPage from './pages/UserAdd'; // 添加用户页
import UserListPage from './pages/UserList' // 用户列表页 // 渲染
ReactDOM.render((
<Router history={hashHistory}>
<Route path="/" component={HomePage} />
<Route path="/user/add" component={UserAddPage} />
<Route path="/user/list" component={UserListPage} />
</Router>
), document.getElementById('root'));

src / pages / Home.js

import React from 'react';
import { Link } from 'react-router'; class Home extends React.Component {
// 构造器
constructor(props) {
super(props);
// 定义初始化状态
this.state = {};
} render() {
return (
<div>
<header>
<h1>Welcome</h1>
</header> <main>
<Link to="/user/list">用户列表</Link>
<br />
<Link to="/user/add">添加用户</Link>
</main>
</div>
);
}
} export default Home;

最后,我们可以在添加用户之后,使用this.context.router.push方法来跳转到用户列表页面:

npm i react-prop-types -S

src / pages / UserAdd.js

// 引入 prop-types
import PropTypes from 'prop-types'; class UserAdd extends React.Component {
handleSubmit (e) {
... fetch('http://localhost:8000/user', { ... })
.then((res) => res.json())
.then((res) => {
if (res.id) {
alert('添加用户成功');
this.context.router.push('/user/list'); // 跳转到用户列表页面
return;
} else {
alert('添加失败');
}
})
.catch((err) => console.error(err));
}
render () { ... }
} // 必须给UserAdd定义一个包含router属性的contextTypes
// 使得组件中可以通过this.context.router来使用React Router提供的方法
UserAdd.contextTypes = {
router: PropTypes.object.isRequired
};

完整代码 UserAdd.js:

import React from 'react';
import FormItem from '../components/FormItem';
// 高阶组件 formProvider表单验证
import formProvider from '../utils/formProvider';
// 引入 prop-types
import PropTypes from 'prop-types'; // 添加用户组件
class UserAdd extends React.Component {
// 按钮提交事件
handleSubmit(e){
// 阻止表单submit事件自动跳转页面的动作
e.preventDefault();
// 定义常量
const { form: { name, age, gender }, formValid} = this.props; // 组件传值
// 验证
if(!formValid){
alert('请填写正确的信息后重试');
return;
}
// 发送请求
fetch('http://localhost:8000/user', {
method: 'post',
// 使用fetch提交的json数据需要使用JSON.stringify转换为字符串
body: JSON.stringify({
name: name.value,
age: age.value,
gender: gender.value
}),
headers: {
'Content-Type': 'application/json'
}
})
// 强制回调的数据格式为json
.then((res) => res.json())
// 成功的回调
.then((res) => {
// 当添加成功时,返回的json对象中应包含一个有效的id字段
// 所以可以使用res.id来判断添加是否成功
if(res.id){
alert('添加用户成功!');
this.context.router.push('/user/list'); // 跳转到用户列表页面
return;
}else{
alert('添加用户失败!');
}
})
// 失败的回调
.catch((err) => console.error(err));
} render() {
// 定义常量
const {form: {name, age, gender}, onFormChange} = this.props;
return (
<div>
<header>
<div>添加用户</div>
</header> <main>
<form onSubmit={(e) => this.handleSubmit(e)}>
<FormItem label="用户名:" valid={name.valid} error={name.error}>
<input
type="text"
value={name.value}
onChange={(e) => onFormChange('name', e.target.value)}/>
</FormItem> <FormItem label="年龄:" valid={age.valid} error={age.error}>
<input
type="number"
value={age.value || ''}
onChange={(e) => onFormChange('age', e.target.value)}/>
</FormItem> <FormItem label="性别:" valid={gender.valid} error={gender.error}>
<select
value={gender.value}
onChange={(e) => onFormChange('gender', e.target.value)}>
<option value="">请选择</option>
<option value="male">男</option>
<option value="female">女</option>
</select>
</FormItem>
<br />
<input type="submit" value="提交" />
</form>
</main>
</div>
);
}
} // 必须给UserAdd定义一个包含router属性的contextTypes
// 使得组件中可以通过this.context.router来使用React Router提供的方法
UserAdd.contextTypes = {
router: PropTypes.object.isRequired
}; // 实例化
UserAdd = formProvider({ // field 对象
// 姓名
name: {
defaultValue: '',
rules: [
{
pattern: function (value) {
return value.length > 0;
},
error: '请输入用户名'
},
{
pattern: /^.{1,4}$/,
error: '用户名最多4个字符'
}
]
},
// 年龄
age: {
defaultValue: 0,
rules: [
{
pattern: function(value){
return value >= 1 && value <= 100;
},
error: '请输入1~100的年龄'
}
]
},
// 性别
gender: {
defaultValue: '',
rules: [
{
pattern: function(value) {
return !!value;
},
error: '请选择性别'
}
]
}
})(UserAdd); export default UserAdd;

这样我们在添加用户之后就可以立即在列表中看到最新添加的用户了:

最新文章

  1. iOS - 静态库的创建与使用
  2. ipython又一方便的调试和应用工具!!!
  3. 闲谈Tomcat性能优化
  4. 未能解析此远程名称:&#39;nuget.org&#39; 的解决方法
  5. 在asp.net前台页面中引入命名空间 和连接数据库
  6. Android的IPC机制(一)——AIDL的使用
  7. WebAPI接口测试之matthewcv.WebApiTestClient
  8. MFC--自定义消息
  9. python3之递归
  10. 6.Django session
  11. HTML学记笔记
  12. DAY08、文件操作
  13. 9--Python入门--模块
  14. 带列表写入文件出错先 json.dumps
  15. ASP.NET 实现重启系统或关机
  16. 异构数据库之间完全可以用SQL语句导数据
  17. 杭电oj2001-C语言
  18. 阿里巴巴Java开发手册-命名规约
  19. [UE4]C++ STL总结
  20. 电脑网络IP固定地址自动改变!

热门文章

  1. php生成订单号-当天从1开始自增
  2. du查看文件大小
  3. Webstorm 的 Tab 键调整缩进值
  4. vue解决IOS10低版本白屏问题
  5. RestTemplate接收HashMap变为LinkedHashMap,RestTemplate接收数据后转成json数据出现反斜杠
  6. CocoaPods 命令和使用
  7. 如何HTML标签和JS中设置CSS3 var变量
  8. mysql事物隔离
  9. 树莓派 -- 输入设备驱动 (key) 续2: 转载 Setting up a GPIO-Button “keyboard” on a Raspberry Pi
  10. Python之面向对象新式类和经典类