为了折腾, 简单的学习了下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):

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

配置文件:

//.roadhogrc
{"entry": "src/index.js","publicPath": "/dist/","outputPath": "./dist","env": {"development": {"extraBabelPlugins": ["dva-hmr","transform-runtime"]},"production": {"extraBabelPlugins": ["transform-runtime",["import", { "libraryName": "antd", "style": "css" }] // 加入这一条,import antd的样式的时候才不会被md5]}}
}

项目结构

+------- src+----- components+----- models+----- routes
+------- .roadhog
+------- node_modules
+------- package.json
+------- ...

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

入口文件

// index.js
import './index.html'
import 'babel-polyfill'
import dva, { connect } from 'dva'
import createLoading from 'dva-loading'
import { browserHistory, Router, Route } from 'dva/router'/*** @desc 以下是解决域名下面子目录部署问题* 域名项目下面一般会有多个子项目,那么部署的时候,子目录的作用就至关重要了。* 不借助basename不太容易实现。*/
import { useRouterHistory } from 'dva/router'
import createBrowserHistory from 'history/lib/createBrowserHistory'const history = useRouterHistory(createBrowserHistory)({basename: '/mda'})// 1. Initialize
const app = dva({...createLoading(),
//  history: browserHistory,history,onError (error) {console.error('app onError -- ', error)},
})// 2. Model
app.model(require('./models/app'))// 3. Router
app.router(require('./router'))// 4. Start
app.start('#root')

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

import React from 'react'
import PropTypes from 'prop-types'
import { connect } from 'dva'import {Icon,Row,Col,Button,Modal,
} from '../components'
import 'antd/dist/antd.css'
import styles from './app.less'function App ({ children, location, dispatch, app, loading }) {const {isVisible,} = appconst showModal = () => {dispatch({type: 'app/showModal',})}const handleOk = () => {}const handleCancel = () => {dispatch({type: 'app/hideModal',})}return (<div className={styles.normal}><Row>This is a row</Row><Row><Col span={12}>这是一个Col</Col><Col span={12}>这是一个Col</Col></Row><Button type="primary" onClick={showModal}><Icon type="link" />弹窗</Button><Modal title="弹窗标题" visible={isVisible} onOk={handleOk} onCancel={handleCancel}><div>Hello</div></Modal></div>)
}App.propTypes = {children: PropTypes.element.isRequired,location: PropTypes.object,dispatch: PropTypes.func,app: PropTypes.object,loading: PropTypes.bool,
}export default connect(({ app, loading }) => ({ app, loading: loading.models.app }))(App)

组件

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

基本依赖包

{"@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"
}

总结

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

下面列举出一些坑:

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

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

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

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

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

以下是相关命令

  • 开发: npm run server

  • 构建: npm run build

源代码

  • https://github.com/walkerqiao...

学习用TypeScript写React组件相关推荐

  1. thonny python ide_学习用 Thonny 写代码:一个面向初学者的Python IDE

    原标题:学习用 Thonny 写代码:一个面向初学者的Python IDE 编译自: https://fedoramagazine.org/learn-code-thonny-python-ide-b ...

  2. [react] 可以使用TypeScript写React应用吗?怎么操作?

    [react] 可以使用TypeScript写React应用吗?怎么操作? 使用ts启动新的 create react app项目 yarn create react-app my-app --typ ...

  3. 用 TypeScript 写 React Redux - 完全指南

    "这个指南是一个最新的摘要,记录了关于如何用TypeScript 以函数式风格使用React(以及相关生态)最重要的模式和示例.它会使你的代码在从具体实现中进行类型推导时绝对是类型安全的,这 ...

  4. python后端需要什么基础_一个六年经验的python后端是怎么学习用java写API的(6) 基本的Auth...

    描述 实现了依赖注入之后就可以方便的实现各种API的业务逻辑了,下一部的问题就在于权限,我们知道大部分的系统API并不是开放的,需要基本的用户体系(注册.登录.购买.会员.不同的role等等),例如管 ...

  5. python中接口测试垃圾数据如何清理_一个六年经验的python后端是怎么学习用java写API的(2)Extracter,微信文章抓取清洗入库...

    描述 pirate 是由我的 django 脚手架 original 实现的,文件上传提供了七牛和腾讯云两个 backend,部署提供了默认的配置文件,因此只要关注具体的微信的抓取逻辑即可. 核心表讲 ...

  6. C++程序员学习用C#写网站(四)

     第7天 功能:登录 数据库查询成功了,User对象创建了,可以页面跳转到Default.aspx啦,可是怎么写呢.百度,发现很多实现都是用户登录前访问某一页面,把该页面做参数传给登录页面,登录完 ...

  7. python怎么输入程序代码_学习用 Thonny 写代码: 一个面向初学者的Python IDE

    学习编程很难.即使当你最终怎么正确使用你的冒号和括号,但仍然有很大的可能你的程序不会如果所想的工作. 通常,这意味着你忽略了某些东西或者误解了语言结构,你需要在代码中找到你的期望与现实存在分歧的地方. ...

  8. thonny和python有什么关系_学习用 Thonny 写代码: 一个面向初学者的Python IDE

    学习编程很难.即使当你最终怎么正确使用你的冒号和括号,但仍然有很大的可能你的程序不会如果所想的工作. 通常,这意味着你忽略了某些东西或者误解了语言结构,你需要在代码中找到你的期望与现实存在分歧的地方. ...

  9. 使用 store 来优化 React 组件

    在使用 React 编写组件的时候,我们常常会碰到两个不同的组件之间需要共享状态情况,而通常的做法就是提升状态到父组件.但是这样做会有一个问题,就是尽管只有两个组件需要这个状态,但是因为把状态提到了父 ...

最新文章

  1. PAT甲级1153 Decode Registration Card of PAT :[C++题解]结构体、哈希表、排序、类似数据库查询题、好题
  2. IDM——服务器响应显示您没有权限下载此文件(百度网盘下载问题)
  3. rhel5.8安装oracle10g,RHEL 5.8 安装Oracle 10g r2 clusterware 报错
  4. 两个矩阵相加 Exercise08_05
  5. DocBook vs Apache Forrest
  6. 金蝶kis云,调用增删改查注意点
  7. 845. 数组中的最长山脉
  8. 基于各国贷款数据的可视化分析(含python代码)
  9. MATLAB求解线性规划(含整数规划和0-1规划)问题
  10. Spring 中常用注解原理剖析
  11. HikariCP配置手册
  12. 虚拟机IP地址和主机名称配置
  13. Java读取星历excel数据并计算卫星坐标
  14. 寒假2019培训:白银莲花池-usaco2007(洛谷P2411)
  15. 利用U盘安装win2008r2系统的步骤
  16. 小爱同学指令大全_小爱同学指令
  17. Web(牛腩)概念知识总结
  18. 计算机上机考试能复制粘贴吗?
  19. 如何制作和发布网页(下)
  20. 我是一只程序猿,沪漂一整年。

热门文章

  1. CSS中Position定位属性的使用
  2. linux怎样删除定时任务,Linux(CentOS)使用定时任务删除Tomcat日志文件
  3. 尚学堂java培训_送给 Java 自学者或者初学者的最全知识清单,2020 年 Java 就该这么学...
  4. mysql 模糊查询之特殊字符下划线 _
  5. 20190908:(leetcode习题)最大子序和
  6. Linux操作系统Ifconfig命令详细解析
  7. 英特尔推出新CPU架构!3D封装打破摩尔定律限制,10nm芯片明年上市
  8. 霍金临终论文公开:揭秘沉入黑洞的信息去向
  9. 痴人、信徒、先驱:深度学习三巨头等口述神经网络复兴史
  10. 英伟达为全自动驾驶汽车打造AI计算机,计算力达上代10倍