[英]How can I get “this” into scope in a ReactJS ES2015 async function?
[英]How to properly bind onChange callback to 'this' with ReactJS, Redux, and ES2015?
我正在学习ReactJS和Redux,我无法弄清楚如何在将onChange回调绑定到this
访问我的TextField实例。
(我在这个例子中使用了材料-ui ,但没有它我会遇到相同的问题)
import React, {Component} from 'react';
import { connect } from 'react-redux';
import { setDataValue } from './actions/data';
import TextField from 'material-ui/lib/text-field';
import Paper from 'material-ui/lib/paper';
export class DataInput extends Component {
constructor(props){
super(props);
}
handleTextChange() {
this.props.setDataValue(document.getElementById('myField').value);
}
render(){
return (
<Paper style={{
width: '300px',
margin: '10px',
padding: '10px'
}}>
<TextField
id='myField'
defaultValue={this.props.data.value}
onChange={this.handleTextChange.bind(this)} />
</Paper>
);
}
}
export default connect(
(state) => ({data: state.data}),
{setDataValue}
)(DataInput);
我通过在TextField上设置id
并使用document.getElementById('myField').value
访问其值来使用我觉得难看的解决方案(不可重用=>不是非常'组件友好document.getElementById('myField').value
我怎么能摆脱这个id
,并在我的回调中使用textFieldRef.value
东西来访问它?
我试过没有.bind(this)
,它允许我通过this
访问我的TextField实例,但我不能再访问我的this.props.setDataValue()
函数,因为this
没有绑定到我的类上下文。
谢谢 !
避免在React组件中使用类似document.getElementById
调用。 React已经设计用于优化昂贵的DOM调用,因此您通过执行此操作来对抗框架。 如果您想知道React中如何引用DOM节点,请在此处阅读文档。
但是,在这种情况下,您实际上并不需要引用。 在TextField
上放置ref(或ID)不一定有效。 您引用的是React元素,而不是DOM节点。
相反,请更好地使用onChange
回调。 传递给onChange
的函数使用event
参数调用。 您可以使用该参数来获取输入值。 (见React的事件系统 。)
您的事件处理程序应如下所示:
handleTextChange(event) {
this.props.setDataValue(event.target.value);
}
你的TextField
应如下所示:
<TextField
value={this.props.data.value}
onChange={event => this.handleTextChange(event)}
/>
注意: 使用值NOT defaultValue 。
使用状态和Redux是一种糟糕的风格。 所以这是代码的设计问题。
Redux旨在与功能组件一起使用,而不是类型组件。
我建议使用功能组件并将syntetic事件作为参数传递给onChange函数,如下所示:
const mapDispatchToProps = (dispatch) => {
return {
onChange: (value) => {
dispatch(changeAction(value))
}
}
然后在元素中使用这样的东西:
<input onChange={ (e) => onChange(e.target.value)}
您还可以传递元素自己的属性:
const mapDispatchToProps = (dispatch) => {
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.