antd pro学习入门笔记+todolist实例

  • 记一下常用的目录和文件

  • 使用区块模板

  • 权限管理

  • 数据请求

  • 手动新建页面

  • umi中mock怎么用?配合service文件

  • 数据请求后放到状态管理model

  • 页面内数据管理

  • 加个搜索功能

  • 登陆验证的修改

  • todolist实战

    • 最后的代码结构,具体

糟心的初始化

安装初始化环境让我很头疼,弄了一下午

首先yarn creat umi这个写法是add到global环境之后再执行create-umi

但是由于我yarn的缓存位置没有使用默认位置,这里就疯狂报错,网上的环境配置和更改.cmd并没有起到帮助

之后通过cnpm create umi终于解决了,但是cnpm i一直在报错,然后我把依赖删掉重新用了官网推荐的tyarn

依赖包下了好久,然后第一次启动项目很慢很慢,不过一个下午终于还是启动了

记一下常用的目录和文件

/config/config.ts:配置路由和菜单

/mock/:要学习的模拟数据接口

/public/:静态资源目录

/src/assets/:前端引入资源目录

/src/components/:常用公共组件

/src/layouts/:常用布局

/src/locals/:国际化文件夹

/src/models/:数据模型

/src/pages/:页面和区块组件

/src/services/:接口函数获取数据

/src/utils/:工具文件夹:authorize(权限)、request(请求)、utils(工具函数)

/global.tsx:全局函数

使用区块模板

很简单的用右下角的浮窗启动资产页面

image-20200720171131996

新加入页面之后由于路由config更新不及时的问题,需要断掉重新打开一次项目,才能加入区块组件到新页面

权限管理

打开Authorized.ts

看见getAuthority函数找到authority.ts有两个一个set一个get

设置权限主要是在model/login.ts中用到

具体细节还没看懂,但是肯定是根据接口拿到的数据来更新权限的

数据请求

首先是能看到mock是我们自己的模拟数据比如mock/user.ts

在页面附近的service.ts中可以看见自定义的调用接口的函数他们调用了mock或者_mock文件的数据

比如个人中心页面service.ts中定义的queryCurrent函数是用来请求根目录下mock/user.ts中的

'GET /api/currentUser'接口,queryCurrent函数被个人中心页面下的model.ts即模型引用了,最后是index.tsx中使用了connect连接了数据并用了Modalstate接口,整个页面的数据流反向入下面截图

image-20200720175726954

image-20200720175536025

image-20200720175604143

image-20200720175622018

然后因为使用了connect所以数据以及dispatch方法都会在组件的this.props中

model.ts中effect是我们获取数据的方式其中的yied类型函数中的put相当于调用了reducers方法

这种方式形如redux的dispatch,type对应reducers对象中的属性名

关于connect中的参数其中一个是获取数据的请求另一个loading不知道来源是哪里

然后百度一下看见了一个可能比较容易理解的解释

https://blog.csdn.net/sinat_36146776/article/details/106519540

image-20200720182738548

image-20200720182820353

loading.effects[‘accountAndcenter/fetchCurrent’]表示当调用完毕该effects方法之后由true变为false

好像是dva的东西集成在umi中的一个用法orz

至于connnect中的参数定义在了model文件夹中的connect.d.ts中,会给出loading和其他连接参数的接口定义

手动新建页面

1.不通过umi的导入而是自己编写页面和环境

2.在pages下新建一个自定义的mall文件夹,下面新建index.js

image-20200720184349398

3.config.ts中配置路由

image-20200720185227658

4.更新页面之后就能看到了

image-20200720185303220

umi中mock怎么用?配合service文件

用json模拟然后mock产生数据接口,前端模拟请求

数据来源:https://pvp.qq.com/web201605/js/herolist.json

image-20200720191313291

mock定义的接口可以直接调用不需要请求头http://localhost:8000/api/herolist

image-20200720191328544

image-20200720191345685

的确拿到了数据列表

