一个简单的react的例子
ReactDOM.render(
Hello, world!
,
document.getElementById('root')
);
它渲染了一个 “Hello, world!” 的标题。
React是一个JavaScript库
下面是一个JSX, 它是一种 JavaScript 的语法扩展,完全是在 JavaScript 内部实现的。
const element = Hello, world!
;
在 JSX 当中的表达式要包含在大括号里。
const element = (
Hello, {formatName(user)}!
);
在编译之后呢,JSX 其实会被转化为普通的 JavaScript 对象。
这也就意味着,你其实可以在 if
或者 for
语句里使用 JSX,将它赋值给变量,当作参数传入,作为返回值都可以:
function getGreeting(user) {
if (user) {
return Hello, {formatName(user)}!
;
}
return Hello, Stranger.
;
}
你可以使用引号来定义以字符串为值的属性:
const element = ;
也可以使用大括号来定义以 JavaScript 表达式为值的属性:
const element = ;
如果 JSX 标签是闭合式的,那么你需要在结尾处用 />
, 就好像 XML/HTML 一样:
const element = ;
JSX 标签同样可以相互嵌套:
const element = (
Hello!
Good to see you here.
);
你可以放心地在 JSX 当中使用用户输入:
const title = response.potentiallyMaliciousInput;
// 直接使用是安全的:
const element = {title}
;
React DOM 在渲染之前默认会 过滤 所有传入的值。它可以确保你的应用不会被注入攻击。所有的内容在渲染之前都被转换成了字符串。这样可以有效地防止 XSS(跨站脚本) 攻击。
Babel 转译器会把 JSX 转换成一个名为 React.createElement()
的方法调用。
下面两种代码的作用是完全相同的:
const element = (
Hello, world!
);
const element = React.createElement(
'h1',
{className: 'greeting'},
'Hello, world!'
);
React.createElement()
这个方法首先会进行一些避免bug的检查,之后会返回一个类似下面例子的对象:
// 注意: 以下示例是简化过的(不代表在 React 源码中是这样)
const element = {
type: 'h1',
props: {
className: 'greeting',
children: 'Hello, world'
}
};
这样的对象被称为 “React 元素”。它代表所有你在屏幕上看到的东西。React 通过读取这些对象来构建 DOM 并保持数据内容一致。
元素是构成 React 应用的最小单位。元素用来描述你在屏幕上看到的内容:
const element = Hello, world
;
首先我们在一个 HTML 页面中添加一个 在此 div 中的所有内容都将由 React DOM 来管理,所以我们将其称之为 “根” DOM 节点。 页面上会展示出 “Hello World” 字样。 更新界面的唯一办法是创建一个新的元素,然后将它传入 看一下这个计时器的例子: 这个示例通过 React DOM 首先会比较元素内容先后的不同,而在渲染过程中只会更新改变了的部分。 组件可以将UI切分成一些独立的、可复用的部件,这样你就只需专注于构建每一个单独的部件。 组件从概念上看就像是函数,它可以接收任意的输入值(称之为“props”),并返回一个需要在页面上展示的React元素。 函数定义组件 ES6 class 在前面,我们遇到的React元素都只是DOM标签: 然而,React元素也可以是用户自定义的组件: 当React遇到的元素是用户自定义的组件,它会将JSX属性作为单个对象传递给该组件,这个对象称之为“props”。 例如,这段代码会在页面上渲染出”Hello,Sara”: 我们来回顾一下在这个例子中发生了什么: 组件可以在它的输出中引用其它组件,这就可以让我们用同一组件来抽象出任意层次的细节。在React应用中,按钮、表单、对话框、整个屏幕的内容等,这些通常都被表示为组件。 例如,我们可以创建一个 你可以将组件切分为更小的组件,这没什么好担心的。 例如,来看看这个 简单的提取一下 无论是使用函数或是类来声明一个组件,它决不能修改它自己的props。来看这个 类似于上面的这种函数称为“纯函数”,它没有改变它自己的输入值,当传入的值相同时,总是会返回相同的结果。 所有的React组件必须像纯函数那样使用它们的props。id="root"
的 const element =
Hello, world
;
ReactDOM.render(element, document.getElementById('root'));
更新元素渲染
ReactDOM.render()
方法:function tick() {
const element = (
Hello, world!
It is {new Date().toLocaleTimeString()}.
setInterval()
方法,每秒钟调用一次 ReactDOM.render()
.React 只会更新必要的部分
4.组件 & Props
函数定义/类定义组件
function Welcome(props) {
return
Hello, {props.name}
;
}class Welcome extends React.Component {
render() {
return
Hello, {this.props.name}
;
}
}组件渲染
const element = ;
const element =
function Welcome(props) {
return
Hello, {props.name}
;
}
const element =
元素调用了ReactDOM.render()
方法。{name: 'Sara'}
作为props传入并调用Welcome
组件。Welcome
组件将
元素作为结果返回。Hello, Sara
。Hello, Sara
组合组件
App
组件,用来多次渲染Welcome
组件:function Welcome(props) {
return
Hello, {props.name}
;
}
function App() {
return (
提取组件
Comment
组件:function Comment(props) {
return (
function Comment(props) {
return (
Props的只读性
sum
函数:function sum(a, b) {
return a + b;
}