我将我的React类从ES5重构到ES6,现在当我单击一个按钮调用this.state.dispatch(logIn(this.state.logIn))
时,行开头的初始this
为空。太奇怪了。
这是我的课:
class Home extends Component {
constructor(props) {
super(props);
this.state = {
panelIsOpen: false,
registration: {},
login: {},
};
}
signUp() {
this.props.dispatch(signUp(this.state.registration));
this.setState({
registration: {},
});
}
logIn() {
debugger; // this is `null here`
this.props.dispatch(logIn(this.state.login));
this.setState({
login: {},
});
}
togglePanel(e) {
this.setState({ panelIsOpen: !this.state.panelIsOpen} );
}
render() {
const {elements} = this.props;
const {registration, login} = this.state;
return (
// some stuff
);
}
};
Home.propTypes = {
elements: React.PropTypes.array,
dispatch: React.PropTypes.func,
user: React.PropTypes.object,
};
const mapStateToProps = ({elements, auth}) => {
return {
elements: getElementsByKeyName(elements, 'visibleElements'),
user: getLoggedInUser(auth),
};
};
Home = DragDropContext(HTML5Backend)(Home);
export default connect(mapStateToProps)(Home);
单击登录按钮调用登录功能,但由于某种原因,this
为null
谢谢你看一下
这(并非双关语)与ES6中函数的绑定方式有关。如果将方法作为道具传递给另一个组件,则不能保证它运行的上下文是正确的上下文(除非先绑定它)。下面是一篇文章,内容很长,但很有趣:http://reactkungfu.com/2015/07/why-and-how-to-bind-methods-in-your-react-component-classes/
简而言之,您有两种选择:
>
(很常见/流行)在构造函数中将你的方法绑定到这个。您可能不需要绑定所有方法——这取决于它们的使用方式。
constructor(props) {
super(props);
this.state = {
panelIsOpen: false,
registration: {},
login: {},
};
this.signUp = this.signUp.bind(this);
this.signUp = this.logIn.bind(this);
this.togglePannel = this.togglePannel.bind(this);
}
将方法定义为箭头函数,它将为您将其绑定到当前范围-无需在构造函数中绑定它们:
class Home extends Component {
// ...
signUp = () => {
this.props.dispatch(signUp(this.state.registration));
this.setState({
registration: {},
});
}
// ...
}
React不会绑定添加到ES6类的方法的上下文,除非它们是标准React生命周期的一部分(componentWillReceiveProps
,componentDidMount
,等等)。
这意味着您需要手动绑定this
的值,用于您的SignUp
、logIn
和togglePanel
方法,或者将它们声明为继承父上下文的箭头函数。
1.
constructor(props) {
super(props);
this.signUp = this.signUp.bind(this);
this.logIn = this.logIn.bind(this);
this.togglePanel = this.togglePanel.bind(this);
this.state = {
panelIsOpen: false,
registration: {},
login: {},
}
或者
2.
signUp = () => {
this.props.dispatch(signUp(this.state.registration));
this.setState({
registration: {},
});
}
// the same for logIn and togglePanel
如需参考,请参阅文档。
我想从字符串中得到@后面的单词。“你好,我是@ayub,react的初学者”。要从@后面的字符串中获取该(ayub)。任何帮助。
我有一个简单的React代码,如下所示: 在addWG函数中,"this"的值始终为空。我知道我可以通过绑定它来解决这个问题,但我的问题是为什么它首先是空的。
我正在跟随一个关于Udemy的反应课程。现在我达到了我的代码的这一点 编译后,我遇到了这个错误消息,我不知道该怎么做或意思
问题内容: 我有以下ReactJS类: 但是我有以下错误: 我不明白 这是调用静态函数的好方法吗?我认为react正在使用静态进行某些操作,但我不知道该怎么做。 问题答案: 需要在类而非实例上访问静态方法。因此,在您的情况下,请使用: 但是,静态方法将无法访问-基于上面的代码示例,我不认为您希望该方法是静态的。 更多:ES6中的静态成员
为什么在派生类构造函数中调用超类构造函数时id的值为0?当创建子对象时,什么时候在堆中为该对象分配内存?在基类构造函数运行之后还是之前?
问题内容: 在我的React组件中,我有一个带有onSubmit函数的表单 由于某种原因,当我使用表单onSubmit时不在范围内。当我在构造函数中时,道具会正常注销。 当我是窗口对象时。如何获得react组件的范围? 问题答案: 这是更广泛的问题,因为与此类似的行为在使用其他组件事件(例如onClick,onChange,onSubmit)时会注意到 在文档中有关于此的注释: https://f