React Props 完整使用指南

news/2024/12/27 9:46:17/

React Props 完整使用指南

1. 类组件中的 Props

1.1 基本使用

// 父组件
class ParentComponent extends React.Component {render() {return (<ChildComponent name="John"age={25}isStudent={true}hobbies={['reading', 'swimming']}/>);}
}// 子组件
class ChildComponent extends React.Component {render() {const { name, age, isStudent, hobbies } = this.props;return (<div><h2>Name: {name}</h2><p>Age: {age}</p><p>Is Student: {isStudent ? 'Yes' : 'No'}</p><ul>{hobbies.map(hobby => (<li key={hobby}>{hobby}</li>))}</ul></div>);}
}

1.2 默认 Props

class Welcome extends React.Component {render() {return <h1>Hello, {this.props.name}</h1>;}
}Welcome.defaultProps = {name: 'Guest'
};// 或者使用静态属性
class Welcome extends React.Component {static defaultProps = {name: 'Guest'};render() {return <h1>Hello, {this.props.name}</h1>;}
}

1.3 Props 类型检查

import PropTypes from 'prop-types';class User extends React.Component {render() {return (<div><h1>{this.props.name}</h1><p>Age: {this.props.age}</p></div>);}
}User.propTypes = {name: PropTypes.string.isRequired,age: PropTypes.number,email: PropTypes.string,friends: PropTypes.arrayOf(PropTypes.string),address: PropTypes.shape({street: PropTypes.string,city: PropTypes.string})
};

1.4 Props 作为方法传递

class ParentComponent extends React.Component {handleClick = (data) => {console.log('Clicked:', data);}render() {return <ChildComponent onClick={this.handleClick} />;}
}class ChildComponent extends React.Component {render() {return (<button onClick={() => this.props.onClick('Hello')}>Click me</button>);}
}

2. 函数组件中的 Props

2.1 基本使用

// 解构方式接收 props
function Welcome({ name, age }) {return (<div><h1>Hello, {name}</h1><p>Age: {age}</p></div>);
}// 直接接收 props 对象
function Welcome(props) {return (<div><h1>Hello, {props.name}</h1><p>Age: {props.age}</p></div>);
}// 使用组件
function App() {return <Welcome name="John" age={25} />;
}

2.2 默认 Props

// 使用默认参数
function Welcome({ name = 'Guest' }) {return <h1>Hello, {name}</h1>;
}// 或者使用 defaultProps
function Welcome(props) {return <h1>Hello, {props.name}</h1>;
}Welcome.defaultProps = {name: 'Guest'
};

2.3 Props 类型检查

import PropTypes from 'prop-types';function User({ name, age, email, friends, address }) {return (<div><h1>{name}</h1><p>Age: {age}</p><p>Email: {email}</p><ul>{friends.map(friend => (<li key={friend}>{friend}</li>))}</ul><p>Address: {address.street}, {address.city}</p></div>);
}User.propTypes = {name: PropTypes.string.isRequired,age: PropTypes.number,email: PropTypes.string,friends: PropTypes.arrayOf(PropTypes.string),address: PropTypes.shape({street: PropTypes.string,city: PropTypes.string})
};

2.4 Props 作为回调函数

function ParentComponent() {const handleClick = (data) => {console.log('Clicked:', data);};return <ChildComponent onClick={handleClick} />;
}function ChildComponent({ onClick }) {return (<button onClick={() => onClick('Hello')}>Click me</button>);
}

3. Props 高级用法

3.1 Children Props

// 类组件
class Container extends React.Component {render() {return (<div className="container">{this.props.children}</div>);}
}// 函数组件
function Container({ children }) {return (<div className="container">{children}</div>);
}// 使用
function App() {return (<Container><h1>Title</h1><p>Content</p></Container>);
}

3.2 Render Props

class MouseTracker extends React.Component {state = { x: 0, y: 0 };handleMouseMove = (event) => {this.setState({x: event.clientX,y: event.clientY});};render() {return (<div onMouseMove={this.handleMouseMove}>{this.props.render(this.state)}</div>);}
}// 使用
function App() {return (<MouseTrackerrender={({ x, y }) => (<h1>鼠标位置: {x}, {y}</h1>)}/>);
}

3.3 Props 转发

// 使用 React.forwardRef
const FancyButton = React.forwardRef((props, ref) => (<button ref={ref} className="fancy-button">{props.children}</button>
));// 使用组件
function App() {const buttonRef = React.useRef();return <FancyButton ref={buttonRef}>Click me!</FancyButton>;
}

4. Props 最佳实践

4.1 命名约定

  • 使用驼峰命名法
  • 布尔值 props 使用 is/has 前缀
  • 事件处理函数使用 handle/on 前缀
function UserProfile({isActive,hasPermission,onNameChange,handleSubmit
}) {// ...
}

