[闲的蛋疼系列]从零开始用TypeScript写React的UI组件(0)-先写一个Button??
0.咸鱼要说的
一入前端深似海,咸鱼入海更加咸。
最近闲的蛋疼,手上年前的事也完成了7788了,借助[PG1]的话来说,我们要keep real.
咸鱼肯定不real 了,因为我们都活在梦里,所以咱们keep一下,学习一下菜鸟???是怎么给React写组件的。
咸话少说,咱们开始吧
1.搭一个React,TS的环境
作为一条咸鱼,我肯定不会一步一步给你说清楚的。
要搭?
看这篇文章,反正我是照着这篇文干的
文章链接:https://www.jianshu.com/p/71bbcdc8c1fc
然后把我的webpack贴上来,大家参考下
const webpack = require('webpack')
const path = require('path')
const ExtractTextPlugin = require('extract-text-webpack-plugin');
//const { buildPlugins } = require('./src/keep/config/plugins')
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
module.exports = {
// 我们应用的入口, 在 `src` 目录 (我们添加到下面的 resolve.modules):
entry: {
index: 'index.tsx',
vendor: ['react', 'react-dom']
},
// 配置 devServer 的输出目录和 publicPath
output: {
filename: '[name].[hash:8].js',
publicPath: '/',
path: path.resolve('./dist'),
chunkFilename: "[name].[hash:8].js",
},
// 配置 devServer
devServer: {
port: 3000,
historyApiFallback: true,
inline: true,
stats: {
modules:false
}
},
// 告诉 Webpack 加载 TypeScript 文件
resolve: {
// 首先寻找模块中的 .ts(x) 文件, 然后是 .js 文件
extensions: ['.ts', '.tsx', '.js', 'css', 'less'],
// 在模块中添加 src, 当你导入文件时,可以将 src 作为相关路径
modules: ['src', 'node_modules'],
},
module: {
loaders: [
// .ts(x) 文件应该首先经过 Typescript loader 的处理, 然后是 babel 的处理
{ test: /\.tsx?$/, loaders: ['babel-loader', 'ts-loader'], exclude: /node_modules/, include: path.resolve('src') },
{
test: /\.css$/,
use: ExtractTextPlugin.extract({
fallback: "style-loader",
use: ["css-loader"]
})
},
{
test: /\.less$/,
use: ExtractTextPlugin.extract({
fallback: "style-loader",
use: ["css-loader", "less-loader"]
})
}
]
},
plugins: [
new webpack.HotModuleReplacementPlugin(),//热更
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: JSON.stringify(process.env.NODE_ENV),
},
}),//是否打包,初始化参数
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor'
}),//第三方库内容打包
new CleanWebpackPlugin('dist'),//清理打包文件夹
new ExtractTextPlugin("[name].[hash:8].css", {
disable: false,
allChunks: true,
}),//样式文件配置
new HtmlWebpackPlugin({
template: './src/keep/index.html',
hash: false,
}),//模板文件配置
],
}
2.写一个啥?按钮?
对对对对,按钮最简单,就大小,类型,点击事件
先看一下项目目录结构

是不是敲简单,真的是啥都没有。
先建一个button.jsx,这个就是button组件所在的js
咱们先实现按钮可以配置简单的文字,事件,和基础样式
import React from 'react';
import classNames from 'classnames';
import './style/button.less'; export interface ButtonOption {
text?: string;
icon?: string;
onClick?: () => void;
type?: 'normal' | 'default' | 'danger';
size?: 'sm' | 'xm' | 'lg';
href?: string;
target?: string;
defalutCls?: string;
loading?: boolean;
style?: React.CSSProperties;
className?: string;
} export default class Button extends React.Component<ButtonOption, any>{
static defaultProps = {
defalutCls: 'keep-btn',
loading: false,
type: 'default',
size: 'xm'
}
constructor(props: ButtonOption) {
super(props); } render() {
const {
defalutCls, className, size, type, onClick, text
} = this.props; const isAny: any = {}; const classes = classNames({
[`${defalutCls}`]: defalutCls,
[`${defalutCls}-${size}`]: size,
[`${defalutCls}-${type}`]: type,
'': isAny
}) return <button className={classes} type='button' onClick={onClick} >{text}</button>
} }
button.less如下
@import "./mixins";
@import "../../theme/theme";
.keep-btn
{
padding: 0 15px;
cursor: pointer;
border-radius: 5px;
height: 30px; &-default{
background: @default-5;
border: @default-3 1px solid;
color:#fff;
&:focus,&:active,&::selection,&:visited{
background: @default-7;
border: @default-5 1px solid;
}
} &-normal { }
&-danger{ }
&-sm{ }
&-xm{ }
&-lg{ } }
theme.less如下
@default-1:#e6fffb;
@default-2:#b5f5ec;
@default-3:#87e8de;
@default-4:#5cdbd3;
@default-5:#36cfc9;
@default-6:#13c2c2;
@default-7:#08979c;
@default-8:#006d75;
@default-9:#00474f;
@default-10:#002329;
然后index.jsx把button弄进去看看效果
import React from 'react';
import ReactDOM from 'react-dom';
import Button from './keep/button/button' const App = () => {
return (
<div>
<Button
text={'按钮'}
type={'default'}
size='xm'
onClick={() => { console.log('我点了!!!') }}
/>
</div>
)
} ReactDOM.render(<App />, document.getElementById('app'))
package.json的命令我是这样配置的
"scripts": {
"build": "set NODE_ENV=production&&webpack",
"start": "set NODE_ENV=dev&&webpack-dev-server --progress -w --colors"
},
咱们start一下看看

