
FC(Functon Component) 表示函数组件,使用FC定义的组件是一个纯函数,接收props作为参数,返回JSX元素。FC是在typescript中使用的类型定义,用于为函数组件提供类型检查和只能提示
使用场景
PureComponent 是 React 提供的一个基类,用于定义纯组件;继承自PureComonent的组件会自动实现shouldComponentUpdate方法。对props和state进行浅比较,如果props和state没有变化则不重新渲染。
使用场景
import React, { PureComponent } from 'react';
class MyComponent extends PureComponent {
render() {
return (
<div>
<h1>Hello, {this.props.name}!</h1>
<p>Count: {this.props.count}</p>
</div>
);
}
}
class App extends PureComponent {
state = {
name: 'John',
count: 0,
};
incrementCount = () => {
this.setState((prevState) => ({
count: prevState.count + 1,
}));
};
render() {
return (
<div>
<MyComponent name={this.state.name} count={this.state.count} />
<button onClick={this.incrementCount}>Increment Count</button>
</div>
);
}
}
export default App;React.memo 是React提供的一个高阶组件(Higher-Order Component),用于优化函数组件的性能。它的作用是对函数组件进行浅比较(Shallow comparison),如果props没有变化则不重新渲染。
应用场景
示例:
import React, { memo } from 'react';
const MyComponent = memo(function MyComponent(props) {
console.log('MyComponent rendered');
return <div>{props.name}</div>;
})
function ParentComponent() {
const [count, setCount] = useState(0);
return (
<div>
<button onClick={() => setCount(count + 1)}>Increment</button>
<MyComponent name="John" />
</div>
)
}在上面的示例中,MyComponent 是一个函数组件,使用 React.memo 进行了优化。当 ParentComponent 的 count 状态发生变化时,会触发 ParentComponent 的重新渲染。但是,由于 MyComponent 的 props name 没有发生变化,因此 MyComponent 不会重新渲染,控制台不会输出 "MyComponent rendered"
需要注意的是,React.memo 只对 props 进行浅比较,如果 props 中包含复杂对象或数组,即使它们的内容发生了变化,但引用没有变化,React.memo 也会认为 props 没有变化,从而跳过重新渲染。在这种情况下,可以结合使用 useMemo 或 useCallback 来优化复杂对象或函数的创建和传递
示例:
import React, { memo, useMemo, useCallback } from 'react';
const MyComponent = memo(function MyComponent(props) {
console.log('MyComponent rendered');
return <div>{props.data.name}</div>;
})
function ParentComponent() {
const [count, setCount] = useState(0);
const data = useMemo(() => {
return {
name: 'John'
}
}, [])
const handleClick = useCallback(() => {
console.log('Button clicked');
}, [])
return (
<div>
<button onClick={() => setCount(count + 1)}>Increment</button>
<MyComponent data={data} onClick={handleClick} />
</div>
)
}在上面的示例中:
// 优化列表渲染
import React, { memo, useMemo } from 'react';
const ListItem = memo(function ListItem({item}) {
console.log('ListItem rendered');
return <li>{item.name}</li>;
})
function MyList({ data }) {
const memoizedData = useMemo(() => {
return data;
}, [data])
return (
<div>
{memoizedData.map(item => (
<ListItem key={item.id} item={item} />
))}
</div>
)
}
function ParentComponent() {
const [count, setCount] = useState(0);
const data = [
{ id: 1, name: 'Item 1' },
{ id: 2, name: 'Item 2' },
{ id: 3, name: 'Item 3' },
]
return (
<div>
<button onClick={() => setCount(count + 1)}>Increment</button>
<MyList data={data} />
</div>
)
}