内容简介:React + Typescript 开发的后端多页脚手架关于这个脚手架项目:由于代码比较简单,注释全面,同时使用了 TypeScript,新手拿来上手和参考,也是不错的。
React + Typescript 开发的后端多页脚手架
前言
关于这个脚手架项目:
- 为了公司多个产品模块能够统一,这样维护起来比较轻松
- 公司产品的上一个版本用 layui 开发,有 Tab 多页(所以...)
- 为了和市面上大众UI区分开(虽然可以用 Antd,然后覆盖样式,个人不喜欢),内置了需要的组件和部分特色功能
- 内置皮肤(与内置组件结合),继承原来产品的意志
- 顺便整理一下,拿出来骗星, GitHub地址
由于代码比较简单,注释全面,同时使用了 TypeScript,新手拿来上手和参考,也是不错的。
如果发现不妥之处,麻烦道友 issues 指出。
如何使用?
git clone https://github.com/Itroads/react-admin-ts-starter.git
cd react-admin-ts-starter
yarn
yarn start
有哪些特别之处?
- 多 Tab 页,灵活切换
- 内置部分组件(其中 Modal 组件,可拖动,范围可设定)
- 内置皮肤,也可以自定义
- 可支持,左中右结构,就像 win 上的很多应用那样,当然这是可选项
内置组件说明
Modal
Params 参数说明
| 参数名称 | 类型 | 说明 | 是否必须 |
|---|---|---|---|
Component |
Component |
弹窗显示的组件内容 | 必须 |
options |
Object |
width?:string, height?:string, imgSrc:any, title:string | 必须 |
ParentFn |
Function |
父组件传入的方法,如:点击确定,所触发的方法 | 必须 |
dataToChildren |
Any |
父组件传递给子组件的值 | 必须 |
localDialog |
Object |
ref:React.RefObject, tabId:string, addFn:Fn, delFn:Fn。不传则为全局弹窗 | 可选 |
import React, { Component } from 'react'
import createModal from '../../components/modal'
import CreatNewRole from './creatNewRole'
class Demo extends Component {
constructor(props: any) {
super(props)
this.container = React.createRef();
}
public container: React.RefObject<HTMLDivElement>;
showNewModal () {
createModal(CreatNewRole,{
width: '650px',
height: '360px',
imgSrc: require('../../assets/logo.png'),
title: '添加角色'
},this.creatRole, '',{
ref: this.container,
tabId: this.props.activeTabId, // 来自 store
addFn: this.props.addDialogData, // 来自 store
delFn: this.props.deleteDialogData // 来自 store
})
}
render() {
return (
<div ref={this.container}>
...
</div>
)
}
}
复制代码
注意:包裹弹出组件的父节点,要设置 position: relative; ,因为遮罩层采用绝对定位。所以,遮罩范围,取决于设置了相对位置的父节点。
弹窗内部的组件,可通过调用 this.props.close() 来关闭弹窗
Alert
Params
一共包含四个子组件: createConfirm createInfo createWarning createError
和一个供外部调用的关闭方法 clearAlert ,直接调用即可 clearAlert()
| 属性名称 | 类型 | 说明 | 是否必须 | 范围 |
|---|---|---|---|---|
msg |
String |
弹窗的文字描述信息 | 必须 | 通用 |
cb |
Function |
Confirm 弹窗,点击确定的回调方法 |
必须 | Confirm |
import React, { Component } from 'react'
import { createConfirm, createInfo, createWarning, createError, clearAllAlert } from '@components/alert/alert'
class Demo extends Component {
/**
* confirm 点击确认按钮的回调
* @param {any} params
*/
confirmCallBack (params) {
console.log('test', params)
clearAllAlert()
}
showNewConfirm () {
createConfirm('确定要删除xxx ?', this.confirmCallBack.bind(this, 123))
}
showNewInfo () {
createInfo('确定要删除xxx ?')
}
showNewWarning () {
createWarning('警告信息')
}
showNewError () {
createError('错误信息')
}
render() {
return (
...
)
}
}
复制代码
Toast
Params
| 属性名称 | 类型 | 说明 | 是否必须 |
|---|---|---|---|
text |
String |
弹窗的文字描述信息 | 必须 |
time |
Number |
Toast 弹窗,指定时间后消失,默认1500毫秒 |
可选 |
Demo
import React, { Component } from 'react'
import Modal from '@components/modal/modal'
class Demo extends Component {
showToast () {
createToast('账号或密码错误账号或密码错误', 2000)
}
render() {
return (
...
)
}
}
复制代码
Menu
Params
| 属性名称 | 类型 | 说明 | 是否必须 |
|---|---|---|---|
data |
Array |
菜单数据 | 必须 |
activeTabId |
String |
当前页面的ID,来自 Store | 可选 |
openOrToggleTabBox |
Function |
左侧菜单导航,处理 tabBox 方法,来自 store | 可选 |
operateCallBack |
Function |
右侧操作菜单回调函数 | 可选 |
tabModalCount |
Number |
当前 tab 页的弹窗数量 | 可选 |
Demo
左侧菜单
import * as React from 'react'
import { connect } from 'react-redux'
import { addTabBox, setDefaultTab } from '../../reducers/tabBoxReducer'
class Demo extends Component {
render() {
return (
<Menu
data={this.state.data}
activeTabId={this.props.activeTabId} openOrToggleTabBox={this.props.addTabBox}
/>
)
}
}
const mapStateToProps = (state: any) => ({
activeTabId: state.tabBoxState.activeTabId
})
const mapDispatchToProps = (dispatch: any) => ({
addTabBox: (tabItem: ITabItem) => dispatch(addTabBox(tabItem)),
setDefaultTab: (tabItem: ITabItem) => dispatch(setDefaultTab(tabItem))
})
export default connect(mapStateToProps, mapDispatchToProps)(Demo)
复制代码
右侧菜单
import * as React from 'react'
import { connect } from 'react-redux'
import { addDialogData, deleteDialogData } from '../../../../reducers/modalReducer'
class Demo extends Component {
render() {
return (
<Menu
data={this.state.rightMenuData}
operateCallBack={(value: string) => this.menuOperate(value)} tabModalCount={this.props.modalState ? this.props.modalState[this.props.activeTabId] : null}
/>
)
}
}
const mapStateToProps = (state: any) => ({
activeTabId: state.adminTabBoxState.activeTabId,
modalState: state.modalState
})
const mapDispatchToProps = (dispatch: any) => ({
addDialogData: (key: string) => dispatch(addDialogData(key)),
deleteDialogData: (key: string) => dispatch(deleteDialogData(key))
})
export default connect(mapStateToProps, mapDispatchToProps)(Demo)
复制代码
你可能存在的疑惑?
皮肤太丑?
打开 /src/utils
-utils -skin-files -darkBlack.ts // 输出皮肤样式的对象 -darkBlue.ts ... -skin.ts // 输出全局的,皮肤样式 复制代码
发挥你的设计灵感吧!
哪里控制 Tab 页面?
打开 /src/pages/home/pageBox.tsx 我想,里面的注释,应该足够解释了
如何实现的多Tab页?
核心就是 redux 状态管理,尽在 /src/reducers ,里面的注释可以帮你解惑
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- React脚手架搭建
- 搭建webpack简易脚手架
- 搭建一个 nodejs 脚手架
- 搭建一个Koa后端项目脚手架
- 利用webpack搭建脚手架一套完整流程
- 【手把手撸一个脚手架】第二步, 搭建开发环境
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Rationality for Mortals
Gerd Gigerenzer / Oxford University Press, USA / 2008-05-02 / USD 65.00
Gerd Gigerenzer's influential work examines the rationality of individuals not from the perspective of logic or probability, but from the point of view of adaptation to the real world of human behavio......一起来看看 《Rationality for Mortals》 这本书的介绍吧!