创建工程目录
projectName="rctWpkProj" mkdir ${projectName} mkdir ${projectName}/src mkdir ${projectName}/src/components mkdir ${projectName}/dist cd ${projectName}
初始化工程
package.json npm init -y //-g 全局的依赖包 sudo npm install -g webpack // --save 表明部署时候的依赖包 npm install --save react react-dom @types/react @types/react-dom //--save-dev 开发时的依赖吧 npm install --save-dev typescript awesome-typescript-loader source-map-loader // 安装 ui 组件 npm install antd --save npm install style-loader css-loader --save
+tsconfig.json
保证当前位于项目根目录
cd ${projectName} cat <<EOF > tsconfig.json { "compilerOptions": { "outDir": "./dist/", "sourceMap": true, "noImplicitAny": true, "module": "commonjs", "target": "es6", "jsx": "react", "allowJs": true, "allowSyntheticDefaultImports": true, "experimentalDecorators": true, "moduleResolution": "node", }, "include": [ "./src/**/*" ]} EOF
编写项目 demo1
编写组件 cd src/components/ //创建组件文件 cat <<EOF >Hello.tsx import * as React from "react" export interface HelloProps { compiler :string; framework :string; } export const Hello = (props : HelloProps)=> <h1>Hello from {props.compiler} and {props.framework}!</h1> EOF
使用组件
cd src/ cat <<EOF >index.tsx import * as React from "react" import * as ReactDOM from "react-dom" import { Hello } from "./components/Hello" ReactDOM.render( <Hello compiler="typeScript" framework="React"></Hello>, document.getElementById("example") ) EOF
创建html界面
//在根目录下 cd %projectName //创建可以让react 挂载的 html 文件 cat <<EOF >index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>Hello React!</title> </head> <body> <div id="example"></div> <!-- Dependencies --> <script src="./node_modules/react/umd/react.development.js"></script> <script src="./node_modules/react-dom/umd/react-dom.development.js"></script> <!-- Main --> <script src="./dist/bundle.js"></script> </body> </html> EOF
+webpack.config.js
//cd到项目目录 //cd到项目目录 cd $projectName //创建 webpack 打包配置文件 cat <<EOF >webpack.config.js module.exports = { entry: "./src/index.tsx", output: { filename: "bundle.js", path: __dirname + "/dist" }, // Enable sourcemaps for debugging webpack's output. devtool: "source-map", resolve: { // Add '.ts' and '.tsx' as resolvable extensions. extensions: [".ts", ".tsx", ".js", ".json"] }, module: { rules: [ // All files with a '.ts' or '.tsx' extension will be handled by 'awesome-typescript-loader'. { test: /\.tsx?$/, loader: "awesome-typescript-loader" }, // All output '.js' files will have any sourcemaps re-processed by 'source-map-loader'. { enforce: "pre", test: /\.js$/, loader: "source-map-loader" } ] }, // When importing a module whose path matches one of the following, just // assume a corresponding global variable exists and use that instead. // This is important because it allows us to avoid bundling all of our // dependencies, which allows browsers to cache those libraries between builds. externals: { "react": "React", "react-dom": "ReactDOM" },}; EOF
编译项目
webpack
组件设计原则
不可以改变 props ,即 不可以改变 传入 参数
如果要改变参数 请单独在 state 中存储参数
编写计时器demo
cd src/components //创建计时器组件 cat <<EOF >Clock1.tsx import * as React from "react" import ReactDOM = require("react-dom") export class Clock1 extends React.Component<{name:string}> { getMilliTime =()=>{ let time1=new Date() let timeString=`${time1.toLocaleString()} 毫秒:${time1.getMilliseconds().toString()} ` return timeString } state ={ // date:new Date().toLocaleTimeString(), date:this.getMilliTime(), interval1 : 0, name :'' } constructor(props:any){ super(props); } cancelIntval = (e:any )=> { clearInterval( this.state.interval1); } creatIntval =(e:any) =>{ this.setState({ date:this.getMilliTime() }) var val1= setInterval(()=>{ this.setState({ date:this.getMilliTime(), }) } , 10) this.setState({ interval1:val1 }) } componentDidMount(){ this.creatIntval(event) } render(){ const divStyle = { display : 'flex', border: '1px solid', } const outerDivStyle={ padding :'10px' } return ( <div style={outerDivStyle}> <div style={divStyle}> <h2>clock.NO{this.props.name}</h2> <h2>now time is {this.state.date}</h2> <button onClick={this.cancelIntval}>暂停计时</button> <button onClick={this.creatIntval}>开始计时</button> </div> </div> ) } } EOF
元素循环
import * as React from "react" import * as ReactDOM from "react-dom" import { Hello } from "./components/Hello" import { ClassHello } from "./components/ClassHello" import { Clock1 } from "./components/Clock1" function ManyClock(){ //主要代码, // 生成 连续自然数数组 var arrays= Array.from(Array(6).keys()) //把数组元素变换成标签 var elemlists =arrays.map((item1)=>{ let item=item1+1 return (<Clock1 key={item.toString()} name={item.toString()}></Clock1>) }) return ( <div> {elemlists} </div> ) } ReactDOM.render( // <Hello compiler="typeScript" framework="React"></Hello>, // <ClassHello name="12" compiler="tpc" framework="react"></ClassHello>, // <Clock1 ></Clock1>, <ManyClock></ManyClock>, document.getElementById("example") )
装饰器 @observer
被装饰的组件中的state 发生变化时,可以及时的渲染组件
来用装饰器实现一个 定时器
ant使用
安装与引入
npm install antd --save
import * as React from "react" import { Button, DatePicker, version } from "antd"; import 'antd/dist/antd.css'