📅  最后修改于: 2023-12-03 15:07:24.561000             🧑  作者: Mango
React是一个开源的JavaScript库,广泛用于构建用户界面。它是一个组件化的库,允许你将UI拆分成独立的可重用部分。React使用一种称为JSX的语法来创建组件,并在底层使用JavaScript将其呈现在浏览器中。
React的核心概念是组件。组件是可重用、自包含的UI部件,拥有自己的状态和生命周期方法。在React中,组件可以是函数式组件或类组件,两者都可以接收属性并在呈现时返回表示UI的元素。
函数式组件是一种简单的组件类型,它基本上只是接收属性并返回UI元素。这些组件通常用于表示静态UI,因为它们没有状态或生命周期方法。
function HelloWorld(props) {
return (
<div>
Hello {props.name}!
</div>
);
}
类组件是一种更复杂的组件类型,它允许你定义状态和生命周期方法。类组件是一个ES6类,它扩展了React.Component类并实现了render()方法,这个方法返回表示UI的元素。
class Counter extends React.Component {
constructor(props) {
super(props);
this.state = { count: 0 };
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
this.setState({ count: this.state.count + 1 });
}
render() {
return (
<div>
Count: {this.state.count}
<button onClick={this.handleClick}>Increment</button>
</div>
);
}
}
属性(props)是React组件的一种数据源。它们是由父组件传递给子组件的JavaScript对象,这些属性可以在组件内部使用。
function Greeting(props) {
return <div>Hello, {props.name}!</div>;
}
ReactDOM.render(
<Greeting name="John" />,
document.getElementById('root')
);
在这个例子中,我们创建了一个Greeting组件,并将name属性设置为"John"。当组件被呈现时,它将显示"Hello, John!"。组件可以访问它们的属性作为props对象的属性。
状态(state)是组件的另一种数据源。状态是一个JavaScript对象,它存储了组件内部的数据,并且可以在组件生命周期中进行更改。当状态更新时,React会重新呈现组件。
class Clock extends React.Component {
constructor(props) {
super(props);
this.state = { date: new Date() };
}
componentDidMount() {
this.timerID = setInterval(
() => this.tick(),
1000
);
}
componentWillUnmount() {
clearInterval(this.timerID);
}
tick() {
this.setState({
date: new Date()
});
}
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
}
在这个例子中,我们创建了一个Clock组件,它有一个名为date的状态。当组件挂载时,我们启动一个计时器并在每秒更新日期状态。当组件卸载时,我们清除计时器以防止内存泄漏。
React组件有几个生命周期方法,这些方法在组件挂载、卸载、更新时触发。生命周期方法允许你在组件不同状态下执行相应的操作,例如获取远程数据或进行一些清理工作。
class Hello extends React.Component {
constructor(props) {
super(props);
console.log('constructor');
}
render() {
console.log('render');
return (
<div>Hello, {this.props.name}</div>
);
}
componentDidMount() {
console.log('componentDidMount');
}
}
ReactDOM.render(
<Hello name="React" />,
document.getElementById('root')
);
在这个例子中,我们创建了一个Hello组件,并在每个挂载生命周期方法中打印一些信息。当组件被首次创建时,constructor方法将被调用,然后会呈现render方法。最终,componentDidMount方法将在HTML代码生成后立即调用。
class Counter extends React.Component {
constructor(props) {
super(props);
this.state = { count: 0 };
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
this.setState({ count: this.state.count + 1 });
}
shouldComponentUpdate(nextProps, nextState) {
console.log('shouldComponentUpdate', nextProps, nextState);
return true;
}
componentDidUpdate(prevProps, prevState) {
console.log('componentDidUpdate', prevProps, prevState);
}
render() {
console.log('render');
return (
<div>
Count: {this.state.count}
<button onClick={this.handleClick}>Increment</button>
</div>
);
}
}
ReactDOM.render(
<Counter />,
document.getElementById('root')
);
在这个例子中,我们创建了一个Counter组件,并在每个更新生命周期方法中打印一些信息。组件的shouldComponentUpdate方法将在每次更新之前调用,它将作为接收当前属性和状态和下一个属性和状态的参数,并返回一个布尔值以指示组件是否应该更新。如果shouldComponentUpdate返回false,则组件的render和componentDidUpdate方法将不会被调用。
class Hello extends React.Component {
constructor(props) {
super(props);
this.state = { name: props.name };
}
componentDidMount() {
this.timerID = setInterval(
() => this.tick(),
1000
);
}
componentWillUnmount() {
clearInterval(this.timerID);
}
tick() {
this.setState({ name: 'React' });
}
render() {
return (
<div>Hello, {this.state.name}!</div>
);
}
}
ReactDOM.render(
<Hello name="World" />,
document.getElementById('root')
);
在这个例子中,我们创建了一个Hello组件,在其中启动了一个定时器来定期更新它的状态。当组件卸载时,我们清除计时器以防止内存泄漏。
React是一个强大的JavaScript库,它允许你构建可重用的、独立的UI组件。通过使用组件、属性和状态,以及管理生命周期方法,React使构建复杂UI变得更加容易。无论你是正在创建一个小型应用程序还是一个大型Web应用程序,React都是一个值得学习的库。