React 组件 API

简介: 10月更文挑战第9天

React 组件 API 涉及多个重要的方面,包括生命周期方法、状态管理、属性传递和事件处理。

以下是 React 组件 API 的详细说明:

生命周期方法

React 组件的生命周期方法分为三个主要阶段:挂载、更新和卸载,详细说明参见:React 组件的生命周期

挂载阶段

  • constructor(props): 构造函数,用于初始化状态或绑定方法。
  • static getDerivedStateFromProps(props, state): 每次在调用 render 方法之前调用,用于更新状态。
  • componentDidMount(): 组件挂载后调用,此时可以进行 DOM 操作或数据请求。

实例

class MyComponent extends React.Component {

 constructor(props) {

   super(props);

   this.state = { count: 0 };

 }


 static getDerivedStateFromProps(nextProps, prevState) {

   if (nextProps.reset) {

     return { count: 0 };

   }

   return null;

 }


 componentDidMount() {

   console.log('Component mounted');

 }


 render() {

   return <div>{this.state.count}</div>;

 }

}

更新阶段

  • static getDerivedStateFromProps(props, state): 与挂载阶段相同,用于更新状态。
  • shouldComponentUpdate(nextProps, nextState): 返回布尔值,决定组件是否重新渲染。
  • render(): 渲染组件的 UI。
  • getSnapshotBeforeUpdate(prevProps, prevState): 在 DOM 更新之前调用,用于捕获一些信息(如滚动位置)。
  • componentDidUpdate(prevProps, prevState, snapshot): 在组件更新后调用。

实例

class MyComponent extends React.Component {

 shouldComponentUpdate(nextProps, nextState) {

   return nextState.count !== this.state.count;

 }


 getSnapshotBeforeUpdate(prevProps, prevState) {

   return { scrollPosition: window.scrollY };

 }


 componentDidUpdate(prevProps, prevState, snapshot) {

   if (snapshot) {

     window.scrollTo(0, snapshot.scrollPosition);

   }

   console.log('Component updated');

 }


 render() {

   return <div>{this.state.count}</div>;

 }

}

卸载阶段

  • componentWillUnmount(): 组件即将卸载时调用,用于清理资源(如定时器、事件监听等)。

实例

class MyComponent extends React.Component {

 componentWillUnmount() {

   console.log('Component will unmount');

 }


 render() {

   return <div>{this.state.count}</div>;

 }

}


状态管理

状态是一个组件内部的数据,使用 this.state 来定义和管理。通过 setState 方法更新状态。

实例

class MyComponent extends React.Component {

 constructor(props) {

   super(props);

   this.state = { count: 0 };

 }


 increment = () => {

   this.setState((prevState) => ({ count: prevState.count + 1 }));

 };


 render() {

   return (

     <div>

       <p>Count: {this.state.count}</p>

       <button onClick={this.increment}>Increment</button>

     </div>

   );

 }

}

属性传递

通过 this.props 访问传递给组件的属性,可以使用 PropTypes 进行类型检查。

实例

import PropTypes from 'prop-types';


class MyComponent extends React.Component {

 render() {

   return <div>{this.props.title}</div>;

 }

}


MyComponent.propTypes = {

 title: PropTypes.string.isRequired,

};


// 使用组件并传递属性

<MyComponent title="Hello, World!" />

事件处理

通过事件处理函数处理用户交互。需要使用 .bind(this) 或箭头函数来确保 this 指向正确。

实例

class MyComponent extends React.Component {

 handleClick = () => {

   console.log('Button clicked');

 };


 render() {

   return <button onClick={this.handleClick}>Click me</button>;

 }

}

条件渲染

通过条件语句控制组件的渲染。

实例

class MyComponent extends React.Component {

 constructor(props) {

   super(props);

   this.state = { isVisible: true };

 }


 toggleVisibility = () => {

   this.setState((prevState) => ({ isVisible: !prevState.isVisible }));

 };


 render() {

   return (

     <div>

       {this.state.isVisible && <p>This is visible</p>}

       <button onClick={this.toggleVisibility}>Toggle</button>

     </div>

   );

 }

}

列表渲染

通过数组的 map 方法渲染列表。

实例

class MyComponent extends React.Component {

 render() {

   const items = ['Item 1', 'Item 2', 'Item 3'];

   return (

     <ul>

       {items.map((item, index) => (

         <li key={index}>{item}</li>

       ))}

     </ul>

   );

 }

}

受控组件

通过状态控制表单元素的值。

实例

class MyComponent extends React.Component {

 constructor(props) {

   super(props);

   this.state = { value: '' };

 }


 handleChange = (event) => {

   this.setState({ value: event.target.value });

 };


 handleSubmit = (event) => {

   event.preventDefault();

   console.log('Submitted value:', this.state.value);

 };


 render() {

   return (

     <form onSubmit={this.handleSubmit}>

       <input type="text" value={this.state.value} onChange={this.handleChange} />

       <button type="submit">Submit</button>

     </form>

   );

 }

}


设置状态:setState

setState 是 React 中用于更新组件状态的方法。

语法格式如下:

setState(object nextState[, function callback])

参数说明

  • object nextState: 一个对象,包含要更新的状态键值对。React 会将这个对象合并到当前状态中。
  • function callback: 一个可选的回调函数,会在状态更新并重新渲染完成后执行。

合并 nextState 和当前 state,并重新渲染组件。

setState 是 React 事件处理函数中和请求回调函数中触发 UI 更新的主要方法。

关于setState