4.2 解构和默认值

function UserCard({name = 'Guest',age = 0,avatar = 'default.png',...otherProps
}) {return (<div {...otherProps}><img src={avatar} alt={name} /><h2>{name}</h2><p>Age: {age}</p></div>);
}

4.3 TypeScript 中的 Props

interface UserProps {name: string;age: number;email?: string;onUpdate: (id: number) => void;
}// 函数组件
function User({ name, age, email, onUpdate }: UserProps) {return (<div><h1>{name}</h1><p>Age: {age}</p>{email && <p>Email: {email}</p>}<button onClick={() => onUpdate(1)}>Update</button></div>);
}// 类组件
class User extends React.Component<UserProps> {render() {const { name, age, email, onUpdate } = this.props;return (<div><h1>{name}</h1><p>Age: {age}</p>{email && <p>Email: {email}</p>}<button onClick={() => onUpdate(1)}>Update</button></div>);}
}

5. 性能优化

5.1 React.memo

const MemoizedComponent = React.memo(function MyComponent(props) {// 只在 props 改变时重新渲染return (<div>{props.value}</div>);
});

5.2 shouldComponentUpdate

class OptimizedComponent extends React.Component {shouldComponentUpdate(nextProps) {return this.props.value !== nextProps.value;}render() {return <div>{this.props.value}</div>;}
}

6. 总结

Props 使用要点:

  1. 保持单向数据流
  2. 适当使用 PropTypes 或 TypeScript 进行类型检查
  3. 合理设置默认值
  4. 注意性能优化
  5. 遵循命名约定
  6. 使用解构提高代码可读性

选择类组件还是函数组件时考虑:

  1. 项目需求和复杂度
  2. 团队熟悉度
  3. 性能要求
  4. 代码可维护性
  5. 是否需要使用生命周期方法

http://www.ppmy.cn/news/1557783.html

相关文章

Pandas系列|第二期:Pandas中的数据结构

1.Pandas中的数据结构&#xff1a;Series和DataFrame Pandas 的主要数据结构是 Series &#xff08;一维数据&#xff09;与 DataFrame&#xff08;二维数据&#xff09;&#xff0c;这两种数据结构足以处理金融、统计、社会科学、工程等领域里的大多数典型用例。 Series 是一…

项目开发实践——基于SpringBoot+Vue3实现的在线考试系统(二)

文章目录 一、登录功能实现1、前端实现1.1 创建登录组件1.2 安装和配置Element Plus1.3 安装axios和调用后端接口2、后端实现2.1 创建数据表和准备数据2.2 配置MYSQL配置信息2.3 登录功能实现2.3.1 创建实体类2.3.2 创建登录服务接口及实现2.3.3 创建Mapper2.3.4 实现登录接口A…

VSCode 配置远程连接免密登录 插件

自我存档 远程连接免密登录 远程连接 在扩展界面搜remote ssh 安装完成后可以在侧边栏找到远程资源管理器 通过来添加或者点击打开ssh配置文件 点击的话以这种方式, 手动添加则按照相同格式输入即可 格式如下所示, Host后添加IP, User是登录ssh的用户, hostname是显示在…

宠物用品电子商务系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…

网易UU远程

网易UU远程&#xff08;原GameViewer远程&#xff09;是一款支持远程控制的软件&#xff0c;它允许用户通过手机、平板、电脑等设备远程控制电脑。软件提供了文件传输功能&#xff0c;用户可以通过这个功能实现远程下载文件。 能够打游戏&#xff01;&#xff01;&#xff01;

在FreeRTOS中动态创建任务,假如在最后一个参数写NULL,该任务有任务句柄吗

在 FreeRTOS 中&#xff0c;当你使用 xTaskCreate() 或其他类似函数动态创建任务时&#xff0c;最后一个参数是指向 TaskHandle_t 类型变量的指针。这个参数用于接收新创建任务的任务句柄&#xff08;task handle&#xff09;。如果你在这个参数中传递 NULL&#xff0c;那么你将…

使用docker compose安装gitlab

使用docker compose安装gitlab GitLab简介设置GITLAB_HOME路径创建docker挂载目录获取可用的GitLab版本编写docker-compose.yml文件启动docker基础配置GITLAB_OMNIBUS_CONFIG修改配置 中文设置数据库配置系统邮箱配置 GitLab简介 ‌GitLab是一个基于Git的开源项目&#xff0c;…

云手机方案全解析

助力账号注册登录 在 TikTok 账号注册及登录方面&#xff0c;云手机发挥着至关重要的作用。由于 TikTok 平台对网络环境要求严格&#xff0c;只有国外环境才能使用&#xff0c;云手机则能够通过模拟海外环境来解决这一难题&#xff0c;它可以依据代理设置直接生成相应的语言、定…