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

文章介绍了如何在React应用中使用AntDesign库实现页面初始化、数据回显、表单验证和保存功能,包括使用useCallback、useEffect和Redux管理状态,以及API接口调用和表单组件的使用方法。
摘要由CSDN通过智能技术生成

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) || ‘’

})()}

</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 } = form

validateFields((err: any, fieldValue: any) => {

if (err) return

let 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: ‘请输入正确的电话号码’

}

]

})()}

</Form.Item>

(2)验证邮箱

<Form.Item label=“邮箱地址”>

{getFieldDecorator(‘email’, {

initialValue: (editData && editData.email) || ‘’,

rules: [

{

pattern: /1+@[a-zA-Z0-9-]+(.[a-zA-Z0-9-]+)*.[a-zA-Z0-9]{2,6}$/,

// pattern: /2+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$/,

// pattern: /3+([-_.][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: ‘邮箱地址不能为空’ }

]

})()}

</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 } = form

const { query } = getLocation()

const init = useCallback(() => {

dispatch(‘container/init’)

}, [dispatch])

useEffect(() => {

init()

}, [dispatch, init])

const onSave = useCallback(() => {

const { validateFields } = form

validateFields((err: any, fieldValue: any) => {

if (err) return

let 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’}>

<Card

className={styles.table}

style={{ marginTop: 1, marginLeft: 1 }}

bordered={false}

bodyStyle={{ padding: ‘8px 32px 32px 32px’ }}

//labelAlign=“left”

layout=“horizontal”

className={styles.commonForm}

labelCol={{ span: 3 }}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

前端CSS面试题文档,JavaScript面试题文档,Vue面试题文档,大厂面试题文档,需要的读者可以戳这里获取!

[外链图片转存中…(img-Ee3JOwqT-1712557094304)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

[外链图片转存中…(img-hY4tZzmt-1712557094304)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

前端CSS面试题文档,JavaScript面试题文档,Vue面试题文档,大厂面试题文档,需要的读者可以戳这里获取!

[外链图片转存中…(img-WHGU0EuU-1712557094305)]

[外链图片转存中…(img-iBD0O690-1712557094305)]


  1. a-zA-Z0-9_.- ↩︎

  2. A-Za-z0-9\u4e00-\u9fa5 ↩︎

  3. A-Za-z\d ↩︎

  • 22
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用,在安装@ant-design/react-native时,不再需要手动链接(@ant-design/icons-react-native),而是可以使用自动链接功能。只需要使用命令`npm install @ant-design/icons-react-native --save-dev`来安装@ant-design/icons-react-native即可。此外,可以在`node_modules/@ant-design`文件夹下找到安装的文件。 根据引用,可以使用命令`react-native -v`来检查是否成功安装了react-native。 根据引用,示例代码展示了如何全局使用ant-design-mobile组件。官方文档中的示例是按需引入的,如果要全局使用,需要手动引入相应的组件文件。示例代码中引入了Button和InputItem组件,并在App组件中使用了这些组件。 所以,ant-design-mobile是一个基于React Native的UI组件库,可以通过自动链接或手动引入组件文件的方式来使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [react native 0.70版本使用ant-design-mobile-rn及icons字体图标库](https://blog.csdn.net/weixin_43233914/article/details/126849915)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [react native 使用ant-design-mobile-rn的icon字体库](https://blog.csdn.net/weixin_43233914/article/details/119450451)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值