不能在组件内部通过 this.state 修改状态,因为该状态会在调用 setState() 后被替换。

setState() 并不会立即改变 this.state,而是创建一个即将处理的 state。setState() 并不一定是同步的,为了提升性能 React 会批量执行 state 和 DOM 渲染。

setState()总是会触发一次组件重绘,除非在 shouldComponentUpdate() 中实现了一些条件渲染逻辑。

通过合理使用 setState,可以有效地管理组件状态,并确保在状态更新后执行必要的操作,从而提高应用的响应性和可靠性。

React 实例

class Counter extends React.Component{  constructor(props) {      super(props);       this.state = {clickCount: 0};       this.handleClick = this.handleClick.bind(this);   }     handleClick() {    this.setState(function(state) {      return {clickCount: state.clickCount + 1};     });   }  render () {    return (<h2 onClick={this.handleClick}>点我!点击次数为: {this.state.clickCount}</h2>);   }}const root = ReactDOM.createRoot(document.getElementById("root"));root.render(  <Counter />);


尝试一下 »

实例中通过点击 h2 标签来使得点击计数器加 1。

目录
相关文章
|
2月前
|
JavaScript 前端开发 IDE
[译] 用 Typescript + Composition API 重构 Vue 3 组件
[译] 用 Typescript + Composition API 重构 Vue 3 组件
[译] 用 Typescript + Composition API 重构 Vue 3 组件
|
2月前
|
JavaScript 前端开发 API
[译] 用 Vue 3 Composition API 实现 React Context/Provider 模式
[译] 用 Vue 3 Composition API 实现 React Context/Provider 模式
|
5天前
|
JavaScript 前端开发 API
探索Vue.js 3的组合式API:一种更灵活的组件状态管理方式
【10月更文挑战第5天】探索Vue.js 3的组合式API:一种更灵活的组件状态管理方式
|
2月前
|
存储 JavaScript 前端开发
探索React状态管理:Redux的严格与功能、MobX的简洁与直观、Context API的原生与易用——详细对比及应用案例分析
【8月更文挑战第31天】在React开发中,状态管理对于构建大型应用至关重要。本文将探讨三种主流状态管理方案:Redux、MobX和Context API。Redux采用单一存储模型,提供预测性状态更新;MobX利用装饰器语法,使状态修改更直观;Context API则允许跨组件状态共享,无需第三方库。每种方案各具特色,适用于不同场景,选择合适的工具能让React应用更加高效有序。
52 0
|
2月前
|
开发者
告别繁琐代码,JSF标签库带你走进高效开发的新时代!
【8月更文挑战第31天】JSF(JavaServer Faces)标准标签库为页面开发提供了大量组件标签,如`&lt;h:inputText&gt;`、`&lt;h:dataTable&gt;`等,简化代码、提升效率并确保稳定性。本文通过示例展示如何使用这些标签实现常见功能,如创建登录表单和展示数据列表,帮助开发者更高效地进行Web应用开发。
37 0
|
2月前
|
容器 Kubernetes Docker
云原生JSF:在Kubernetes的星辰大海中,让JSF应用乘风破浪!
【8月更文挑战第31天】在本指南中,您将学会如何在Kubernetes上部署JavaServer Faces (JSF)应用,享受容器化带来的灵活性与可扩展性。文章详细介绍了从构建Docker镜像到配置Kubernetes部署全流程,涵盖Dockerfile编写、Kubernetes资源配置及应用验证。通过这些步骤,您的JSF应用将充分利用Kubernetes的优势,实现自动化管理和高效运行,开启Java Web开发的新篇章。
48 0
|
2月前
|
前端开发 JavaScript API
掌握React表单管理的高级技巧:探索Hooks和Context API如何协同工作以简化状态管理与组件通信
【8月更文挑战第31天】在React中管理复杂的表单状态曾是一大挑战,传统上我们可能会依赖如Redux等状态管理库。然而,React Hooks和Context API的引入提供了一种更简洁高效的解决方案。本文将详细介绍如何利用Hooks和Context API来优化React应用中的表单状态管理,通过自定义Hook `useForm` 和 `FormContext` 实现状态的轻松共享与更新,使代码更清晰且易于维护,为开发者带来更高效的开发体验。
40 0
|
2月前
|
前端开发 API 开发者
【React状态管理新思路】Context API入门:从零开始摆脱props钻孔的优雅之道,全面解析与实战案例分享!
【8月更文挑战第31天】React 的 Context API 有效解决了多级组件间状态传递的 &quot;props 钻孔&quot; 问题,使代码更简洁、易维护。本文通过电子商务网站登录状态管理案例,详细介绍了 Context API 的使用方法,包括创建、提供及消费 Context,以及处理多个 Context 的场景,适合各水平开发者学习与应用,提高开发效率和代码质量。
30 0
|
8天前
|
人工智能 自然语言处理 PyTorch
Text2Video Huggingface Pipeline 文生视频接口和文生视频论文API
文生视频是AI领域热点,很多文生视频的大模型都是基于 Huggingface的 diffusers的text to video的pipeline来开发。国内外也有非常多的优秀产品如Runway AI、Pika AI 、可灵King AI、通义千问、智谱的文生视频模型等等。为了方便调用,这篇博客也尝试了使用 PyPI的text2video的python库的Wrapper类进行调用,下面会给大家介绍一下Huggingface Text to Video Pipeline的调用方式以及使用通用的text2video的python库调用方式。
|
7天前
|
JSON JavaScript API
(API接口系列)商品详情数据封装接口json数据格式分析
在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦!