ES6+ 开发 React 组件

简介: 在这里简要的说一下这些语言新特性对 React 应用的开发有什么影响,这些 ES6+ 特性使得 React 开发更简单更有趣。 类 迄今为止,最能体现我们使用 ES6+ 来编写 React 组件的就是我们选择使用类定义语法。

在这里简要的说一下这些语言新特性对 React 应用的开发有什么影响,这些 ES6+ 特性使得 React 开发更简单更有趣。

迄今为止,最能体现我们使用 ES6+ 来编写 React 组件的就是我们选择使用类定义语法。替代了使用 React.createClass 方法来定义一个组件,我们可以定义一个 bonafide ES6 类来扩展 React.Component:

?
1
2
3
4
5
class  Photo  extends  React.Component {
   render() {
     return  <img alt={ this .props.caption} src={ this .props.src} />;
   }
}

现在,你就会发现一个微妙的差异 —— 当使用定义类的时候语法更简洁:

?
1
2
3
4
5
// The ES5 way
var  Photo = React.createClass({
   handleDoubleTap:  function (e) { … },
   render:  function () { … },
});
?
1
2
3
4
5
// The ES6+ way
class  Photo  extends  React.Component {
   handleDoubleTap(e) { … }
   render() { … }
}

值得关注的是,我们去掉了两个括号和一个分号,每个方法声明我们省略了一个冒号,一个关键字和一个分号。

当使用新的类定义时,所有的生命周期方法至少有一个是符合你期望的。类的 constructor 现在假设 role 之前是通过 componentWillMount 填充的:

?
1
2
3
4
// The ES5 way
var  EmbedModal = React.createClass({
   componentWillMount:  function () { … },
});
?
1
2
3
4
5
6
7
// The ES6+ way
class  EmbedModal  extends  React.Component {
   constructor(props) {
     super (props);
     // Operations usually carried out in componentWillMount go here
   }
}

属性初始化程序

在 ES6+ 类的世界里,prop types 和 defaults live 在类自身作为静态属性。这些,在组件的初始化状态也是一样的,可以使用 ES7 property initializers 定义:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// The ES5 way
var  Video = React.createClass({
   getDefaultProps:  function () {
     return  {
       autoPlay:  false ,
       maxLoops: 10,
     };
   },
   getInitialState:  function () {
     return  {
       loopsRemaining:  this .props.maxLoops,
     };
   },
   propTypes: {
     autoPlay: React.PropTypes.bool.isRequired,
     maxLoops: React.PropTypes.number.isRequired,
     posterFrameSrc: React.PropTypes.string.isRequired,
     videoSrc: React.PropTypes.string.isRequired,
   },
});
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// The ES6+ way
class  Video  extends  React.Component {
   static  defaultProps = {
     autoPlay:  false ,
     maxLoops: 10,
   }
   static  propTypes = {
     autoPlay: React.PropTypes.bool.isRequired,
     maxLoops: React.PropTypes.number.isRequired,
     posterFrameSrc: React.PropTypes.string.isRequired,
     videoSrc: React.PropTypes.string.isRequired,
   }
   state = {
     loopsRemaining:  this .props.maxLoops,
   }
}

ES7 属性初始化程序操作内部类的 constructor,this 指向 construction 的类实例,所以初始化状态可以依赖于 this.props。值得关注的是,我们不再定义 prop 默认值和使用 getter 函数初始化状态对象。

Arrow 函数

React.createClass 方法用来在你的组件实例方法中执行一些额外的绑定工作,为了确保 this 关键字会指向组件实例: 

?
1
2
3
4
5
6
7
// Autobinding, brought to you by React.createClass
var  PostInfo = React.createClass({
   handleOptionsButtonClick:  function (e) {
     // Here, 'this' refers to the component instance.
     this .setState({showOptionsModal:  true });
   },
});

自从我们不参与 React.createClass 方法,而是使用 ES6+ 类语法定义组件,看似需要手动绑定实例方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
// Manually bind, wherever you need to
class  PostInfo  extends  React.Component {
   constructor(props) {
     super (props);
     // Manually bind this method to the component instance...
     this .handleOptionsButtonClick =  this .handleOptionsButtonClick.bind( this );
   }
   handleOptionsButtonClick(e) {
     // ...to ensure that 'this' refers to the component instance here.
     this .setState({showOptionsModal:  true });
   }
}

幸运的是,通过绑定两个 ES6+ 特性 – arrow functions 和属性初始化程序  – 可以选择绑定组件实例:

?
1
2
3
4
5
class  PostInfo  extends  React.Component {
   handleOptionsButtonClick = (e) => {
     this .setState({showOptionsModal:  true });
   }
}

ES6 的 arrow 函数体分享相同的词  this,用这来围绕他们的代码,这些可以达到我们预期的结果,也是 ES7 属性初始化程序在域内的方式。 Peek under the hood 来看看为什么能实现。

动态属性名称 & 模板字符串

其中一个对象常量增强是可以分配到一个派生属性名称。我们最初可能会像下面这样设置一些状态:

?
1
2
3
4
5
6
7
var  Form = React.createClass({
   onChange:  function (inputName, e) {
     var  stateToSet = {};
     stateToSet[inputName +  'Value' ] = e.target.value;
     this .setState(stateToSet);
   },
});

现在,我们有能力构造通过一个运行时 JavaScript 表达式确定属性名称的对象。这里,我们使用了一个模板字符串来确定哪个属性设置状态:

