byt*_*ool 5 javascript android ios reactjs react-native
我是关于Facebook ReactJS和React-native的初学者,因此我在一个教程的帮助下开始编码,该教程展示了 如何在Android和iOS之间共享代码。
在本教程的稍后部分,将实现一个按钮,该按钮可切换状态。不幸的是,这是用mixin制作的。我想用HOC组件来做。
原始混入
export default {
getInitialState() {
return {
pressed: false
}
},
handlePress() {
this.setState({pressed: !this.state.pressed});
}
}
Run Code Online (Sandbox Code Playgroud)
上述mixin的原始呼叫
{ ...
render() {
const buttonStyle = [styles.button];
if (this.state.pressed) buttonStyle.push(styles.buttonPress);
return (
<TouchableOpacity onPress={this.handlePress.bind(this)} style={buttonStyle}>
<Text style={styles.text}>{this.props.text}</Text>
</TouchableOpacity>
)
}
}
reactMixin.onClass(Button, ButtonCommon);
export default Button;
Run Code Online (Sandbox Code Playgroud)
我的HOC
export var ButtonComp = (ComposedComponent) => class extends Component {
constructor(props) {
super(props);
this.state = {pressed: false};
}
handlePress() {
this.setState({pressed: !this.state.pressed});
}
render() {
return <ComposedComponent {...this.props} data={this.state.pressed} />;
}
};
Run Code Online (Sandbox Code Playgroud)
我的HOC用法
import { ButtonComp } from './button.common';
class Button extends Component {
render() {
const buttonStyle = [styles.button];
if (this.props.data) buttonStyle.push(styles.buttonPress);
return (
<TouchableOpacity onPress={this.handlePress.bind(this)} style={buttonStyle}>
<Text style={styles.text}>{this.props.text}</Text>
</TouchableOpacity>
)
}
}
export default ButtonComp(Button); // Enhanced component
Run Code Online (Sandbox Code Playgroud)
当我执行以上代码时,出现以下错误(当this.handle的调用发生时,因此在TouchableOpacity标记中):
未定义不是对象(评估“ this.handlePress.bind”)
那我在做什么错?HOC是否仅传递数据,而不传递功能?谢谢您的帮助!
HOC无法做到这一点。但是,如果要从包装组件中调用HOC中可用的函数this,则必须将其传递给props:
export var ButtonComp = (ComposedComponent) => class extends Component {
constructor(props) {
super(props);
this.state = {pressed: false};
this.handlePress = this.handlePress.bind(this);
}
handlePress() {
this.setState({pressed: !this.state.pressed});
}
render() {
return <ComposedComponent {...this.props} handlePress={this.handlePress} data={this.state.pressed} />;
}
};
class Button extends Component {
render() {
const buttonStyle = [styles.button];
if (this.pressed) buttonStyle.push(styles.buttonPress);
return (
<TouchableOpacity onPress={this.props.handlePress} style={buttonStyle}>
<Text style={styles.text}>{this.props.text}</Text>
</TouchableOpacity>
)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2356 次 |
| 最近记录: |