Skip to main content

React菜鸟文档

用于构建用户界面的 JavaScript 库

Focus on What Matters

声明式

React可以轻松地创建交互式ui。为应用程序中的每个状态设计简单的视图,当数据发生变化时,React将有效地更新和呈现正确的组件。

声明性视图使您的代码更容易预测和调试。

Easy to Use

组件化

构建封装的组件来管理它们自己的状态,然后将它们组合成复杂的ui。

由于组件逻辑是用JavaScript而不是模板编写的,所以你可以很容易地在应用中传递数据,并将状态排除在DOM之外。

Powered by React

一次学习,随处写作

我们不会对你的其他技术栈做任何假设,所以你可以在React中开发新特性,而不需要重写现有的代码。

React也可以在服务器上使用Node和使用React Native的强大移动应用程序进行渲染。

简单组件

React 组件使用一个名为 render() 的方法,接收输入的数据并返回需要展示的内容。在示例中这种类似 XML 的写法被称为 JSX。被传入的数据可在组件中通过 this.propsrender() 访问。

使用 React 的时候也可以不使用 JSX 语法。尝试使用 Babel REPL,了解 JSX 被编译成原生 JavaScript 代码的步骤。

class HelloMessage extends React.Component {
constructor(props) {
super(props)
this.name = 'Tom'
}
render() {
return (
<div>
Hello {this.name}
</div>
)
}
}

有状态组件

除了使用外部数据(通过 this.props 访问)以外,组件还可以维护其内部的状态数据(通过 this.state 访问)。当组件的状态数据改变时,组件会再次调用 render() 方法重新渲染对应的标记。

class Timer extends React.Component {
constructor(props) {
super(props)
this.state = { seconds: 0 }
}
tick() {
this.setState(state => ({
seconds: state.seconds + 1
}))
}
componentDidMount() {
this.interval = setInterval(() => this.tick(), 1000)
}
componentWillUnmount() {
clearInterval(this.interval)
}
render() {
return (
<div>
秒钟: {this.state.seconds}
</div>
)
}
}

应用

使用 props 和 state,我们可以创建一个简易的 Todo 应用。在示例中,我们使用 state 来保存现有的待办事项列表及用户的输入。尽管事件处理器看似被内联地渲染,但它们其实只会被事件委托进行收集和调用。

class TodoApp extends React.Component {
constructor(props) {
super(props)
this.state = { items: [], text: '' }
this.handleChange = this.handleChange.bind(this)
this.handleSubmit = this.handleSubmit.bind(this)
}
render() {
return (
<div>
<h3>TODO</h3>
<TodoList items={this.state.items} />
<form onSubmit={this.handleSubmit}>
<label htmlFor="new-todo">
What needs to be done?
</label>
<input
id="new-todo"
onChange={this.handleChange}
value={this.state.text}
/>
<button>
Add #{this.state.items.length + 1}
</button>
</form>
</div>
)
}
handleChange(e) {
this.setState({ text: e.target.value })
}
handleSubmit(e) {
e.preventDefault()
if (this.state.text.length === 0) {
return
}
const newItem = {
text: this.state.text,
id: Date.now()
}
this.setState(state => ({
items: state.items.concat(newItem),
text: ''
}))
}
}

在组件中使用外部插件

React 允许你结合其他框架或库一起使用。示例中使用了一个名为 remarkable 的外部 Markdown 库。它可以实时转换 <textarea> 里的内容。

class MarkdownEditor extends React.Component {
constructor(props) {
super(props);
this.md = new Remarkable();
this.handleChange = this.handleChange.bind(this);
this.state = { value: 'Hello, **world**!' };
}
handleChange(e) {
this.setState({ value: e.target.value });
}
getRawMarkup() {
return { __html: this.md.render(this.state.value) };
}
render() {
return (
<div className="MarkdownEditor">
<h3>Input</h3>
<label htmlFor="markdown-content">
Enter some markdown
</label>
<textarea
id="markdown-content"
onChange={this.handleChange}
defaultValue={this.state.value}
/>
<h3>Output</h3>
<div
className="content"
dangerouslySetInnerHTML={this.getRawMarkup()}
/>
</div>
);
}
}