试图弄清楚React的基础知识。
查看此页面上的第二个示例:https :
//facebook.github.io/react/
我看到tick()函数设置Timer类的状态,将前一个值加1。
class Timer extends React.Component {
constructor(props) {
super(props);
this.state = {secondsElapsed: 0};
}
tick() {
this.setState((prevState) => ({
secondsElapsed: prevState.secondsElapsed + 1
}));
}
componentDidMount() {
this.interval = setInterval(() => this.tick(), 1000);
}
componentWillUnmount() {
clearInterval(this.interval);
}
render() {
return (
<div>Seconds Elapsed: {this.state.secondsElapsed}</div>
);
}
}
ReactDOM.render(<Timer />, mountNode);
但是,当我尝试实现自己的简单Counter类时,它失败了,并且出现控制台错误,提示 无法读取未定义的setState属性。
class Counter extends React.Component {
constructor(props) {
super(props);
this.state = {count: 0};
}
increment(prevState) {
this.setState((prevState) => ({
count: prevState.count + 1
}));
}
render() {
return (
<div className="main">
<button onClick={this.increment}>{this.state.count}</button>
</div>
)
}
}
一些谷歌搜索显示我必须将其绑定到增量函数。但是,为什么在我看到的第一个示例中不需要这样做?我将代码复制到CodePen,并在React
15.3.1上运行良好,在该示例中找不到任何类似于绑定的内容。只有在构造函数中添加绑定代码后,示例中的内容才开始起作用。
class Counter extends React.Component {
constructor(props) {
super(props);
this.state = {count: 0};
// THIS ONE LINE FIXED THE ISSUE
this.increment = this.increment.bind(this);
}
increment(prevState) {
this.setState((prevState) => ({
count: prevState.count + 1
}));
}
render() {
return (
<div className="main">
<button onClick={this.increment}>{this.state.count}</button>
</div>
)
}
}
回答您的问题:第一个示例使用arrow functions
,它会自动执行上下文绑定。从文档:
箭头函数不会创建自己的此上下文,因此它具有来自封闭上下文的原始含义。
实际上,React中有一些绑定方法:
1)您可以绑定构造函数中的所有函数,如您所说:
constructor(props) {
/* ... */
this.increment = this.increment.bind(this);
}
2)使用箭头函数调用回调:
<button onClick={(e) => this.increment(e)}>
3).bind
每次将其设置为回调时,都将其添加到方法引用的末尾,如下所示:
<button onClick={this.increment.bind(this)}>
4)在您的类中,使用箭头函数定义方法:
increment = (e) => {
/* your class function defined as ES6 arrow function */
}
/* ... */
<button onClick={this.increment}>
为了对babel使用此语法,您必须启用此插件或使用Stage-2预设。
问题内容: 我们都知道我们需要在React中绑定函数以使其起作用。我知道为什么我们需要绑定它。 但是我不确定为什么我们不需要绑定箭头功能。 示例:使用箭头功能(无需绑定) }; 现在,使用功能(需要绑定) }; 我不是在问为什么我们需要绑定功能。我只想知道为什么箭头功能不需要绑定。 谢谢。 问题答案: 仅仅因为arrow函数的上下文中没有以下内容: 这个 论点 超 新目标 所以,当你引用此箭头功能
问题内容: 我目前正在研究React JS和React Native 框架。在阅读关于Facebook的Flux和Redux实现的文章时,我遇到了Immutability或Immutable- JS库 。 问题是,为什么不变性如此重要?更改对象有什么问题?它不是使事情变得简单吗? 举个例子,让我们考虑一个简单的 新闻阅读器 应用程序,其打开屏幕是新闻标题的列表视图。 如果我设置说 最初 具有值 的
我目前正在研究React JS和React本机框架。在中途,当我读到Facebook的Flux和Redux实现时,我遇到了不变性或不变性JS库。 问题是,为什么不变性如此重要?变异对象有什么错?这不是让事情变得简单吗? 举个例子,让我们考虑一个简单的新闻阅读器应用程序,它的开头屏幕是新闻标题的列表视图。 如果我设置一个对象数组的值,我不能操作它。这就是不可变原则所说的,对吗?(如果我错了请纠正我。
问题内容: class SomeClass extends Component{ someEventHandler(event){ } render(){ return } } 我看到零件的不同版本。 版本有何不同?还是只是偏爱问题? 问题答案: 绑定不是特定于React的东西,而是在Javascript中的工作方式。每个函数/块都有其自己的上下文,对于函数而言,其功能更特定于其调用方式。当添加E
我看到不同版本的部分。
我的问题是关于StatefulNetworkWordCount的例子: https://github.com/apache/spark/blob/master/examples/src/main/scala/org/apache/spark/examples/streaming/StatefulNetworkWordCount.scala Q1)stateDstream RDD由驱动程序或工作节点