React_1
目录:
Hello World
示例html代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Hello React!</title>
<script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
<script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
<script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
</head>
<body>
<div id="example"></div>
<script type="text/babel">
ReactDOM.render(
<h1>Hello, world!</h1>,
document.getElementById('example')
);
</script>
</body>
</html>
这里引入了三个库
- react.min.js React的核心库
- react-dom.min.js 提供与DOM相关的功能
- babel.min.js Babel可以将ES6代码转为ES5代码,这样我们就能在目前不支持ES6浏览器上执行React代码。Babel内嵌了对JSX的支持。通过将Babel和babel-sublime包一同使用可以让源码的语法渲染上升到一个全新的水平。
ReactDOM.render(
<h1>Hello, world!</h1>,
document.getElementById('example')
);
以上代码将一个h1标题,插入id="example"节点中,这里使用了JSX,<script>
标签的type属性需要设置为text/babel
通过npm启动一个react项目
$ npm install -g cnpm --registry=https://registry.npm.taobao.org
$ npm config set registry https://registry.npm.taobao.org
$ cnpm install -g create-react-app
$ create-react-app my-app
$ cd my-app/
$ npm start
修改src/App.js
import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
class App extends Component {
render() {
return (
<div className="App">
<div className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<h2>whysdomain</h2>
</div>
<p className="App-intro">
你可以在 <code>src/App.js</code> 文件中修改。
</p>
</div>
);
}
}
export default App;
元素渲染
<div id="example"></div>
<script type="text/babel">
ReactDOM.render(
<h1>Hello, world!</h1>,
document.getElementById('example')
);
</script>
const element = <h1>Hello, world!</h1>;
就是React的元素,使用ReactDOM.render()完成渲染
react的元素是不可变的,更新就需要创建一个新的元素,然后传入到ReactDOM.render(),而在渲染的过程中ReactDOM会对比元素的变化,然后更新变化的部分
<div id="example"></div>
<script type="text/babel">
function tick() {
const element = (
<div>
<h1>Hello, world!</h1>
<h2>现在是 {new Date().toLocaleTimeString()}.</h2>
</div>
);
ReactDOM.render(
element,
document.getElementById('example')
);
}
setInterval(tick, 1000);
</script>
通过setInterval()方法,每秒钟调用一次ReactDOM.render()
也可以创建一个React.Component的ES6类,封装需要展示的元素,这里使用this.props替换props
class Clock extends React.Component {
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>现在是 {this.props.date.toLocaleTimeString()}.</h2>
</div>
);
}
}
function tick() {
ReactDOM.render(
<Clock date={new Date()} />,
document.getElementById('example')
);
}
setInterval(tick, 1000);
JSX简介
Jsx是一个js的语法扩展,可以很好的呈现交互的本质形式
优点是
- JSX执行更快,因为它在编译为JavaScript代码后进行了优化
- 它是类型安全的,在编译过程中就能发现错误,并默认会进行转义,防止注入
React认为渲染的逻辑本质上与其他UI逻辑内耦合,例如UI中绑定处理事件、在某些时刻状态发生变化时,需要通知到UI,以及在UI展示准备好的数据
JSX用来声明React的元素,和DOM不一样,只是普通对象,通过React渲染之后和浏览器的DOM内容一致
可以将JSX放到一个单独的js文件
helloworld_react.js
ReactDOM.render(
<h1>Hello, world!</h1>,
document.getElementById('example')
);
然后直接饮用js
<body>
<div id="example"></div>
<script type="text/babel" src="helloworld_react.js"></script>
</body>
JSX可以在花括号里写Js的表达式
ReactDOM.render(
<div>
<h1>{1+1}</h1>
</div>
,
document.getElementById('example')
);
或者
ReactDOM.render(
<div>
<h1>{i == 1 ? 'True!' : 'False'}</h1>
</div>
,
document.getElementById('example')
);
或者使用变量
const name = 'WHY';
const element = <h1>Hello, {name}</h1>;
ReactDOM.render(
element,
document.getElementById('root')
);
或者函数
function formatName(user) {
return user.firstName + ' ' + user.lastName;
}
const user = {
firstName: 'Harper',
lastName: 'Perez'
};
const element = (
<h1>
Hello, {formatName(user)}!
</h1>
);
ReactDOM.render(
element,
document.getElementById('root')
);
样式
var myStyle = {
fontSize: 100,
color: '#FF0000'
};
ReactDOM.render(
<h1 style = {myStyle}>whysdomain</h1>,
document.getElementById('example')
);
数组
var arr = [
<h1>whysdomain</h1>,
<h2>blog.whysdomain.com</h2>,
];
ReactDOM.render(
<div>{arr}</div>,
document.getElementById('example')
);
注释
ReactDOM.render(
<div>
<h1>whysdomain</h1>
{/*注释...*/}
</div>,
document.getElementById('example')
);
如果标签没有内容,可以用/>
来闭合标签
const element = <img src={user.avatarUrl} />;
JSX在表示对象的时候,Bable会把JSX转译为React.createElement()函数调用
const element = (
<h1 className="greeting">
Hello, world!
</h1>
);
和下边的代码一样
const element = React.createElement(
'h1',
{className: 'greeting'},
'Hello, world!'
);
React.createElement会做一些检查,然后转化为一个对象
// 注意:这是简化过的结构
const element = {
type: 'h1',
props: {
className: 'greeting',
children: 'Hello, world!'
}
};