是不是敲简单。
接下来我们,我们来搞一下按钮大小的问题

其实在按钮拼写样式的时候
const classes = classNames({
[`${defalutCls}`]: defalutCls,
[`${defalutCls}-${size}`]: size,
[`${defalutCls}-${type}`]: type,
'': isAny
})
就已经把class写进去了,咱们只需要编写一下样式就好了
button.less
@import "./mixins";
@import "../../theme/theme";
.keep-btn
{ cursor: pointer;
margin: 5px;
&-default{
background: @default-5;
border: @default-3 1px solid;
color:#fff;
&:focus,&:active,&::selection,&:visited{
background: @default-7;
border: @default-5 1px solid;
}
} &-normal { }
&-danger{ }
&-sm{
padding: 0 13px;
border-radius: 5px;
height: 25px;
font-size: 12px;
}
&-xm{
padding: 0 15px;
font-size: 13px;
border-radius: 5px;
height: 30px;
}
&-lg{
font-size: 14px;
padding: 0 18px;
border-radius: 5px;
height: 35px;
} }
import React from 'react';
import ReactDOM from 'react-dom';
import Button from './keep/button/button' const App = () => {
return (
<div>
<Button
text={'大号按钮'}
type={'default'}
size='lg'
onClick={() => { console.log('我点了!!!') }}
/> <Button
text={'中号按钮'}
type={'default'}
size='xm'
onClick={() => { console.log('我点了!!!') }}
/> <Button
text={'小号按钮'}
type={'default'}
size='sm'
onClick={() => { console.log('我点了!!!') }}
/> </div>
)
} ReactDOM.render(<App />, document.getElementById('app'))
看看效果

嗯,满意,咸鱼的要求达到了。
咱们再搞搞他的形态
@import "./mixins";
@import "../../theme/theme";
.keep-btn
{ cursor: pointer;
margin: 5px;
&-default{
background: @default-5;
border: @default-3 1px solid;
color:#fff;
&:focus,&:active,&::selection,&:visited{
background: @default-7;
border: @default-5 1px solid;
}
} &-normal {
background: #fff;
border: @default-5 1px solid;
color: @default-5;
&:focus,&:active,&::selection,&:visited{
border: @default-3 1px solid;
color: @default-3;
}
}
&-danger{
background: red;
border: red 1px solid;
color: #fff;
&:focus,&:active,&::selection,&:visited{
border: red 1px solid;
color: #fff;
}
}
&-sm{
padding: 0 13px;
border-radius: 5px;
height: 25px;
font-size: 12px;
}
&-xm{
padding: 0 15px;
font-size: 13px;
border-radius: 5px;
height: 30px;
}
&-lg{
font-size: 14px;
padding: 0 18px;
border-radius: 5px;
height: 35px;
} }
看看效果

