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'))

看看效果

嗯,满意,咸鱼的要求达到了。

咱们再搞搞他的形态

'normal' | 'default' | 'danger';
normal就是白色背景,danger就是红色背景,改下样式就OK了嘛,敲简单。
改一下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 {
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??的更多相关文章

  1. 使用 TypeScript,React,ANTLR 和 Monaco Editor 创建一个自定义 Web 编辑器(二)

    译文来源 欢迎阅读如何使用 TypeScript, React, ANTLR4, Monaco Editor 创建一个自定义 Web 编辑器系列的第二章节, 在这之前建议您阅读使用 TypeScrip ...

  2. react系列从零开始-react介绍

    react算是目前最火的js MVC框架了,写一个react系列的博客,顺便回忆一下react的基础知识,新入门前端的小白,可以持续关注,我会从零开始教大家用react开发一个完整的项目,也会涉及到w ...

  3. 开始使用 TypeScript 和 React

    原文地址:Getting started with TypeScript and React 原文作者:Jack_Franklin 译者:luxj 校对者:veizz Tom Dale 和其他人有一些 ...

  4. 在 Mac OS 上使用 TypeScript 编写 ASP.NET Core 1.0 应用

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  5. 【react】使用 create-react-app 构建基于TypeScript的React前端架构----上

    写在前面 一直在探寻,那优雅的美:一直在探寻,那精湛的技巧:一直在探寻,那简单又直白,优雅而美丽的代码. ------ 但是在JavaScript的动态类型.有时尴尬的自动类型转换,以及 “0 == ...

  6. C#基础拾遗系列之二:使用ILSpy探索C#7.0新增功能点

    C#基础拾遗系列之二:使用ILSpy探索C#7.0新增功能点   第一部分: C#是一种通用的,类型安全的,面向对象的编程语言.有如下特点: (1)面向对象:c# 是面向对象的范例的一个丰富实现, 它 ...

  7. React Native实战系列教程之自定义原生UI组件和VideoView视频播放器开发

    React Native实战系列教程之自定义原生UI组件和VideoView视频播放器开发   2016/09/23 |  React Native技术文章 |  Sky丶清|  4 条评论 |  1 ...

  8. 三千字讲清TypeScript与React的实战技巧

    很多时候虽然我们了解了TypeScript相关的基础知识,但是这不足以保证我们在实际项目中可以灵活运用,比如现在绝大部分前端开发者的项目都是依赖于框架的,因此我们需要来讲一下React与TypeScr ...

  9. TypeScript在React项目中的使用总结

    序言 本文会侧重于TypeScript(以下简称TS)在项目中与React的结合使用情况,而非TS的基本概念.关于TS的类型查看可以使用在线TS工具TypeScript游乐场 React元素相关 Re ...

随机推荐

  1. 是否是有效的dom节点--轮子代码

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title> ...

  2. Windows下docker的安装,将ASP.NET Core程序部署在docker中

    参考文章: https://www.cnblogs.com/jRoger/p/aspnet-core-deploy-to-docker.html https://www.cnblogs.com/jRo ...

  3. 【CODEFORCES】 A. Dreamoon and Sums

    A. Dreamoon and Sums time limit per test 1.5 seconds memory limit per test 256 megabytes input stand ...

  4. 七、Spring Boot Servlet 使用

    Web开发使用 Controller 基本上可以完成大部分需求,但是我们还可能会用到 Servlet.Filter.Listener.Interceptor 等等. 当使用spring-Boot时,嵌 ...

  5. Material使用02 图标MdIconModule、矢量图作为图标使用及改进

    1 MdIconModule模块的使用 1.1 在需要用到的模块中引入Material图标模块 import { BrowserModule } from '@angular/platform-bro ...

  6. 原生JS的Ajax

    转自:https://www.cnblogs.com/yufann/p/JS-Ajax.html 1.创建一个Ajax对象 非IE6浏览器:var obj = new XMLHttpReuqest() ...

  7. 《程序设计语言——实践之路(英文第三版)》【PDF】下载

    <程序设计语言--实践之路(英文第三版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382234 内容简介 <程序设计语 ...

  8. Jenkins+github+maven+git+linux

    Jenkins:持续集成的一个工具 github:远程存放代码 maven:利用maven创建项目,配置pom.xm依赖 git :本地仓库,可以提交代码到远程(我都是使用git 在git bush ...

  9. 微信小程序使用场景延伸:扫码登录、扫码支付

    微信小程序使用场景延伸:扫码登录.扫码支付 小程序最适合的使用场景有哪些?相比大家能列举出来很多,但这个场景,大家可能多数没想到_^ 笔者团队近期接到了一个PC项目:转转游戏租号PC官网,该项目要求在 ...

  10. Django实战,小网站实现增删改查

    直接上代码 视图: from django.shortcuts import render,render_to_response, redirect from submit import models ...