React + TypeScript 搭建多Tab页脚手架

栏目: 服务器 · 发布时间: 4年前

内容简介:React + Typescript 开发的后端多页脚手架关于这个脚手架项目:由于代码比较简单,注释全面,同时使用了 TypeScript,新手拿来上手和参考,也是不错的。

React + Typescript 开发的后端多页脚手架

React + TypeScript 搭建多Tab页脚手架

前言

关于这个脚手架项目:

  1. 为了公司多个产品模块能够统一,这样维护起来比较轻松
  2. 公司产品的上一个版本用 layui 开发,有 Tab 多页(所以...)
  3. 为了和市面上大众UI区分开(虽然可以用 Antd,然后覆盖样式,个人不喜欢),内置了需要的组件和部分特色功能
  4. 内置皮肤(与内置组件结合),继承原来产品的意志
  5. 顺便整理一下,拿出来骗星, 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 ,里面的注释可以帮你解惑


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

互联网+ 战略版

互联网+ 战略版

刘润 / 中国华侨出版社 / 2015-5-1 / 49.8

1、“互联网+”上升为国家战略,“互联网+”成为下一个超级畅销书的热点话题在商业环境巨变的今天,传统企业该怎么走?传统企业转型是一个系统工程,如何定战略、抓主要矛盾? 2、首本“互联网+传统企业”的战略指导书。“我互联网+”时代到来了,传统企业的外部环境发生了哪些变化?了解商业新生代的新商业环境,跟之前工业时代的不同,从战略上指导传统企业转型,更安全也更大局把握游刃有余。一起来看看 《互联网+ 战略版》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具