开启生长之旅!这是我参加「日新方案 12 月更文应战」的第15天,点击检查活动概况
不运用 ES6
但是,在纯浏览器端运用ES6语法时,浏览器支撑存在差异,这需求特别处理才干正常运转。
支撑ES2015桌面浏览器
Chrome:从51版开端,它能够支撑ES6 97%的新功能。
Firefox:53版别支撑97%的ES6新功能。
Safari:从版别10开端,ES6 99%的新功能都能够得到支撑。
IE:Edge 15能够支撑96%的ES6新功能。
Edge 14能够支撑93%的新ES6功能。(IE7~11基本不支撑ES6)
class Greeting extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
var createReactClass = require('create-react-class');
var Greeting = createReactClass({
render: function() {
return <h1>Hello, {this.props.name}</h1>;
}
});
绑定
关于运用ES6类关键字创立的React组件,组件中的办法遵循与惯例ES6类相同的语法规矩。这意味着这些办法不会主动将其绑定到此组件实例。需求显式调用。在结构函数中绑定(this):
class SayHello extends React.Component {
constructor(props) {
super(props);
this.state = {message: 'Hello!'};
// 这一行很重要!
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
alert(this.state.message);
}
render() {
// 因为 `this.handleClick` 已经绑定至实例,因而我们才能够用它来处理点击事情
return (
<button onClick={this.handleClick}>
Say hello
</button>
);
}
}
这意味着,假如运用ES6类关键字创立组件,则在处理事情回调时需求编写更多代码。但关于大型项目,这能够进步运营功率。
假如你认为上面的编写办法很庸俗,你能够测验运用Babel插件类特点,它依然处于试验阶段。
class SayHello extends React.Component {
constructor(props) {
super(props);
this.state = {message: 'Hello!'};
}
// 正告:这种语法还处于试验性阶段!
// 在这里运用箭头函数就能够把办法绑定给实例:
handleClick = () => {
alert(this.state.message);
}
render() {
return (
<button onClick={this.handleClick}>
Say hello
</button>
);
}
}
请注意,上述语法仍处于试验阶段,这意味着语法或许随时发生变化,最终或许不会包含在框架标准中。
为了安全起见,能够采用以下三种办法:
在结构函数中绑定办法。
运用箭头函数,例如onClick={(e)=>this.handleClick(e)}。
继续运用createReactClass。
var SetIntervalMixin = {
componentWillMount: function() {
this.intervals = [];
},
setInterval: function() {
this.intervals.push(setInterval.apply(null, arguments));
},
componentWillUnmount: function() {
this.intervals.forEach(clearInterval);
}
};
var createReactClass = require('create-react-class');
var TickTock = createReactClass({
mixins: [SetIntervalMixin], // 运用 mixin
getInitialState: function() {
return {seconds: 0};
},
componentDidMount: function() {
this.setInterval(this.tick, 1000); // 调用 mixin 上的办法
},
tick: function() {
this.setState({seconds: this.state.seconds + 1});
},
render: function() {
return (
<p>
React has been running for {this.state.seconds} seconds.
</p>
);
}
});
ReactDOM.render(
<TickTock />,
document.getElementById('example')
);
假如完全不同的组件具有类似的功能,这将导致“交叉重视”的问题。为了处理这个问题,当运用createReactClass创立React组件时,引入mixin函数将是一个很好的处理方案。
更常见的用法是组件定时更新。这个函数能够很容易地用setInterval()完成,但需求注意的是,当不再需求它时,应该铲除它以节省内存。React供给了一种生命周期办法,这样就能够知道何时创立或销毁了组件。让我们创立一个简单的mixin,它运用这些办法来供给一个简单setInterval()函数,该函数将在组件被损坏时主动清理。
class Greeting extends React.Component {
// ...
}
Greeting.defaultProps = {
name: 'Mary'
};
假如一个组件有多个mixin,并且在这些mixin中界说了相同的生命周期办法(例如,当一个组件被损坏时,几个mixin期望进行一些清理),则将调用这些生命周期办法。当运用mixin时,mixin将首要按照界说的顺序履行,然后调用组件上的相应办法。
JSX如何?
React不强制运用JSX。当不想在构建环境中装备JSX编译时,在React中不运用JSX会更方便。
每个JSX元素都简单地调用createElement的React Syntax sugar(component,props,…children)。因而,运用JSX能够做的任何事情都能够用纯JavaScript完成。
class Hello extends React.Component {
render() {
return <div>Hello {this.props.toWhat}</div>;
}
}
ReactDOM.render(
<Hello toWhat="World" />,
document.getElementById('root')
);
假如想了解更多JSX转换为JavaScript的示例,能够测验运用在线Babel编译器。
组件能够是字符串或React.component的子类。它也能够是正常功能。
假如不想键入React。createElement,通常会创立一个快捷方式:
const e = React.createElement;
ReactDOM.render(
e('div', null, 'Hello World'),
document.getElementById('root')
);
假如运用React,createElement的快捷方式几乎与运用React而不运用JSX相同方便。