学习用TypeScript写React组件

前端之家收集整理的这篇文章主要介绍了学习用TypeScript写React组件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

为了折腾, 简单的学习了下TypeScript,感觉确实不错。 也为了不断学习, 避免落伍, 所以就折腾不断。

前段时间用ES6,antd+dva写了一些demo,发现antd使用TypeScript实现的,而且angular2也采用了TypeScript。 既然这么多项目都提前使用了TypeScript,而我又是React的粉, 那么还是先研究下TypeScript实现React组件。

鉴于刚开始, 还是站在别人的肩膀上开始吧。

工具选择

本人对webpack配置略知一二,但暂时还不想太深入到工程方面的研究,所以,工具选择开源的,有阿里使用的atool-build,roadhog. 尝试多次, 鉴于之前的项目都是用的roadhog,而且也看了roadhog git上面已经说支持TypeScript,所以最终选择了roadhog,因为它配置确实简单、省心。

不过要使用roadhog的0.6.0-beta2版本(因为之前的版本不支持TypeScript):

  1. npm install roadhog@0.6.0-beta2 --save-dev

配置文件:

  1. //.roadhogrc
  2. {
  3. "entry": "src/index.js","publicPath": "/dist/","outputPath": "./dist","env": {
  4. "development": {
  5. "extraBabelPlugins": [
  6. "dva-hmr","transform-runtime"
  7. ]
  8. },"production": {
  9. "extraBabelPlugins": [
  10. "transform-runtime",["import",{ "libraryName": "antd","style": "css" }] // 加入这一条,import antd的样式的时候才不会被md5
  11. ]
  12. }
  13. }
  14. }

项目结构

  1. +------- src
  2. +----- components
  3. +----- models
  4. +----- routes
  5. +------- .roadhog
  6. +------- node_modules
  7. +------- package.json
  8. +------- ...

项目结构基本和antd-admin的结构保持一致。

入口文件

  1. // index.js
  2. import './index.html'
  3. import 'babel-polyfill'
  4. import dva,{ connect } from 'dva'
  5. import createLoading from 'dva-loading'
  6. import { browserHistory,Router,Route } from 'dva/router'
  7.  
  8. /**
  9. * @desc 以下是解决域名下面子目录部署问题
  10. * 域名项目下面一般会有多个子项目,那么部署的时候,子目录的作用就至关重要了。
  11. * 不借助basename不太容易实现。
  12. */
  13. import { useRouterHistory } from 'dva/router'
  14. import createBrowserHistory from 'history/lib/createBrowserHistory'
  15.  
  16. const history = useRouterHistory(createBrowserHistory)({basename: '/mda'})
  17.  
  18. // 1. Initialize
  19. const app = dva({
  20. ...createLoading(),// history: browserHistory,history,onError (error) {
  21. console.error('app onError -- ',error)
  22. },})
  23.  
  24. // 2. Model
  25. app.model(require('./models/app'))
  26.  
  27.  
  28. // 3. Router
  29. app.router(require('./router'))
  30.  
  31. // 4. Start
  32. app.start('#root')

应用模块(src/routes/app.js)

  1. import React from 'react'
  2. import PropTypes from 'prop-types'
  3. import { connect } from 'dva'
  4.  
  5.  
  6. import {
  7. Icon,Row,Col,Button,Modal,} from '../components'
  8. import 'antd/dist/antd.css'
  9. import styles from './app.less'
  10.  
  11. function App ({ children,location,dispatch,app,loading }) {
  12. const {
  13. isVisible,} = app
  14.  
  15. const showModal = () => {
  16. dispatch({
  17. type: 'app/showModal',})
  18. }
  19.  
  20. const handleOk = () => {
  21. }
  22.  
  23. const handleCancel = () => {
  24. dispatch({
  25. type: 'app/hideModal',})
  26. }
  27. return (
  28. <div className={styles.normal}>
  29. <Row>This is a row</Row>
  30. <Row>
  31. <Col span={12}>这是一个Col</Col>
  32. <Col span={12}>这是一个Col</Col>
  33. </Row>
  34. <Button type="primary" onClick={showModal}><Icon type="link" />弹窗</Button>
  35. <Modal title="弹窗标题" visible={isVisible} onOk={handleOk} onCancel={handleCancel}>
  36. <div>Hello</div>
  37. </Modal>
  38. </div>
  39. )
  40. }
  41.  
  42. App.propTypes = {
  43. children: PropTypes.element.isrequired,location: PropTypes.object,dispatch: PropTypes.func,app: PropTypes.object,loading: PropTypes.bool,}
  44.  
  45. export default connect(({ app,loading }) => ({ app,loading: loading.models.app }))(App)

组件

组件位于src/components,开始学习的时候,可以直接从ant-design源代码的components中拷贝代码过来, 对于简单的组件Button,Grid,Icon,可以拷贝过来, 然后直接跑起来, 不过注意安装必要的包。

基本依赖包

  1. {
  2. "@types/react": "^15.0.22","@types/react-dom": "^0.14.23","antd": "^2.9.1","classnames": "^2.2.5","dva": "^1.2.1","dva-loading": "^0.2.1","object-assign": "^4.1.1","omit.js": "^0.1.0","prop-types": "^15.5.8","rc-animate": "^2.3.6","rc-dialog": "^6.5.8","rc-util": "^4.0.2","react": "^15.5.4","react-dom": "^15.5.4"
  3. }

总结

工具、项目搭建起来, 下面可以舒心的学习TypeScript开发React组件了。 鉴于本人也是学习, 还有太多需要努力的。 希望有志同学一起学习探讨。

下面列举出一些坑:

  • roadhog貌似和dva关联起来了, 没有仔细研究,不做路由配置, 程序跑不起来,姑且先配置下简单的路由,让应用跑起来吧。

  • 需要安装@types/react,@types/react-dom,虽然暂时还不太明白具体原理。

  • 需要在根目录配置tsconfig.json,否则跑不起来

  • typings目录暂时没有用到,待学习

  • 在迁移modal模块时, 老是报错, 最后解决方案在解决modal onClose赋值报错的问题

以下是相关命令

  • 开发: npm run server

  • 构建: npm run build

代码

猜你在找的React相关文章