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
React 视频播放控制组件 Video Controls
本文深入探讨了如何使用React创建功能丰富的视频播放控制组件(Video Controls)。首先介绍了React与HTML5 `&lt;video&gt;` 标签的基础知识,展示了如何通过状态管理和事件处理实现自定义控件。接着分析了常见问题如视频加载失败、控件样式不一致、状态管理混乱和性能问题,并提供了相应的解决方案。最后通过完整代码案例详细解释了播放、暂停、进度条和音量控制的实现方法,帮助开发者在React中构建高质量的视频播放组件。
36 17
|
6天前
|
移动开发 前端开发 UED
React 音频预览组件:Audio Preview
本文介绍如何使用 React 构建音频预览组件,涵盖基础实现、常见问题及解决方案。通过 HTML5 `&lt;audio&gt;` 标签和 React 状态管理,实现播放控制。解决文件路径、浏览器兼容性等问题,并优化性能,避免状态不同步和内存泄漏,提升用户体验。
54 22
|
8天前
|
移动开发 前端开发 UED
React 音频播放器组件 Audio Player
本文介绍如何使用React创建功能丰富的音频播放器组件。基于HTML5 `&lt;audio&gt;` 标签,结合React的状态管理和事件处理,实现播放、暂停、进度和音量控制等功能。通过代码示例展示基本实现,并探讨常见问题如自动播放限制、进度条不更新、文件加载失败及多实例冲突的解决方案。同时,避免易错点如忽略生命周期管理、错误处理和性能优化,确保高效开发与良好用户体验。
62 23
|
10天前
|
缓存 前端开发 JavaScript
React 视频弹幕组件 Video Danmaku
本文介绍了如何在React中构建视频弹幕组件,提升用户观看体验和互动性。首先通过Create React App初始化项目,并集成`react-player`作为视频播放器。接着实现基本弹幕功能,包括评论的接收与显示,使用CSS动画实现滚动效果。针对常见问题如弹幕重叠、性能下降及同步问题,提供了随机化位置、分批加载和监听播放进度等解决方案。最后探讨了弹幕分类和特效等高级技巧,确保弹幕系统的高性能和良好用户体验。
52 23
|
11天前
|
移动开发 前端开发 JavaScript
React 视频播放控制组件 Video Controls
本文介绍了如何使用 React 构建视频播放控制组件(Video Controls),涵盖基本概念、创建步骤和常见问题解决。首先,通过 HTML5 `&lt;video&gt;` 标签和 React 组件化思想,实现播放/暂停按钮和进度条等基础功能。接着,详细讲解了初始化项目、构建 `VideoControls` 组件及与主应用的集成方法。最后,针对视频无法播放、控制器状态不同步、进度条卡顿和音量控制失效等问题提供了具体解决方案,并介绍了全屏播放和自定义样式等进阶功能。希望这些内容能帮助你在实际项目中更好地实现和优化视频播放功能。
83 40
|
25天前
|
存储 编解码 前端开发
React 视频上传组件 Video Upload
随着互联网的发展,视频内容在网站和应用中愈发重要。本文探讨如何使用React构建高效、可靠的视频上传组件,涵盖基础概念、常见问题及解决方案。通过React的虚拟DOM和组件化开发模式,实现文件选择、进度显示、格式验证等功能,并解决跨域请求、并发上传等易错点。提供完整代码案例,确保用户能顺畅上传视频。
128 92
|
26天前
|
移动开发 前端开发 JavaScript
React 视频播放器组件:Video Player
本文介绍了如何使用 React 和 HTML5 `&lt;video&gt;` 标签构建自定义视频播放器组件。首先,通过创建基础的 React 项目和 VideoPlayer 组件,实现了基本的播放、暂停功能。接着,探讨了常见问题如视频加载失败、控制条样式不一致、性能优化不足及状态管理混乱,并提供了相应的解决方案。最后,总结了构建高效视频播放器的关键要点,帮助开发者应对实际开发中的挑战。
110 27
|
27天前
|
前端开发 UED 索引
React 图片灯箱组件 Image Lightbox
图片灯箱组件是一种常见的Web交互模式,用户点击缩略图后弹出全屏窗口展示大图,并提供导航功能。本文介绍了基于React框架的图片灯箱组件开发,涵盖初始化状态管理、图片加载与预加载、键盘和鼠标事件处理等常见问题及解决方案。通过`useState`和`useEffect`钩子管理状态,使用懒加载和预加载优化性能,确保流畅的用户体验。代码案例展示了组件的基本功能实现,包括打开/关闭灯箱、切换图片及键盘操作。
127 80
|
28天前
|
存储 前端开发 索引
React 图片轮播组件 Image Carousel
本文介绍了如何使用React创建图片轮播组件。首先,解释了图片轮播的基本概念和组件结构,包括图片容器、导航按钮、指示器和自动播放功能。接着,通过代码示例详细说明了创建基本组件、添加自动播放、处理边界情况的步骤。还探讨了常见问题如状态更新不及时、内存泄漏和样式问题,并提供了解决方案。最后,介绍了进阶优化,如添加过渡效果、支持触摸事件和动态加载图片,帮助读者构建更完善的轮播组件。
52 16
|
29天前
|
前端开发 JavaScript API
React 图片放大组件 Image Zoom
本文介绍如何使用React创建图片放大组件(Image Zoom),提升用户体验。组件通过鼠标悬停或点击触发放大效果,利用`useState`管理状态,CSS实现视觉效果。常见问题包括图片失真、性能下降和移动端支持,分别可通过高质量图片源、优化事件处理和添加触摸事件解决。易错点涉及状态管理混乱、样式冲突和过多事件绑定,建议使用上下文API、CSS模块及优化事件绑定逻辑。高级功能扩展如多张图片支持和自定义放大区域进一步丰富了组件的实用性。
58 25