博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[译]在 React.js 中使用 ES6+
阅读量:6958 次
发布时间:2019-06-27

本文共 4209 字,大约阅读时间需要 14 分钟。

原文地址:

babel.js

在今年对 Instagram Web 进行全新的设计的时候,我喜欢在写 React 组件的时候,用上一些 ES6+ 的新特性。请允许我列举这些能够改变你写 React 应用方式的新特性。比起以往,这些特性能够使你撸起码来更加容易、有趣!

类(Class)

使用 ES6+ 来编写 React 组件最明显的变化就是我们定义组件(类)的语法的方式。我们可以用定义一个继承了 React.Component 的ES6 类来代替原本使用 React.createClass 的来创建类的方式:

class Photo extends React.Component {  render() {    return {this.props.caption};  }}

我们可以发现这种写法使得定义组件的方式变得更加简洁:

// The ES5 wayvar Photo = React.createClass({  handleDoubleTap: function(e) { … },  render: function() { … },});// The ES6+ wayclass Photo extends React.Component {  handleDoubleTap(e) { … }  render() { … }}

这样我们可以少写一对圆括号、一个分号、每个方法的冒号和 function 关键字。

所有生命周期方法都可以采用这种方式来定义。 但是 componentWillMount 还可以用 constructor 来代替:

// The ES5 wayvar EmbedModal = React.createClass({  componentWillMount: function() { … },});// The ES6+ wayclass EmbedModal extends React.Component {  constructor(props) {    super(props);    // Operations usually carried out in componentWillMount go here  }}

属性初始化(property initializers)

在 ES6+ 类中,属性类型 prop type 和默认属性 default prop 可以通过类中的 static 来声明。同时,组件的初始状态( initial state )可以通过 ES7 的来完成:

// The ES5 wayvar 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,  },});// The ES6+ wayclass 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 指向的是类的实例,所以初始状态( initial state )可以通过 this.prop (即传入的参数)来设定。

箭头函数(Arrow function)

React.createClass 方法在你的组件上做了一些额外的绑定工作,以确保在组件实实例的方法内部, this 指向的是组件实例自身。

// Autobinding, brought to you by React.createClassvar PostInfo = React.createClass({  handleOptionsButtonClick: function(e) {    // Here, 'this' refers to the component instance.    this.setState({showOptionsModal: true});  },});

由于我们使用 ES6+ 的语法定义类的时候没有采用 React.createClass 的方式,所以,这样看来我们不得不手动来绑定这些方法中 this 的指向:

// Manually bind, wherever you need toclass 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 )和属性初始化( property initializers )这两个特性使得把函数的 this 指向绑定为组件的实例变得非常的简单:

class PostInfo extends React.Component {  handleOptionsButtonClick = (e) => {    this.setState({showOptionsModal: true});  }}

函数体内的 this 对象,绑定定义时所在的对象,而不是使用时所在的对象。而恰好属性初始化( property initializers )刚好在这个作用域内。

动态属性名 & 字符串模板

在 ES6+ 中对 对象字面量的扩展 使得我们可以在对象字面量中使用表达式来对属性命名。如果是在 ES5 中,我们也许只能这样做:

var Form = React.createClass({  onChange: function(inputName, e) {    var stateToSet = {};    stateToSet[inputName + 'Value'] = e.target.value;    this.setState(stateToSet);  },});

但是,在 ES6+ 中,我们不仅可以在对象字面量属性的定义中使用表达式,还有使用使用 字符串模板

class Form extends React.Component {  onChange(inputName, e) {    this.setState({      [`${inputName}Value`]: e.target.value,    });  }}

析构 & 扩展运算符

我们在编写组件的过程中,经常遇到要从父组件要把自己的很多属性多传给子组件的情况。有了 ES6+ 的 析构扩展运算符 特性,这变得非常的方便:

class AutoloadingPostsGrid extends React.Component {  render() {    var {      className,      ...others,  // contains all properties of this.props except for className    } = this.props;    return (      
); }}

我们可以把 扩展运算符 属性和普通的属性结合起来使用,这样使得我们可以利用优先级来使用属性的默认值和属性的覆盖。下面这个元素会获得一个 override 的类( class ),及时 this.props 中有传递 className 属性。

下面这种写法,可以给元素设定默认的 className

最后

我希望你能够享受 ES6+ 的这些特性给你在编写 React.js 中带来的好处。感谢我的同事他们为这篇文章作出的贡献,还有,特别的感谢 Babel 团队,使得我们可以随意的使用这些特性。

文章地址:

转载地址:http://yzqil.baihongyu.com/

你可能感兴趣的文章
OC Xcode 注释插件VVDocumenter-Xcode
查看>>
安装Windows7系统
查看>>
SElinux以及防火墙的关闭
查看>>
android中dip、dp、px、sp和屏幕密度
查看>>
MySQL 可以用localhost 连接,但不能用IP连接的问题
查看>>
linux学习(之二)-初识linux的一些常用命令
查看>>
linux基础系统管理---系统管理
查看>>
重启网络出现RTNETLINK answers: File exists问题解决
查看>>
清空微信浏览器缓存debug页面清除法
查看>>
组策略 之 正确理解STARTER GPO
查看>>
分布式搜索elasticsearch的5种分片查询优先级
查看>>
python + selenium 弹出Alert提示窗, 自动确认。python语法注意
查看>>
PHP htmlspecialchars和htmlspecialchars_decode(函数)
查看>>
adt-bundle-windows-x86 出现的问题
查看>>
VHD and BitLocker
查看>>
我的友情链接
查看>>
菊花新
查看>>
OpenCASCADE Conic to BSpline Curves-Circle
查看>>
cacti监控
查看>>
ocp 052最新题库分享 20180530 又一次变题
查看>>