gpt4 book ai didi

reactjs - 如何在将React模块转换为ES6类时解决 `this`

转载 作者:行者123 更新时间:2023-12-03 13:25:37 27 4
gpt4 key购买 nike

我有一个在 ES5 中运行良好的 React 模块。我将其转换为 ES6 并使用 6to5 进行转换。一切都转换得很好,但当我尝试设置我的 props 时,出现运行时错误。当我放下 debugger 并查看 this 时,我发现 thisEventEmitter 而不是类。这是我的代码:

var React = require('react');

import CalendarStore from './../stores/calendar.store.js';

function getAppointments() {
return {appts: CalendarStore.getAppts()}
}

export default class extends React.Component{
constructor(props) {
super(props);
this.props = {
view: 'weeks'
}
}

changeView(child, view) {
this.setProps({view: view});
}

componentWillMount() {
CalendarStore.addChangeListener(this._onChange);
}

_onChange() {
this.setProps(getAppointments());
}

....
};

我遇到问题的地方是在我的 changeView 函数中。当它被转译时,它看起来像这样:

  _onChange: {
value: function _onChange() {
this.setProps(getAppointments());
},
writable: true,
configurable: true
}

同样,在该函数内,this 是我的 EventEmitter。有什么方法可以解决这个问题吗?

最佳答案

this.setProps 已弃用,请使用状态。它会在 0.13 中给你这个警告:

Warning: setProps(...) is deprecated in plain JavaScript React classes.

此外,es6 类方法不是自动绑定(bind)的,因此您需要手动绑定(bind)它。您可以使用 .bind(this) 或使用箭头函数。不过,对于外部发射器,您确实需要保留引用。

你可以去掉 _onChange:

this._calendarListener = e => this.setState({things: e});
CalendarStore.addChangeListener(this._calendarListener);

或者在构造函数中绑定(bind):

constructor(props){
...
this._onClick = this._onClick.bind(this);
}

不要忘记在componentWillUnmount中解绑事件:

componentWillUnmount(){
CalendarStore.removeChangeListener(this._onClick);
// or
CalendarStore.removeChangeListener(this._calendarListener);
}

添加事件监听器应该在 componentDidMount 中完成,而不是在 componentWillMount 中完成。该构造函数替换了 es6 类中的 componentWillMount。

这段代码非常糟糕......你正在覆盖 props react 集:

this.props = {
view: 'weeks'
}

只需将代码中所有出现的“props”替换为“state”,一切都会好起来的。另外,您可能想要商店的初始状态。

this.state = {
view: 'weeks',
things: CalendarStore.getAppts()
}
<小时/>

此外,createClass 不会很快消失,因此请随意继续使用它。它通常更简单。存储通常应该由 mixins 来处理,这对于 createClass 来说很简单,但在 es6 类中更难做到。我有一个小图书馆 mixins with react and es6 classes .

关于reactjs - 如何在将React模块转换为ES6类时解决 `this`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28344988/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com