ReactDOM.render
ReactDOM.render
是 React 的最基本方法,用于将模板转为 HTML 语言,并插入指定的 DOM 节点。
ReactDOM.render(
<h1>Hello, world!</h1>,
document.getElementById('example')
);
JSX
JSX, 是一种 JavaScript 的语法扩展。 我们推荐在 React 中使用 JSX。
使用 JSX, 可以在 JavaScript 中直接写 HTML,不加任何引号,它允许 HTML 与 JavaScript 的混写。
ReactDOM.render(
<div>
{
names.map(function (name) {
return <div>Hello, {name}!</div>
})
}
</div>,
document.getElementById('example')
);
上面代码体现了 JSX 的基本语法规则:遇到 HTML 标签(以 <>
开头),就用 HTML 规则解析。
遇到代码块(以 {}
开头),就用 JavaScript 规则解析。
JSX 允许直接在模板插入 JavaScript 变量。如果这个变量是一个数组,则会展开这个数组的所有成员:
var arr = [
<h1>Hello world!</h1>,
<h2>React is awesome</h2>,
];
ReactDOM.render(
<div>{arr}</div>,
document.getElementById('example')
);
组件
React 允许将代码封装成组件(component),然后像插入普通 HTML 标签一样,在网页中插入这个组件。
使用 class ComponentName extends React.Component
来创建一个组件类。
ps:在 v16.0之前,React 使用 React.createClass()
来创建组件类,现在已被弃用
class HelloMessage extends React.Component {
render() {
return <h1>Hello {this.props.name}</h1>;
}
}
ReactDOM.render(
<HelloMessage name="John" />,
document.getElementById('example')
);
上面代码中,变量 HelloMessage
就是一个组件类。模板插入 <HelloMessage />
时,会自动生成 HelloMessage
的一个实例。
所有组件类都必须有自己的 render
方法,用于输出组件。
注意,组件类的第一个字母必须大写,否则会报错。另外,组件类只能包含一个顶层标签,否则也会报错。
组件的用法与原生的 HTML 标签完全一致,可以任意加入属性,比如 <HelloMessage name="John">
,就是 HelloMessage
组件加入一个 name
属性,值为 John。
组件的属性可以在组件类的 this.props
对象上获取,比如 name
属性就可以通过 this.props.name
读取。
this.props.children
this.props
对象的属性与组件的属性一一对应,但是有一个例外,就是 this.props.children
属性。它表示组件的所有子节点。
class NotesList extends React.Component {
render() {
return (
<ol>
{
React.Children.map(this.props.children, function (child) {
return <li>{child}</li>;
})
}
</ol>
);
}
}
ReactDOM.render(
<NotesList>
<span>hello</span>
<span>world</span>
</NotesList>,
document.getElementById('example')
);
上面代码的 NoteList 组件有两个 span 子节点,它们都可以通过 this.props.children
读取。
这里需要注意,this.props.children
的值有三种可能:
-
如果当前组件没有子节点,它就是
undefined
-
如果有一个子节点,数据类型是
object
-
如果有多个子节点,数据类型就是
array
React 提供一个工具方法 React.Children
来处理 this.props.children
。我们可以用 React.Children.map
来遍历子节点,而不用担心 this.props.children
的数据类型是 undefined
还是 object
。
更多 React.Children
的用法见:官方文档
PropTypes
组件的属性可以接受任意值,字符串、对象、函数等等都可以。有时,我们需要一种机制,验证别人使用组件时,提供的参数是否符合要求。
var data = 123;
class MyTitle extends React.Component {
static propTypes = {
// 要求 title 参数是必须的,且为字符串
title: PropTypes.string.isRequired,
}
render() {
return <h1> {this.props.title} </h1>;
}
}
ReactDOM.render(
<MyTitle title={data} />,
document.getElementById('example')
);
上面的 Mytitle 组件有一个 title
属性。PropTypes
告诉 React,这个 title
属性是必须的,而且它的值必须是字符串。如果提供了错误的参数,会在控制台显示错误信息。
上例中,我们提供的是数字 123,控制台会显示错误信息:
Warning: Failed prop type: Invalid prop `title` of type `number` supplied to `MyTitle`, expected `string`.
in MyTitle
如果想给参数设定默认值,可以使用 defaultProps
:
class MyTitle extends React.Component {
static propTypes = {
title: PropTypes.string.isRequired,
};
render() {
return <h1> {this.props.title} </h1>;
};
}
MyTitle.defaultProps = {
title: "Holle World!"
};
ReactDOM.render(
<MyTitle />,
document.getElementById('example')
);
未提供参数的时候就会使用默认值:Holle World!
更多 PropTypes 的用法见:官方文档
网友评论