嗯嗯~,咸鱼表示很好。咸鱼表示,按钮做到这样就可以了。
然后下篇文章写个简单的导航?
好,就写一个简单的导航
[闲的蛋疼系列]从零开始用TypeScript写React的UI组件(0)-先写一个Button??的更多相关文章
- 使用 TypeScript,React,ANTLR 和 Monaco Editor 创建一个自定义 Web 编辑器(二)
译文来源 欢迎阅读如何使用 TypeScript, React, ANTLR4, Monaco Editor 创建一个自定义 Web 编辑器系列的第二章节, 在这之前建议您阅读使用 TypeScrip ...
- react系列从零开始-react介绍
react算是目前最火的js MVC框架了,写一个react系列的博客,顺便回忆一下react的基础知识,新入门前端的小白,可以持续关注,我会从零开始教大家用react开发一个完整的项目,也会涉及到w ...
- 开始使用 TypeScript 和 React
原文地址:Getting started with TypeScript and React 原文作者:Jack_Franklin 译者:luxj 校对者:veizz Tom Dale 和其他人有一些 ...
- 在 Mac OS 上使用 TypeScript 编写 ASP.NET Core 1.0 应用
var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...
- 【react】使用 create-react-app 构建基于TypeScript的React前端架构----上
写在前面 一直在探寻,那优雅的美:一直在探寻,那精湛的技巧:一直在探寻,那简单又直白,优雅而美丽的代码. ------ 但是在JavaScript的动态类型.有时尴尬的自动类型转换,以及 “0 == ...
- C#基础拾遗系列之二:使用ILSpy探索C#7.0新增功能点
C#基础拾遗系列之二:使用ILSpy探索C#7.0新增功能点 第一部分: C#是一种通用的,类型安全的,面向对象的编程语言.有如下特点: (1)面向对象:c# 是面向对象的范例的一个丰富实现, 它 ...
- React Native实战系列教程之自定义原生UI组件和VideoView视频播放器开发
React Native实战系列教程之自定义原生UI组件和VideoView视频播放器开发 2016/09/23 | React Native技术文章 | Sky丶清| 4 条评论 | 1 ...
- 三千字讲清TypeScript与React的实战技巧
很多时候虽然我们了解了TypeScript相关的基础知识,但是这不足以保证我们在实际项目中可以灵活运用,比如现在绝大部分前端开发者的项目都是依赖于框架的,因此我们需要来讲一下React与TypeScr ...
- TypeScript在React项目中的使用总结
序言 本文会侧重于TypeScript(以下简称TS)在项目中与React的结合使用情况,而非TS的基本概念.关于TS的类型查看可以使用在线TS工具TypeScript游乐场 React元素相关 Re ...
随机推荐
- ssm整合(基于xml配置方式)
本文是基于xml配置的方式来整合SpringMVC.Spring和Mybatis(基于注解的方式会再写一篇文章),步骤如下: (1)首先自然是依赖包的配置文件 pom.xml <project ...
- SharePoint Online Add-in 开发简介
作者:陈希章 发表于 2017年12月22日 在 再谈SharePoint大局观 中我提到了SharePoint开发的一些新的变化,这一篇文章我将讲解SharePoint Add-in开发.其实早在2 ...
- nginx防恶意域名解析
今天无意间查看访问日志发现一个fhxywh.com的域名居然解析到了我的服务器,也就是说通过这个域名也能访问我的博客,这个就是赤裸裸的恶意域名解析了. 这个危害非常大,不仅会影响用户,而且不利于SEO ...
- (转)spring aop
工作忙,时间紧,不过事情再多,学习是必须的.记得以前的部门老大说过:“开发人员不可能一天到晚只有工作,肯定是需要自我学习.第一:为了更充实自己,保持进步状态.第二:为了提升技术,提高开发能力.第三:保 ...
- 9.python面向对象编程
面向对象的几个核心特性如下 Class 类一个类即是对一类拥有相同属性的对象的抽象.蓝图.原型.在类中定义了这些对象的都具备的属性(variables(data)).共同的方法 Object 对象 一 ...
- mac上虚拟机安装旧版本的macosx 10.8
前言 由于测试的需要,需要10.8的macosx,但又不想降级自己mac版本,所以还是装虚拟机,Parallels Desktop试验了安装不了osx,就换VMware Fusion,发现是可以的. ...
- 来腾讯云开发者实验室 学习.NET
腾讯云开发者实验室为开发者提供了一个零门槛的在线实验平台,开发者实验室提供的能力: 零门槛扫码即可免费领取实验机器,支持使用自有机器参与,实验完成后支持保留实验成果: 在线 WEB IDE 支持 sh ...
- Git常用命令清单笔记
git github 小弟调调 2015年01月12日发布 赞 | 6收藏 | 45 5k 次浏览 这里是我的笔记,记录一些git常用和一些记不住的命令,这个笔记原本是基于 颜海镜的文章增加 ...
- ArcGIS 网络分析[8.2] 资料2 使用IDatasetContainer2接口的CreateDataset方法创建网络数据集
上节提及如何使用IDatasetContainer2接口访问到网络数据集,上例可以封装为一个方法. 这节就使用IDatasetContainer2接口(Geodatabase类库)的CreateDat ...
- Find the Maximum sum
Given an array of n elements.Find the maximum sum when the array elements will be arranged in such w ...