如果一块表走的不准,那它每一秒都是错的。

写在前面的话:博主之前一直使用的vue框架,最近入手公司项目,开始一点点接触React,我觉得学习任何东西的最好方法就是使用它、体验他。其实完成页面前我根本没有读过react的官方文档(是有些许枯燥)但我会仿照别人的代码一点点尝试,用过之后再去看官方使用文档会豁然开朗。这个方法值得推荐。因此,咱们今天来初试React开发,实现简单的个人中心-信息修改页面


1. 看页面需求

首先看一下页面需求。分析:进入页面调用接口初始化个人信息,修改后点击“保存”按钮,调接口保存数据后刷新页面。

2. 分析接口文档

页面初始化加载列表接口为detail,无需请求参数,携带用户token即可,返回数据包含mobile、email;    信息修改接口为updateUserInfo,包含两个请求参数,mobile、email必填

3. React目录文件夹说明

每一个模块定义一个文件夹,包含page.tsx(页面HTML样式)model.ts(编写接口)style.less(CSS样式)

4. 编写页面代码

在page.tsx页面中写

function Container({ dispatch, form, container: { editData } }: any) {const { validateFields} = formreturn (<PageHeaderLayout title="列表" className={'commonList'}><CardclassName={styles.table}style={{ marginTop: 1, marginLeft: 1 }}bordered={false}bodyStyle={{ padding: '8px 32px 32px 32px' }}><div style={{ textAlign: 'center', width: '700', marginLeft: '20' }}><Form//labelAlign="left"layout="horizontal"className={styles.commonForm}labelCol={{ span: 3 }}wrapperCol={{ span: 12 }}><Form.Item label="用户名">{getFieldDecorator('name', {initialValue: (editData && editData.name) || ''})(<Input placeholder="请输入" disabled />)}</Form.Item><Form.Item label="电话号码">{getFieldDecorator('mobile', {initialValue: (editData && editData.mobile) || '',})(<Input placeholder="请输入" />)}</Form.Item><Form.Item label="邮箱地址">{getFieldDecorator('email', {initialValue: (editData && editData.email) || '',})(<Input placeholder="请输入" />)}</Form.Item><Button className={styles.search} onClick={onSave}>保存</Button></Form></div></Card></PageHeaderLayout>)
}

5. 页面初始化-数据回显

(1)在model.ts文件里写如下代码。发送请求manage/ucenter/detail,请求参数query其实为空,并将请求返回的数据data.data赋值给editData存储在setStore里面

init: async (action, { dispatch }) => {const { query } = getLocation()const data = await dispatch({type: 'container/get',params: ['manage/ucenter/detail', query]})dispatch({type: 'container/setStore',params: [{ editData: data.data }]})},

(2)在page页的Container中添加初始化调用的函数

const init = useCallback(() => {dispatch('container/init')}, [dispatch])useEffect(() => {init()}, [dispatch, init])

(3)【数据回显】在page页面通过function Container({ dispatch, form, container: { editData } }: any) 将container中的editData拿到,因此可以放在表单里的initialValue。

<Form.Item label="用户名">{getFieldDecorator('name', {initialValue: (editData && editData.name) || ''})(<Input placeholder="请输入" disabled />)}
</Form.Item>

至此就完成了页面初始化,可以看到数据显示了。

6. 保存功能的实现

(1)在model页面写update接口,接口为manage/ucenter/updateUserInfo,返回数据为a

update: async ({ params: [remoteValue] }, { dispatch }) => {let a = await dispatch({type: 'container/post',params: ['manage/ucenter/updateUserInfo', remoteValue]})return a}

(2)在保存按钮上添加点击事件onClick={onSave}并在page页面写onSave方法。其中fieldValue里面保存着form表单验证的数据对象,因此可以取到对应input的值。

const onSave = useCallback(() => {const { validateFields } = formvalidateFields((err: any, fieldValue: any) => {if (err) returnlet res = {mobile: fieldValue.mobile,email: fieldValue.email}dispatch({type: 'container/update',params: [res]}).then((v: any) => {console.log(v)if (v.code === 200) {message.success('保存成功')init()} else {message.error(v.message)}})})}, [dispatch, form, init])

至此可以实现保存功能。

7. 表单验证

Ant Design 表单中getFieldDecorator、getFieldValue、setFieldValue用法Ant Design 表单中getFieldDecorator、getFieldValue、setFieldValue用法 - 健人雄 - 博客园

getFieldDecorator是一个方法,这个方法接收两个参数,第一个是表单的字段对象,第二个是验证规则。这个方法本身返回一个方法,需要将需要获取值的标签包裹进去。

(1)验证手机号

<Form.Item label="电话号码">{getFieldDecorator('mobile', {initialValue: (editData && editData.mobile) || '',rules: [{ required: true, message: '电话号码不能为空' },{pattern: /^((\+)?86|((\+)?86)?)0?1[3458]\d{9}$/,message: '请输入正确的电话号码'}]})(<Input placeholder="请输入" type="number" />)}</Form.Item>

(2)验证邮箱

<Form.Item label="邮箱地址">{getFieldDecorator('email', {initialValue: (editData && editData.email) || '',rules: [{pattern: /^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$/,// pattern: /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/,// pattern: /^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.]){1,2}[A-Za-z\d]{2,5}$/g,message: '邮箱格式不正确'},{max: 50,message: '邮箱不得超过50字符'},{ required: true, message: '邮箱地址不能为空' }]})(<Input placeholder="请输入" />)}
</Form.Item>

8. style样式

.commonForm{margin-top: 20px;:global{.ant-input{width:600px;height:40px;margin-left: 10px;}.ant-form.ant-form-inline{display: flex !important}}
}
.search{width: 120px;height: 40px;opacity: 1;background: #2b7dff;border-radius: 4px;font-size: 14px;font-weight: 400;text-align: left;color: #ffffff;line-height: 21px;text-align: center;display: block;margin-left:300px
}

9. 页面效果

10. 页面源码

// model.ts
import commonModel from '../../../../models/commonModel'
import { modelExtend } from 'tyrael'
import { listMOM } from '../../../../common/dict'
import { getLocation } from '../../../../utils/tool'
const model: ModelExtend = modelExtend(commonModel, {state: {selectedRows: [],listData: {},productData: [],editData: {},detailData: {}},namespace: 'container',effects: {init: async (action, { dispatch }) => {const { query } = getLocation()const data = await dispatch({type: 'container/get',params: ['manage/ucenter/detail', query]})dispatch({type: 'container/setStore',params: [{ editData: data.data }]})},update: async ({ params: [remoteValue] }, { dispatch }) => {let a = await dispatch({type: 'container/post',params: ['manage/ucenter/updateUserInfo', remoteValue]})return a}},reducers: {}
})
export default model
// page.tsx
import React, { useEffect, useCallback, useMemo, useState } from 'react'
import { connect } from 'react-redux'
import PageHeaderLayout from '../../../../components/PageHeaderLayout/index'
import { getLocation } from '../../../../utils/tool'
import styles from './style.less'
import { Form, Input, Button, Card, Select, message } from 'antd'
function Container({ dispatch, form, container: { editData } }: any) {const { getFieldDecorator, validateFields, getFieldValue } = formconst { query } = getLocation()const init = useCallback(() => {dispatch('container/init')}, [dispatch])useEffect(() => {init()}, [dispatch, init])const onSave = useCallback(() => {const { validateFields } = formvalidateFields((err: any, fieldValue: any) => {if (err) returnlet res = {mobile: fieldValue.mobile,email: fieldValue.email}dispatch({type: 'container/update',params: [res]}).then((v: any) => {console.log(v)if (v.code === 200) {message.success('保存成功')init()} else {message.error(v.message)}})})}, [dispatch, form, init])return (<PageHeaderLayout title="列表" className={'commonList'}><CardclassName={styles.table}style={{ marginTop: 1, marginLeft: 1 }}bordered={false}bodyStyle={{ padding: '8px 32px 32px 32px' }}><div style={{ textAlign: 'center', width: '700', marginLeft: '20' }}><Form//labelAlign="left"layout="horizontal"className={styles.commonForm}labelCol={{ span: 3 }}wrapperCol={{ span: 12 }}><Form.Item label="用户名">{getFieldDecorator('name', {initialValue: (editData && editData.name) || ''})(<Input placeholder="请输入" disabled />)}</Form.Item><Form.Item label="电话号码">{getFieldDecorator('mobile', {initialValue: (editData && editData.mobile) || '',rules: [{ required: true, message: '电话号码不能为空' },{pattern: /^((\+)?86|((\+)?86)?)0?1[3458]\d{9}$/,message: '电话号码格式不正确'}]})(<Input placeholder="请输入" type="number" />)}</Form.Item><Form.Item label="邮箱地址">{getFieldDecorator('email', {initialValue: (editData && editData.email) || '',rules: [{pattern: /^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$/,// pattern: /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/,// pattern: /^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.]){1,2}[A-Za-z\d]{2,5}$/g,message: '邮箱格式不正确'},{max: 50,message: '邮箱不得超过50字符'},{ required: true, message: '邮箱地址不能为空' }]})(<Input placeholder="请输入" />)}</Form.Item><Button className={styles.search} onClick={onSave}>保存</Button></Form></div></Card></PageHeaderLayout>)
}
export default connect(({ container, loading }: any) => {return {container,loading: loading.models.container}
})(Form.create()(Container))

【React入门实践】结合Ant-Design从0带你手把手开发【个人中心-信息修改】页面相关推荐

  1. Ant Design 4.0 进行时!

    引言 Ant Design 于 17 年 12 月发布 3.0 以来,已经经历了 16 个月的时间.在此期间,我们修复了海量 Bug.以及增加大量新功能(更新日志).提交了 4289 个 commit ...

  2. Ant Design 3.0 使用案例

    代码地址如下: http://www.demodashi.com/demo/12309.html 本文适合对象 有过React使用经验. 有过webpack使用经验. 了解node. DEMO使用方式 ...

  3. 小米回应暴力裁员;报告称安卓手机贬值速度是 iPhone 两倍;Ant Design 4.0.1 发布| 极客头条...

    整理 | 屠敏 头图 | CSDN 下载自东方 IC 快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦 ...

  4. 大会 | SEE Conf:Ant Design 3.0 背后的故事

    SEE Conf大会精彩回顾 1月6日,首届蚂蚁金服体验科技大会 SEE Conf 2018 在杭州成功召开.SEE = Seeking Experience & Engineering,意为 ...

  5. react(88)--ant design控制inputNumber设置正整数

    })(<InputNumberformatter={limitDecimals}parser={limitDecimals}placeholder="请输入助力人数"min= ...

  6. React开发(182):ant design table中 带线框的列表

    ReactDOM.render(<Tablecolumns={columns}dataSource={data}borderedtitle={() => 'Header'}footer={ ...

  7. react(79)--ant design确认框

    <Popconfirmplacement="rightBottom"title={text}onConfirm={confirm}okText="Yes" ...

  8. 编辑器设计系列:每天都在用,你真的了解它么? | Ant Design 4.0 系列分享

    提起编辑器,你会想到什么? 也许你从来没有意识到,但是从接触计算机开始,你就和各种编辑器打上了交道. Windows 98 中的画图软件也许是你的启蒙.计算机课上当你敲下第一个五彩斑斓的字,作出第一张 ...

  9. Ant Design Pro 网络请求,视图绑定model并且渲染到页面 umi-request

    封装网络请求,在service中新建接口,在model调用service,在视图绑定model并且得到网络请求的回调函数,获取网络请求的数据渲染到页面. 网络请求数据走向: 1.在utils/requ ...

  10. ant design pro之带参数的路由

    脚手架默认支持带参数的路由,但是在菜单中显示带参数的路由需要在代码中自行处理 {path: '/dashboard/:page',hideInMenu:true,name: 'analysis',co ...

最新文章

  1. mac 思科 链路聚合_EtherChannel Cisco 端口聚合详解
  2. 【Android 应用开发】自定义View 和 ViewGroup
  3. 计算机 运行命令,教你电脑运行命令
  4. 微软认知服务应用秘籍 – 与机器人聊知识
  5. 模式窗口showModalDialog的用法总结
  6. ajax分批mysql_使用select2分批异步加载大量数据
  7. 趣图:他居然在前端写业务逻辑!
  8. 多线程设计模式总结(一)
  9. i2c-tools 编译安装和使用
  10. BSOD Diagnostics
  11. iif在mysql能用不_在写SQL语句时,你们会经常用IIF(ISNULL(字段))吗
  12. 180个非常有用的电脑知识
  13. CATIA无法连接到服务器解决方案
  14. python控制多个屏幕_多设备控制 + 屏幕操作录制重放 实现完整多设备测试流程...
  15. 计算机上面的按键作用,电脑键盘上各种键的作用是什么 电脑键盘上每个键的作用说明【图文】...
  16. 2020.8.4课堂笔记(IO 缓冲流,对象流)
  17. 利用条形码扫描技术的智能仓储管理解决方案
  18. Source Insight 4.0安装
  19. Yum安装支持InfiniBand的lustre——Install Lustre with InfiniBand Support By Yum
  20. 力软快速开发平台推荐功能之表单应用

热门文章

  1. 计算机关机时间设置方法,win7 设置定时关机方法_win7 如何设置关机时间-win7之家...
  2. UFS开发板代码分析
  3. python alpha通道_Python Pillow v2.6.0 paletted PNG(256)如何添加Alpha通道?
  4. 在Ubuntu上安装KDE(Kubuntu)
  5. 送客户的祝福语_送给客户的温馨祝福语
  6. 安装已中止,安装程序并未成功地运行完成 - Windows
  7. 工商银行历年考试真题 银行校园招聘考试笔试资料
  8. XPT2046电阻触摸屏芯片的使用
  9. TSC2004 电阻式触摸屏控制器驱动问题
  10. win7关闭系统索引服务器,win7系统彻底关闭索引的恢复步骤