目录
在React中,有三种主要类型的组件:
1. 函数组件(Function Components):函数组件是使用函数定义的组件。它们接受输入参数(称为props),并返回一个React元素。函数组件没有自己的状态(state),也没有生命周期方法。它们通常用于描述无状态的、纯展示型的组件。
2. 类组件(Class Components):类组件是使用ES6类语法定义的组件。它们是React组件的一种常用形式,可以包含状态(state)和生命周期方法。类组件必须扩展`React.Component`类,并实现`render()`方法,该方法返回一个React元素。
3. 无状态函数组件(Stateless Functional Components):无状态函数组件是函数组件的一种特殊形式,它们没有内部状态(state)。这种组件类型的定义方式更简洁,只接收props并返回一个React元素。它们适用于纯展示型的简单组件。无状态函数组件在React 16.8版本之后引入的React Hooks之后变得更加常见和强大。
函数组件(Function Components)是React中定义组件的一种方式,它是一种纯粹的JavaScript函数。函数组件接收props作为参数,并返回一个React元素来描述组件的输出。
函数组件是一种简单、轻量级的组件形式,适用于无状态的、只根据输入props进行渲染的组件。它们没有自己的内部状态(state)和生命周期方法,也不使用this关键字。相比于类组件,函数组件的语法更简洁,代码量更少。
// 创建一个函数组件
const App = props => (
<div className="app-root">
<h1>欢迎学习react!!!</h1>
<p>这是一个react函数组件</p>
</div>
)
// 导出这个组件
export default App;
简洁性:函数组件的定义方式更简单,代码量更少,适用于简单的UI渲染,没有复杂的状态和生命周期要处理。
性能优化:由于函数组件没有内部状态和生命周期方法,它们在某些情况下可以比类组件更轻量级、更高效。
易于测试:函数组件是纯函数,只依赖于输入的props并返回输出,没有副作用。这使得它们更容易编写和测试。
如果需要在组件中使用内部状态、生命周期方法或其他React特性,或者需要进行复杂的逻辑处理,那么应该使用类组件。但是在React 16.8及以后的版本,可以使用Hooks API在函数组件中使用状态和其他React功能,使函数组件变得更强大和灵活。
类组件指的是在React中使用ES6 class语法来定义的组件。类组件通过扩展React.Component类来创建,可以包含内部状态(state)、生命周期方法和其他功能。
在类组件中,通过构造函数(constructor)来初始化内部状态,通过生命周期方法(componentDidMount、componentDidUpdate、componentWillUnmount等)来进行特定的操作(例如发起网络请求、订阅/取消订阅事件等),通过渲染方法(render)来返回一个React元素来描述组件的输出。
注意:组件名的首字母必须大写。这是为了和普通的html标签区别开
class Welcome extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0
};
}
componentDidMount() {
console.log("Component mounted.");
}
componentDidUpdate(prevProps, prevState) {
console.log("Component updated.");
}
componentWillUnmount() {
console.log("Component will unmount.");
}
render() {
return <h1>Hello, {this.props.name}!</h1>;
}
}
在上面的示例中,Welcome
是一个类组件。它扩展了React.Component
类,并定义了构造函数(constructor)、生命周期方法(componentDidMount、componentDidUpdate和componentWillUnmount)和渲染方法(render)
构造函数:在构造函数中,我们通过super(props)
调用父类的构造函数,然后初始化内部状态count
为0。
生命周期方法:在示例中,我们使用了几个常见的生命周期方法,包括componentDidMount
、componentDidUpdate
和componentWillUnmount
。这些方法可用于在组件的不同生命周期阶段执行特定的操作,例如发起网络请求、订阅/取消订阅事件等。
渲染方法:render
方法是必须的,它负责返回一个React元素来描述组件的输出。在示例中,render
方法返回一个包含问候语的标题元素(<h1>
)。
灵活性:类组件可以管理内部状态、处理生命周期、引入各种方法和功能,更适合处理复杂的逻辑和交互。
扩展性:类组件可以通过继承和复用来构建更复杂的组件层次结构。
有状态组件和无状态组件的主要区别在于是否管理内部状态和是否使用生命周期方法。
1. 有状态组件(Stateful Components):
2. 无状态组件(Stateless Components):
无状态组件相对于有状态组件具有以下优点:
总之,有状态组件适用于复杂的逻辑和交互,需要管理内部状态和使用生命周期方法。无状态组件适用于简单的UI呈现,不需要内部状态和生命周期方法。根据具体的应用场景和需求,可以选择合适的组件类型来开发。
{ /* 注意这里的两个花括号,第一个表示我们在要JSX里插入JS了,第二个是对象的花括号 */
}
<p style={{color:'#c00', fontSize:'14px'}}>这是一个react函数组件</p>
/* App.css */
.title {
background: #ff0;
}
// App.js
import "./App.css";
<div className="title">欢迎学习React!</div>
1. 下载aphrodite
npm install --save aphrodite
2. 在组件中使用
import { StyleSheet, css } from 'aphrodite';
// 创建一个函数组件
const App = props => (
<div>
<div className={css(styles.red)}>
这里的背景色是红色的
</div>
<div className={css(styles.hover)}>
鼠标移上变成红色背景
</div>
<div className={css(styles.small)}>
当浏览器的宽度小于等于600px的时候这里是红色的
</div>
<div className={css(styles.red, styles.blue)}>
这里的背景色是蓝色的
</div>
<div className={css(styles.blue, styles.small)}>
当浏览器的宽度小于等于600px的时候这里是红色的,否则就是蓝色的
</div>
</div>
)
// 定义css样式
const styles = StyleSheet.create({
red: {
backgroundColor: 'red'
},
blue: {
backgroundColor: 'blue'
},
hover: {
':hover': {
backgroundColor: 'red'
}
},
small: {
'@media (max-width: 600px)': {
backgroundColor: 'red',
}
}
});
// 导出这个组件
export default App;
import Radium from 'radium';
// 创建一个函数组件
const App = props => (
<div>
<div style={ styles.red }>
这里的背景色是红色的
</div>
</div>
)
// 定义css样式
const styles = {
red: {
"color": "#c00"
}
}
export default Radium(App)
使用
// App.js
import { Component } from 'react';
import style from "./App.module.css"
class App extends Component {
render() {
return (
<div id="root" className={ style['app-root'] }>
App
</div>
)
}
}
export default App;
全局处理
:global('#root') {
background: #eee;
}