学习 React(jsx语法) + es2015 + babel + webpack
视频学习地址:
官方地址
神坑:
0、【You need to specify 'babel-loader' instead of 'babel'.】。解决方案:webpack中的loader:"babel-loader",不要简写为:loader:"babel"
1、每次this.setState都会重新初始化getInitialState中的参数
2、createClass的命名必须以大写开头如,var MySelect = React.createClass,这里如果定义为myselect就会出错
3、render方法的第一个参数return,html代码的第一行必须和return同一行,剩下的才可以换行,也就是不能让 return 孤零零的占据一行,或者用括号将html代码括起来
4、如果你是Linux或者mac系统,在执行工具如babel/webpack时记得加上权限(sudo)
5、.babelrc文件中的缩进非常有讲究,必须是两个空格。不讲究也没关系。反正是用webpack来代替.babelrc文件的配置的
6、Html的for属性必须改为htmlFor,class属性必须改为className
7、引入组件必须使用如下形式: import { Mysearch } from './header.js'
8、和vue很相似。render函数中return的(jsx)Html,最外层必须包含一个div。也就是说不能同时return两个同级的div
html环境搭建(前期学习使用,后期废弃)
<!DOCTYPE html>
<html>
<meta charset='utf-8'>
<head>
<title></title>
<script src="http://cdn.bootcss.com/react/15.0.0/react.min.js"></script>
<script src="http://cdn.bootcss.com/react/15.0.0/react-dom.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.34/browser.min.js"></script>
</head>
<body> </body>
</html>
demo 1 渲染
<script type="text/babel">
ReactDOM.render(
<h1>Hello, world!</h1>,
document.getElementById('example')
);
</script>
demo 2 循环
<script type="text/babel">
var nav_li=[
<li><a href='#'>最新电影</a></li>,
<li><a href='#'>最新评论</a></li>
];
ReactDOM.render(
<ul>{nav_li}</ul>,
document.getElementById('navbar')
)
</script> <script type="text/babel">
var nav_li=['最新电影', '最新评论'];
ReactDOM.render(
<ul>
{
nav_li.map(function(item){
return <li><a href='#'>{item}</a></li>;
})
}
</ul>,
document.getElementById('navbar')
)
</script>
demo3 : 绑定事件
<script type="text/babel">
var aa = function()
{
alert("123");
} var nav_li=['最新电影', '最新评论'];
ReactDOM.render(
<ul>
{
nav_li.map(function(item){
return <li><a href='#' onClick={function(){alert('123')}}>{item}</a></li>;
return <li><a href='#' onClick={aa}>{item}</a></li>;
})
}
</ul>,
document.getElementById('navbar')
)
</script>
demo4 : 组件化(重头戏)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="https://cdn.bootcss.com/react/16.4.0/umd/react.production.min.js"></script>
<script src="https://cdn.bootcss.com/react-dom/16.4.0/umd/react-dom.production.min.js"></script>
<!-- babel6.0以上已经不支持了浏览器了 -->
<script src="https://cdn.bootcss.com/babel-core/5.8.38/browser.min.js"></script>
<title>Document</title>
</head>
<style>
</style>
<body>
<div id="app"></div> <div id="navbar"></div> <div id="Welcome"></div>
</body> <!-- 必须标识为 type="text/babel" -->
<script type="text/babel">
ReactDOM.render(
<h1>Hello, world!</h1>,
document.getElementById('app')
); var nav_li=['最新电影', '最新评论'];
ReactDOM.render(
<ul>
{
nav_li.map(function(item){
return <li><a href='#'>{item}</a></li>;
})
}
</ul>,
document.getElementById('navbar')
) class Welcome extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
const element = <Welcome name="Sara" />;
ReactDOM.render(
element,
document.getElementById('Welcome')
);
</script>
</html>
demo5:嵌套组件、递归属性(this.props.XXX),注意!! HTML的class在这里是className
var NavBar = React.createClass({
myFunc : function(){alert("123")},
render : function()
{
return <ul>
<li><a href='#' onClick={this.myFunc}>最新电影</a></li>
<li><a href='#'>最新评论</a></li>
<li><SearchText SearchText_abc={this.props.SearchText_abc} /></li>
</ul>
}
}) var SearchText = React.createClass({
render:function()
{
return <input type="text" placeholder = "请输入文字" className = {this.props.SearchText_abc} />
}
}) ReactDOM.render(
<NavBar SearchText_abc="Lee" />,
document.getElementById('navbar')
)
demo6: AJAX实战,在success后必须重新绑定this指针
#js代码
var MoviesList = React.createClass
({
getInitialState:function()
{
return {
movie:[]
}
},
componentDidMount:function()
{
$.ajax
({
url:"http://zhaohong.com",
success:function(data)
{
data = JSON.parse(data);
console.log(data);
this.setState({movie:data});
}.bind(this) //将AJAX中的this的指针更换为当前对象
})
},
render:function()
{
//console.log("我是reander",this.state.movie);
var myli = this.state.movie.map(function(item)
{
console.log(item);
return <li>{item.moiveName}</li>
});
return <ul>{myli}</ul>
}
}) ReactDOM.render(
<ul>
<MoviesList />
</ul>,
document.getElementById('moiveList')
) #php代码
header("Access-Control-Allow-Origin:*");
$arr = array();
$arr[0]["moiveName"] = "美国队长3内战";
$arr[1]["moiveName"] = "X战警3天启";
$arr[2]["moiveName"] = "大鱼海棠"; $arr[0]["id"] = "1";
$arr[1]["id"] = "2";
$arr[2]["id"] = "3"; $arr[0]["info"] = "奥创纪元之后,全球政府联合颁布法令,管控超能力活动。对这条法令的不同态度,使复仇者阵营一分为二,钢铁侠和美国队长各据一方,其他复仇者则不得不做出自己的选择,最终引发前任盟友间的史诗大战。";
$arr[1]["info"] = "该片故事以20世纪80年代为背景,讲述了古老强大的第一个变种人天启在埃及醒来,他想统治并改变这个世界,而引发一系列变种人大战的故事";
$arr[2]["info"] = "所有人类的灵魂都是海里一条巨大的鱼,出生的时候从海的此岸出发,在路途中,有时相遇,有时分开,死的时候去到海的彼岸,之后变成一条沉睡的小鱼,等待多年后的再次出发,这个旅程永远不会结束,生命往复不息。十六岁生日那天,居住在“神之围楼”里的一个名叫椿的女孩变作一条海豚到人间巡礼,被大海中的一张网困住,一个人类男孩因为救她而落入深海死去。为了报恩,为了让人类男孩复活,她需要在自己的世界里,历经种种困难与阻碍,帮助死后男孩的灵魂——一条拇指那么大的小鱼,成长为一条比鲸更巨大的鱼并回归大海";
exit(json_encode($arr));
demo7 : 移除组件、移除时的事件
var NavBar = React.createClass({
myFunc : function(){alert("")},
myRemove:function(){ReactDOM.unmountComponentAtNode(document.getElementById('navbar'))},
render : function()
{
return <ul>
<li><a href='#' onClick={this.myFunc}>最新电影</a></li>
<li><a href='#' onClick={this.myRemove}>最新评论</a></li>
<li><SearchText SearchText_abc={this.props.SearchText_abc} /></li>
</ul>
},
componentWillUnmount: function() {
alert("我被移除了");
}
})
demo8 : Input设置value属性时的问题、由于value是React的保留字段,当对Input书写该属性的时候,会造成input只读。需要配合state + onChange + e.target.value来实现正常input
var SearchText = React.createClass
({
getInitialState:function()
{
return {
title:"请输入文字"
}
},
myChange:function(e)
{
var v = e.target.value;
this.setState({title:v});
},
render:function()
{
return <input type="text" placeholder = "请输入文字" value={this.state.title} onChange={this.myChange} className = {this.props.SearchText_abc} />
}
})
Demo9:引入组件,注意label的for属性必须改为htmlFor
#index.js
var React = require("react")
var ReactDOM = require("react-dom")
import { Mysearch } from './header.js' ReactDOM.render(
<Mysearch />,
document.getElementById('Header')
) #header.js
var React = require("react")
var Mysearch = React.createClass({
render : function()
{
return (
<div className="comm_list_temp">
<div className="comm_input">
<ul>
<li className="oneline"><label htmlFor="min_sales">模板名称:</label>
<input type="text" value="" name="" className="nomore" />
<button type="button" className="redbutton fl ml-10">搜索</button>
<button type="reset" className="whitebutton fl ml-10">重置</button>
</li>
</ul>
</div>
</div>
)
}
}) exports.Mysearch = Mysearch;
正片开始,前方高能
安装babel以及各种插件(es2015/react/react-dom/react解析)
(神坑:文件夹如果也叫react,那么你在npm init时的项目命名千万别和react重名(默认会是你的文件夹名),当然包括其他组件名和框架名都要避免。否则会报错)
安装nodejs
http://nodejs.cn/ 安装 babel
npm install babel-cli -g 安装webpack
npm install webpack -g 安装插件(在命令行使用的时候,记得先整合成一行)
npm install
babel-core
babel-preset-react
babel-preset-es2015
babel-preset-stage-0
react
react-dom
webpack
babel-loader
css-loader
style-loader
webpack-dev-server
html-webpack-plugin
url-loader
--save-dev
webpack.config.js
var HtmlWebpackPlugin = require('html-webpack-plugin');
var webpack = require('webpack');
var path = require("path"); module.exports = {
entry:{
app : ['./src/js/index.js']
},
output: {
path: path.resolve(__dirname, "build/js"),
filename:'[name].js' //最终打包生成的文件名
},
devServer: {
historyApiFallback: true,
hot: true,
inline: true,
progress: true,
port:9091 //这个端口你可以自定义
},
module: {
loaders: [
{
test: /\.js|jsx$/, //是一个正则,代表js或者jsx后缀的文件要使用
loader: 'babel',
query:{
presets:['es2015','react','stage-0'] //必须先安装babel-preset-es2015和babel-preset-react
}
},
{
test: /\.css$/,
loaders: ['style', 'css'], //必须先安装css-loader和style-loader
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url',
query: {
limit: 10000,
name: './build/img/[name].[hash:7].[ext]'
}
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url',
query: {
limit: 10000,
name: './build/fonts/[name].[hash:7].[ext]'
}
}
]
},
plugins:[
//动态将上面编译好的js文件导入到以下html文件中并且生成到指定目录
new HtmlWebpackPlugin({
template:__dirname + '/src/tpl/index.html',
filename:__dirname + '/build/tpl/index.html',
hash:true,
inject:"body",
chunks:['common','app']
}),
//提取出公共的代码
new webpack.optimize.CommonsChunkPlugin({
name:"common", //对应entry的对象名称
chunks:['app']
})
]
}
使用webpack:
sudo webpack
热编译
每次修改完代码都要手动在控制台中输入webpack是很变态的一件事,最好能每次保存js文件时自动编译。这就是热编译
但是,热编译是热编译、build是build(这里的build指的是在控制台单独使用webpack编译)、一定要区分开来各自的作用。
打开package.json加入
"scripts": {
"start": "webpack-dev-server --hot --inline"
}
在根目录中新建test/index1.html (请务必注意以下代码的script引用规则)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="app"></div> <!-- #这个是必须加载的文件 -->
<script src="http://localhost:9091/webpack-dev-server.js"></script> <!-- #这下面就是需要热编译的js,必须是webpack中输出的文件才有效 -->
<script src="http://localhost:9091/common.js"></script>
<script src="http://localhost:9091/app.js"></script> </body>
</html>
打开控制台
#开启热编译
npm start
打开网页 : localhost:9091/test/index1.html
当修改该页面引入的js文件时。就会自动编译
注意,这个热编译插件,他是将编译的js放入内存中并且引入到指定的html中。所以并没有生成到build文件夹下,如果想生成还需要手动使用webpack命令
开始React和第三方结合
React-bootstrap的学习:http://react-bootstrap.github.io/components.html#navbars
npm install react-bootstrap --save-dev
页面引入css:
<link href="https://cdn.bootcss.com/bootstrap/3.3.6//css/bootstrap.min.css" rel="stylesheet">
js
const React =require('react');
const ReactDOM = require('react-dom'); var Nav = require('react-bootstrap').Nav;
var NavItem = require('react-bootstrap').NavItem;
var NavDropdown = require('react-bootstrap').NavDropdown;
var MenuItem = require('react-bootstrap').MenuItem;
var Navbar = require('react-bootstrap').Navbar; let MyNav = React.createClass({
render:function()
{
return <Navbar>
<Navbar.Header>
<Navbar.Brand>
<a href="#">React-Bootstrap</a>
</Navbar.Brand>
</Navbar.Header>
<Nav>
<NavItem eventKey={1} href="#">Link</NavItem>
<NavItem eventKey={2} href="#">Link</NavItem>
<NavDropdown eventKey={3} title="Dropdown" id="basic-nav-dropdown">
<MenuItem eventKey={3.1}>Action</MenuItem>
<MenuItem eventKey={3.2}>Another action</MenuItem>
<MenuItem eventKey={3.3}>Something else here</MenuItem>
<MenuItem divider />
<MenuItem eventKey={3.3}>Separated link</MenuItem>
</NavDropdown>
</Nav>
</Navbar>
}
}) ReactDOM.render(<MyNav />, document.getElementById('demo'));
编译即可看到结果
React-amazeui(PC端)的学习:http://amazeui.org/react/getting-started
npm install amazeui-react --save-dev npm install babel-preset-stage-0 npm install babel-plugin-transform-object-rest-spread
.babelrc
{
"presets":["es2015","react","stage-0"],
"plugins":['transform-object-rest-spread']
}
index.js(demo1)
const React =require('react');
const ReactDOM = require('react-dom');
const AMUIReact = require('amazeui-react'); var props = {
title: 'Amaze UI',
link: '#title-link',
data: {
left: [
{
link: '#left-link',
icon: 'home'
}
],
right: [
{
link: '#right-link',
icon: 'bars'
}
]
},
onSelect: function(nav, e) {
e.preventDefault();
console.log('你点击了', nav);
// do something
}
}; ReactDOM.render(<AMUIReact.Header {...props} />, document.getElementById('demo'));
index.js(demo2)
const React =require('react');
const ReactDOM = require('react-dom');
const AMUIReact = require('amazeui-react');
const Panel = AMUIReact.Panel; let MyPanel = React.createClass({
render:function()
{
return <div>
<Panel header="面板标题">
默认面板
</Panel>
<Panel header="面板标题" amStyle="primary">
primary - 面板
</Panel>
<Panel header="面板标题" amStyle="secondary">
secondary - 面板
</Panel>
<Panel header="面板标题" amStyle="success">
success - 面板
</Panel>
<Panel header="面板标题" amStyle="warning">
warning - 面板
</Panel>
<Panel header="面板标题" amStyle="danger">
danger - 面板
</Panel>
</div>
}
}) ReactDOM.render(<MyPanel />, document.getElementById('demo'));
amazeui touch(移动端):http://t.amazeui.org/#/docs?_k=4cmux8
#下载
npm install --save-dev amazeui-touch
sudo npm install react-router --save-dev
#根据错误提示和 amazeui-touch 下的.babelrc文件中的内容,下载如下内容
sudo npm install babel-preset-stage-0
sudo npm install babel-plugin-transform-object-assign --save sudo npm install babel-plugin-add-module-exports --save-dev sudo npm install transform-object-rest-spread
#这个是根据错误提示加入的 sudo npm install react-addons-css-transition-group --save-dev sudo npm install babel-preset-stage-0 --save-dev #注意要在.babelrc和webpack.config.js的配置位置中加入stage-0才行
为了更好的配合编译,推荐将webpack.config.js中的entry配置为如下示例。
在html中只需要加载如下两个Js:
<script src="http://localhost:9898/webpack-dev-server.js"></script> <!-- 固定写法,不同的只是端口号 -->
<script type="text/javascript" src='main.js'></script> <!-- 按需配置,按需加载 -->
并且注意,热编译的html必须在根目录。
entry: {
//代表入口(总)文件 ,可以写多个。
main:['./src/main.js'],
user:['./src/login.js']
},
html
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="description" content="">
<meta name="keywords" content="">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Amaze UI Touch</title>
<meta name="renderer" content="webkit">
<!-- No Baidu Siteapp-->
<meta http-equiv="Cache-Control" content="no-siteapp">
<link rel="alternate icon" type="image/png" href="i/favicon.png">
<link rel="apple-touch-icon-precomposed" href="i/app-icon72x72@2x.png">
<meta name="apple-mobile-web-app-title" content="AMUI React">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<link rel="stylesheet" href="https://npmcdn.com/amazeui-touch@1.0.0-beta.3/dist/amazeui.touch.min.css">
</head>
<body>
<div id="demo"></div> <script src="http://localhost:9898/webpack-dev-server.js"></script>
<script type="text/javascript" src='index-webpack.js'></script> </body>
</html>
demo1:
var React = require('react');
var ReactDOM = require('react-dom');
import {Button} from 'amazeui-touch'; ReactDOM.render(
<Button>Hello World!</Button>,
document.getElementById('demo')
)
demo2:剥离引用(口述)
新建一个card.js,随意利用React.createClass创建一个类,命名为CardExample,然后exports.CardExample = CardExample;
在index.js中.其中react和react-dom不需要担心重复引用的问题,系统自动会判断
var React = require('react');
var ReactDOM = require('react-dom');
var card = require('./card.js'); ReactDOM.render(
<card.CardExample />,
document.getElementById('demo')
)
学习蚂蚁:http://ant.design/docs/react/introduce
npm install antd
demo1
import React from 'react';
import ReactDOM from 'react-dom';
import 'antd/dist/antd.css';
import { Table, Icon } from 'antd'; const columns = [{
title: 'Name',
dataIndex: 'name',
key: 'name',
render: text => <a href="#">{text}</a>,
}, {
title: 'Age',
dataIndex: 'age',
key: 'age',
}, {
title: 'Address',
dataIndex: 'address',
key: 'address',
}, {
title: 'Action',
key: 'action',
render: (text, record) => (
<span>
<a href="#">Action 一 {record.name}</a>
<span className="ant-divider" />
<a href="#">Delete</a>
<span className="ant-divider" />
<a href="#" className="ant-dropdown-link">
More actions <Icon type="down" />
</a>
</span>
),
}]; const data = [{
key: '1',
name: 'John Brown',
age: 32,
address: 'New York No. 1 Lake Park',
}, {
key: '2',
name: 'Jim Green',
age: 42,
address: 'London No. 1 Lake Park',
}, {
key: '3',
name: 'Joe Black',
age: 32,
address: 'Sidney No. 1 Lake Park',
}]; ReactDOM.render(<Table columns={columns} dataSource={data} />,document.getElementById('app'));
demo2
import React from 'react';
import ReactDOM from 'react-dom';
import 'antd/dist/antd.css';
import { DatePicker, message } from 'antd'; class App extends React.Component {
constructor(props) {
super(props);
this.state = {
date: '',
};
}
handleChange(date) {
message.info('您选择的日期是: ' + date.toString());
this.setState({ date });
}
render() {
return (
<div style={{ width: 400, margin: '100px auto' }}>
<DatePicker onChange={value => this.handleChange(value)} />
<div style={{ marginTop: 20 }}>当前日期:{this.state.date.toString()}</div>
</div>
);
}
} ReactDOM.render(<App />, document.getElementById('app'));
demo3
import React from 'react';
import ReactDOM from 'react-dom'; import 'antd/dist/antd.css';
import { Layout, Menu, Icon } from 'antd';
const { Header, Sider, Content } = Layout; class SiderDemo extends React.Component {
state = {
collapsed: false,
};
toggle = () => {
this.setState({
collapsed: !this.state.collapsed,
});
}
render() {
return (
<Layout>
<Sider
trigger={null}
collapsible
collapsed={this.state.collapsed}
>
<div className="logo" />
<Menu theme="dark" mode="inline" defaultSelectedKeys={['1']}>
<Menu.Item key="1">
<Icon type="user" />
<span className="nav-text">nav 1</span>
</Menu.Item>
<Menu.Item key="2">
<Icon type="video-camera" />
<span className="nav-text">nav 2</span>
</Menu.Item>
<Menu.Item key="3">
<Icon type="upload" />
<span className="nav-text">nav 3</span>
</Menu.Item>
</Menu>
</Sider>
<Layout>
<Header style={{ background: '#fff', padding: 0 }}>
<Icon
className="trigger"
type={this.state.collapsed ? 'menu-unfold' : 'menu-fold'}
onClick={this.toggle}
/>
</Header>
<Content style={{ margin: '24px 16px', padding: 24, background: '#fff', minHeight: 280 }}>
Content
</Content>
</Layout>
</Layout>
);
}
} ReactDOM.render(<SiderDemo />, document.getElementById('app'));
官方路由
学习地址:http://www.ruanyifeng.com/blog/2016/05/react_router.html?utm_source=tool.lu
官方github:https://github.com/ReactTraining/react-router
下载:$ npm install -S react-router
demo
const React =require('react');
const ReactDOM = require('react-dom');
import { Router, Route, hashHistory } from 'react-router'; let TeacherForm = React.createClass({
render()
{
return <form id='TeacherForm'>
<h2>教师登录</h2>
<div className='control-group input-append'>
<input type='text' name='nickname' id='nickname' data-required='true' /> <label for='nickname' className='add-on'><span className='icon-asterisk'></span> Nickname</label>
</div> <div className='control-group input-append'>
<input type='text' name='site' id='site' /> <label for='site' className='add-on'>Site</label>
</div> <div className='control-group input-append'>
<input type='text' name='age' id='age' data-required data-pattern='^[0-9]+$' /> <label for='age' className='add-on'><span className='icon-asterisk'></span> Age</label>
</div> <div className='btn-group'>
<button type='submit' className='btn btn-primary'>Send</button> <button type='reset' className='btn'>Reset</button>
</div>
</form>
}
}) let StudentForm = React.createClass({
render:function()
{
return <form id='StudentForm'>
<h2>学生登录</h2>
<div className='control-group input-append'>
<input type='text' name='nickname' id='nickname' data-required='true' /> <label for='nickname' className='add-on'><span className='icon-asterisk'></span> Nickname</label>
</div> <div className='control-group input-append'>
<input type='text' name='site' id='site' /> <label for='site' className='add-on'>Site</label>
</div> <div className='control-group input-append'>
<input type='text' name='age' id='age' data-required data-pattern='^[0-9]+$' /> <label for='age' className='add-on'><span className='icon-asterisk'></span> Age</label>
</div> <div className='btn-group'>
<button type='submit' className='btn btn-primary'>Send</button> <button type='reset' className='btn'>Reset</button>
</div>
</form>
}
}) ReactDOM.render((
<Router history={hashHistory}>
<Route path="/" component={StudentForm}/>
<Route path="t" component={TeacherForm}/>
<Route path="s" component={StudentForm}/>
</Router>
), document.getElementById('form'));
学习 React(jsx语法) + es2015 + babel + webpack的更多相关文章
- 2. React JSX语法及特点介绍
什么是JSX JSX 是一种类 XML 语言,全称是 JavaScript XML .React 可以不使用 JSX来编写组件,但是使用JSX可以让代码可读性更高.语义更清晰.对 Re ...
- React JSX语法说明
原文:http://my.oschina.net/leogao0816/blog/379487 什么是JSX? 在用React写组件的时候,通常会用到JSX语法,粗看上去,像是在Javascript代 ...
- React(JSX语法)-----JSX基本语法
JSX------HTML tags vs React Components: 1.To render a html tag,just use lower-case tag names in JSX; ...
- React(JSX语法)----动态UI
1.React honws how to bubble and capture events according to the spec,and events passed to your event ...
- React(JSX语法)----JSX拼写
注意:For DOM differences,such as the inline style attribute,check here. // bad: it displays "FIrs ...
- React(JSX语法)-----JSX属性
1. if you know all the propertities that you want to place on a component ahead of time,it is easy t ...
- 二、react开发环境配置与webpack入门
Webpack 模块打包工具(module bundler)功能: 将 CSS.图片与其他资源打包 打包之前预处理(Less.CoffeeScript.JSX.ES6 等)档案 依 entry 文件不 ...
- 22-React JSX语法
React JSX语法 JSX只是一个语法糖,每一个XML标签都会被JSX转换工具转换成纯Javascript代码,当然你想直接使用纯Javascript代码写也是可以的,只是利用JSX,组件的结构和 ...
- React 简单实例 (React-router + webpack + Antd )
React Demo Github 地址 经过React Native 的洗礼之后,写了这个 demo :React 是为了使前端的V层更具组件化,能更好的复用,同时可以让你从操作dom中解脱出来, ...
随机推荐
- cornerstone知识点
CornerStone使用教程(配置SVN,HTTP及svn简单使用) 发布时间:2015-01-02 19:54 作者:芳仔小脚印 来源:开源中国 CornerStone是Mac OS X ...
- KAOS模型
问题描述: 我们开发了一种针对时序数据的文件格式TSFile,本身不支持sql查询.为了让公司分析人员能够用SQL进行分析,并且应用一些机器学习算法进行预测,需要设计并实现一个TSFile与Spark ...
- GroupJoin和Join的声明及调用
public static IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult>(this IEnumerable& ...
- iOS支付宝支付总结
1.按照http://doc.open.alipay.com/doc2/detail?spm=0.0.0.0.SWdJgo&treeId=59&articleId=103676& ...
- C++开始前篇,深入编译链接
C++开始,为什么要写这个东西,因为按照课堂进度的话,现在的C++已经学到模板以及重载了,有时却仍然因为一些小问题无法解答,原因是忘记了开始时学到的知识,深知不能像猴子掰棒子一样,掰一个扔一个,因此, ...
- jQuery中width、innerWidth、outerWidth的区别
原文:摘自http://www.canaansky.com/blog/107/ 在css的盒子模型中,最内部是content area,然后是padding.border.margin 那么width ...
- *****linux下redis安装
我用的系统是:redhat [root@infa ~]# wget http://download.redis.io/releases/redis-2.8.12.tar.gz tar xzf redi ...
- 配置比对脚本(python)
# -*- coding: utf- -*- from datetime import * import MySQLdb import sys import time import datetime ...
- EXT.NET 使用总结(3)--动态图表
动态生成雷达图--Radar 效果图: aspx页面代码: <ext:Panel ID="ResultPanel" Border="true" runat ...
- UVALive 4728 Squares (平面最远点对)
题意:n个平行于坐标轴的正方形,求出最远点对的平方 题解:首先求出凸包,可以证明最远点对一定是凸包上的点对,接着可以证明最远点对(每个点的对踵点)一定只有3*n/2对 接着使用旋转卡壳找到最远点对,但 ...