?
1
2
3
4
5
6
7
class  Form  extends  React.Component {
   onChange(inputName, e) {
     this .setState({
       [`${inputName}Value`]: e.target.value,
     });
   }
}

解构 & 传播属性

通常在编写组件的时候,我们可能想把大部分父组件的 props 传递给子组件,但不是所有。结合 ES6+ 解构和 JSX 传播属性,这个不需要多余的部分就能实现:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class AutoloadingPostsGrid extends React.Component {
   render() {
    var {
      className,
      ...others,   // contains all properties of this.props except for className
    } = this .props;
    return (
      <div className={className}>
        <PostsGrid {...others} />
        <button onClick={ this .handleLoadMoreClick}>Load more</button>
      </div>
    );
   }
}

我们可以结合 JSX 传播属性和常规属性,利用一个简单的优先原则实现 overrides 和 defaults。这个元素会要求 className “override” 甚至是在 this.props 存在 className 属性: 

?
1
2
3
<div {... this .props} className= "override" >
    … 
</div>

这个元素常规来说需要 className “base” ,除非 this.props 有 className 属性覆盖: 

?
1
2
3
<div className= "base"  {... this .props}>
    … 
</div>

希望大家能享受 ES6+ 语言特性给 React 开发带来的一些便利。

目录
相关文章
|
1月前
|
前端开发 JavaScript API
React开发需要了解的10个库
本文首发于微信公众号“前端徐徐”,介绍了React及其常用库。React是由Meta开发的JavaScript库,用于构建动态用户界面,广泛应用于Facebook、Instagram等知名网站。文章详细讲解了Axios、Formik、React Helmet、React-Redux、React Router DOM、Dotenv、ESLint、Storybook、Framer Motion和React Bootstrap等库的使用方法和应用场景,帮助开发者提升开发效率和代码质量。
115 4
React开发需要了解的10个库
|
8天前
|
前端开发 JavaScript 测试技术
React 分页组件 Pagination
本文介绍了如何在 React 中从零构建分页组件,涵盖基础概念、常见问题及解决方案。通过示例代码详细讲解了分页按钮的创建、分页按钮过多、初始加载慢、状态管理混乱等常见问题的解决方法,以及如何避免边界条件、性能优化和用户反馈等方面的易错点。旨在帮助开发者更好地理解和掌握 React 分页组件的开发技巧,提升应用的性能和用户体验。
32 0
|
1月前
|
前端开发 开发者
React 函数组件与类组件对比
【10月更文挑战第4天】本文详细比较了React中的函数组件与类组件。函数组件是一种简单的组件形式,以纯函数的形式返回JSX,易于理解与维护,适用于简单的UI逻辑。类组件则是基于ES6类实现的,需要重写`render`方法并能利用更多生命周期方法进行状态管理。文章通过示例代码展示了两者在状态管理与生命周期管理上的差异,并讨论了常见的问题如状态更新异步性与生命周期管理的复杂性,最后给出了相应的解决方法。通过学习,开发者可以根据具体需求选择合适的组件类型。
55 8
|
1月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
163 2
|
12天前
|
移动开发 前端开发 API
React 拖拽组件 Drag & Drop
本文介绍了在 React 中实现拖拽功能的方法,包括使用原生 HTML5 Drag and Drop API 和第三方库 `react-dnd`。通过代码示例详细讲解了基本的拖拽实现、常见问题及易错点,帮助开发者更好地理解和应用拖拽功能。
41 9
|
7天前
|
前端开发 UED 开发者
React 分页组件 Pagination
本文介绍了如何在 React 中实现分页组件,从基础概念到常见问题及解决方案。分页组件用于将大量数据分成多个页面,提升用户体验。文章详细讲解了分页组件的基本结构、快速入门步骤、以及如何处理页面跳转不平滑、页码过多导致布局混乱、边界条件处理和数据加载延迟等问题。通过本文,读者可以全面了解并掌握 React 分页组件的开发技巧。
12 2
|
10天前
|
设计模式 前端开发 编译器
与普通组件相比,React 泛型组件有哪些优势?
与普通组件相比,React 泛型组件有哪些优势?
28 6
|
19天前
|
前端开发 JavaScript 安全
学习如何为 React 组件编写测试:
学习如何为 React 组件编写测试:
34 2
|
26天前
|
前端开发 JavaScript 测试技术
React 高阶组件 (HOC) 应用
【10月更文挑战第16天】高阶组件(HOC)是 React 中一种复用组件逻辑的方式,通过接受一个组件并返回新组件来实现。本文介绍了 HOC 的基础概念、核心功能和常见问题,包括静态方法丢失、ref 丢失、多个 HOC 组合和 props 冲突的解决方案,并提供了具体的 React 代码示例。通过本文,读者可以更好地理解和应用 HOC,提高代码的复用性和可维护性。
56 8
|
25天前
|
缓存 前端开发 JavaScript
前端serverless探索之组件单独部署时,利用rxjs实现业务状态与vue-react-angular等框架的响应式状态映射
本文深入探讨了如何将RxJS与Vue、React、Angular三大前端框架进行集成,通过抽象出辅助方法`useRx`和`pushPipe`,实现跨框架的状态管理。具体介绍了各框架的响应式机制,展示了如何将RxJS的Observable对象转化为框架的响应式数据,并通过示例代码演示了使用方法。此外,还讨论了全局状态源与WebComponent的部署优化,以及一些实践中的改进点。这些方法不仅简化了异步编程,还提升了代码的可读性和可维护性。

相关实验场景

更多