import herolist from ‘…/…/herolist’

import {Request,Response} from ‘express’

export default{

//可以用GET和POST,可以返回对象或者生成对象的函数

‘GET /api/herolist’:[

…herolist

],

‘GET /api/heros’: function(req:Request,res:Response){

//可以延迟

setTimeout(()=>{

res.json({herolist,state:“ok”})

},3000)

}

}

export default () => {

fetch(‘/api/herolist’).then(res=>{

//console.log(res)

return res.json()

}).then(res=>{

console.log(res)

})

fetch(‘/api/heros’).then(res=>{

//console.log(res)

return res.json()

}).then(res=>{

console.log(res)

})

return (

<>

mall新页面

</>

);

};

image-20200720193157756

现在目前为止都是测试mock,但是项目中真正应用接口应该配置service中的异步函数(然后在model中调用)

image-20200720194337190

把index.js改成index.tsx,重新启动项目

import React from ‘react’;

import {getHeroList}from ‘…/…/services/heros’

export default () => {

// fetch(‘/api/herolist’).then(res=>{

// //console.log(res)

// return res.json()

// }).then(res=>{

// console.log(res)

// })

// fetch(‘/api/heros’).then(res=>{

// //console.log(res)

// return res.json()

// }).then(res=>{

// console.log(res)

// })

getHeroList().then((res)=>{

console.log(res)

})

return (

<>

mall新页面

</>

);

};

image-20200720194734954

数据请求后放到状态管理model

全局数据放到全局model,单页面数据放到页面文件夹model(方便识别管理)

这里在model文件夹下面新建mall.ts

import {Effect,Reducer} from ‘umi’

import{getHeroList}from ‘…/services/heros’

const HerosModel:any={

//命名空间

namespace:‘heros’,

//状态

state:{

herolist:[],

},

effects:{

*fetchHeroList(_,{call,put}){

const res= yield call(getHeroList)

//console.log(res)

yield put({

type:‘saveHerolist’,

payload:res

})

}

},

reducers:{

saveHerolist(state:any,action:any){

return{

…state,

herolist:action.payload

}

}

}

}

export default HerosModel

然后修改mall/index.tsx

import React, { useEffect } from ‘react’;

import { getHeroList } from ‘…/…/services/heros’

import { connect, Dispatch } from ‘umi’

const HeroMall = (props: any) => {

console.log(props)

useEffect(() => {

let { dispatch } = props

dispatch({

type: ‘heros/fetchHeroList’,

})

}, [])

// fetch(‘/api/herolist’).then(res=>{

// //console.log(res)

// return res.json()

// }).then(res=>{

// console.log(res)

// })

// fetch(‘/api/heros’).then(res=>{

// //console.log(res)

// return res.json()

// }).then(res=>{

// console.log(res)

// })

// getHeroList().then((res)=>{

// console.log(res)

// })

return (

<>

mall新页面

</>

);

}

export default connect(({ heros }: any) => ({ heros }))(HeroMall)

image-20200720201026053

这里注意规范的import和export

另外connect的两个括号第一个放(返回值为(对象)的函数)形如({ heros }: any) => ({ heros }),不然取不到state,第二个放组件

import React, { useEffect } from ‘react’;

// import { getHeroList } from ‘…/…/services/heros’

import { connect, Dispatch } from ‘umi’

const HeroMall = (props: any) => {

console.log(props)

useEffect(() => {

let { dispatch } = props

dispatch({

type: ‘heros/fetchHeroList’,

})

}, [])

// fetch(‘/api/herolist’).then(res=>{

// //console.log(res)

// return res.json()

// }).then(res=>{

// console.log(res)

// })

// fetch(‘/api/heros’).then(res=>{

// //console.log(res)

// return res.json()

// }).then(res=>{

// console.log(res)

// })

// getHeroList().then((res)=>{

// console.log(res)

// })

let { heros } = props

let herolist = heros && heros.herolist && heros.herolist.herolist

console.log(herolist)

return (

<>

mall--王者荣耀英雄

    {herolist&&herolist.map((item:any,index:number)=>{

    return(

    • {item.cname}{'->'}{item.title}
    • )

      })}

      </>

      );

      }

      export default connect(({ heros }: any) => ({ heros }))(HeroMall)

      image-20200720202204227

      之后引入个Table做好看一点

      import React, { useEffect } from ‘react’;

      // import { getHeroList } from ‘…/…/services/heros’

      import { connect, Dispatch } from ‘umi’

      import { Table, Tag } from ‘antd’;

      const HeroMall = (props: any) => {

      console.log(props)

      useEffect(() => {

      let { dispatch } = props

      dispatch({

      type: ‘heros/fetchHeroList’,

      })//触发model中的effect,带上命名空间

      }, [])

      // fetch(‘/api/herolist’).then(res=>{

      // //console.log(res)

      // return res.json()

      // }).then(res=>{

      // console.log(res)

      // })

      // fetch(‘/api/heros’).then(res=>{

      // //console.log(res)

      // return res.json()

      // }).then(res=>{

      // console.log(res)

      // })

      // getHeroList().then((res)=>{

      // console.log(res)

      // })

      let { heros } = props

      let herolist = heros && heros.herolist && heros.herolist.herolist

      console.log(herolist)

      // ename: 105

      // cname: “廉颇”

      // title: “正义爆轰”

      // new_type: 0

      // hero_type: 3

      // skin_name: “正义爆轰|地狱岩魂”

      const columns = [

      {

      title: ‘Id’,

      dataIndex: ‘ename’,

      key: ‘ename’,

      render: text => {text},

      },

      {

      title: ‘英雄’,

      dataIndex: ‘cname’,

      key: ‘cname’,

      },

      {

      title: ‘皮肤’,

      dataIndex: ‘title’,

      key: ‘title’,

      },

      {

      title: ‘Tags’,

      key: ‘skin_name’,

      dataIndex: ‘skin_name’,

      render: (tags:string) => (

      <>

      {tags&&tags.split(‘|’).map(tag => {

      let color = tag.length > 3 ? ‘geekblue’ : ‘green’;

      return (

      {tag}

      );

      })}

      </>

      ),

      },

      ];

      return (

      <>

      mall--王者荣耀英雄

      {/*

        {herolist && herolist.map((item: any, index: number) => {

        return (

      • {item.cname}{'->'}{item.title}
      • )

        })}

        */}

        </>

        );

        }

        export default connect(({ heros }: any) => ({ heros }))(HeroMall)

        image-20200720203930281

        页面内数据管理

        在页面文件夹下面使用_mock.ts、model.ts、services.ts就可以了 建立方法和全局一样,路径要自己配置

        image-20200720214237360

        image-20200720214251183

        import React, { useEffect } from ‘react’; // import { getHeroList } from ‘…/…/services/heros’

        import { connect, Dispatch } from ‘umi’;

        import { Table, Tag } from ‘antd’;

        import HeroTableSearch from ‘./HeroTableSearch’;

        const HeroMall = (props: any) => {

        console.log(props);

        useEffect(() => {

        let { dispatch } = props;

        dispatch({

        type: ‘mall/fetchHeroList’,

        }); //触发model中的effect,带上命名空间

        }, []); // fetch(‘/api/herolist’).then(res=>{

        // //console.log(res)

        // return res.json()

        // }).then(res=>{

        // console.log(res)

        // })

        // fetch(‘/api/heros’).then(res=>{

        // //console.log(res)

        // return res.json()

        // }).then(res=>{

        // console.log(res)

        // })

        // getHeroList().then((res)=>{

        // console.log(res)

        // })

        let { mall } = props;

        let herolist = mall && mall.herolist && mall.herolist.herolist;

        console.log(herolist); // ename: 105

        // cname: “廉颇”

        // title: “正义爆轰”

        // new_type: 0

        // hero_type: 3

        // skin_name: “正义爆轰|地狱岩魂”

        const columns = [

        {

        title: ‘Id’,

        dataIndex: ‘ename’,

        key: ‘ename’,

        render: text => {text},

        },

        {

        title: ‘英雄’,

        dataIndex: ‘cname’,

        key: ‘cname’,

        },

        {

        title: ‘皮肤’,

        dataIndex: ‘title’,

        key: ‘title’,

        },

        {

        title: ‘Tags’,

        key: ‘skin_name’,

        dataIndex: ‘skin_name’,

        render: (tags: string) => (

        <>

        {tags &&

        tags.split(‘|’).map(tag => {

        let color = tag.length > 3 ? ‘geekblue’ : ‘green’;

        return (

        {tag}

        );

        })}

        </>

        ),

        },

        ];

        return (

        <>

        mall--王者荣耀英雄

        {/*

          {herolist && herolist.map((item: any, index: number) => {

          return (

        • {item.cname}{'->'}{item.title}
        • )

          })}

          */}

          </>

          );

          };

          export default connect(({ mall }: any) => ({

          mall,

          }))(HeroMall);

          顺便修改connect

          加个搜索功能

          用umi的控制加个高级搜索

          image-20200720220852105

          表单组件代码修改

          import styles from “./index.less”;

          import React, { useState } from “react”;

          import { Form, Row, Col, Input, Button } from “antd”;

          import { DownOutlined, UpOutlined } from “@ant-design/icons”;

          const AdvancedSearchForm = () => {

          const [form] = Form.useForm();

          const getFields = () => {

          const children = [];

          children.push(

          (

          <Form.Item

          name=“hero”

          label=‘英雄’

          rules={[{

          required:true,

          message:‘Input something!’

          }

          ]}

          </Form.Item>

          )

          )

          children.push(

          (

          <Form.Item

          name=“skin”

          label=‘皮肤’

          rules={[{

          required:true,

          message:‘Input something!’

          }

          ]}

          </Form.Item>

          )

          )

          return children;

          };

          const onFinish = (values:any) => {

          console.log("Received values of form: ", values);

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

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

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

          img

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

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

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

          最后

          本人分享一下这次字节跳动、美团、头条等大厂的面试真题涉及到的知识点,以及我个人的学习方法、学习路线等,当然也整理了一些学习文档资料出来是附赠给大家的。知识点涉及比较全面,包括但不限于前端基础,HTML,CSS,JavaScript,Vue,ES6,HTTP,浏览器,算法等等

          详细大厂面试题答案、学习笔记、学习视频等资料领取,点击资料领取直通车

          前端视频资料:
          dren.push(

          (

          <Form.Item

          name=“skin”

          label=‘皮肤’

          rules={[{

          required:true,

          message:‘Input something!’

          }

          ]}

          </Form.Item>

          )

          )

          return children;

          };

          const onFinish = (values:any) => {

          console.log("Received values of form: ", values);

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

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

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

          [外链图片转存中…(img-ugKmlNT4-1712866115059)]

          [外链图片转存中…(img-SqQGOGuL-1712866115060)]

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

          [外链图片转存中…(img-D12PB7QO-1712866115060)]

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

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

          最后

          本人分享一下这次字节跳动、美团、头条等大厂的面试真题涉及到的知识点,以及我个人的学习方法、学习路线等,当然也整理了一些学习文档资料出来是附赠给大家的。知识点涉及比较全面,包括但不限于前端基础,HTML,CSS,JavaScript,Vue,ES6,HTTP,浏览器,算法等等

          详细大厂面试题答案、学习笔记、学习视频等资料领取,点击资料领取直通车

          [外链图片转存中…(img-H3BB0ktX-1712866115060)]

          前端视频资料:

        评论
        添加红包

        请填写红包祝福语或标题

        红包个数最小为10个

        红包金额最低5元

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

        抵扣说明:

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

        余额充值