我已经尝试了一段时间,但是我似乎不太了解如何做到这一点。
我的屏幕本质上是一种表单,但是所有组件都位于不同的文件中(通常)。而我无法掌握的(并且我已经在网上搜索了诸如How to get state of custom react component from parent
之类的查询,并且我什么都想不出来)是如何获取组件的状态,而该状态更改功能位于另一个文件中。据我了解,react-native中没有DOM操作,因为我在网络上执行此操作的方式将是:
const stateValue = document.querySelector('#thingIWantToGetTheValueOf').value;
但是据我所知,您无法以原生方式做到这一点。下面是我正在使用的代码,然后将其简化为一个问题:
// SubmitReferralScreen.js
<PageTemplate headerText='New Referral' needsBackButton='true' navBar='true' needsFocus='Referrals'>
<KeyboardAvoidingView behavior='padding' style={styles.formContainer}>
<View style={styles.inputContainer}>
<GeneralInput autoFocus='true' labelText='Referral Name' type='default' placeholder='Full Name' />
<GeneralInput labelText='Phone Number' type='phone-pad' placeholder='(555) 123-4567' />
<Picker selectedValue={this.state.relationship} onValueChange={(itemValue, itemIndex) => this.setState({relationship: itemValue})} style={styles.picker}>
<Picker.Item label='Friend' value='friend' />
<Picker.Item label='Family Member' value='family' />
<Picker.Item label='Select' value='' />
<Picker.Item label='Co Worker' value='coworker' />
</Picker>
<GeneralInput labelText='Email' type='email-address' placeholder='email@shinesolar.com' />
</View>
<IconButton navigateTo='YayReferral' buttonText='Submit Referral' />
</KeyboardAvoidingView>
</PageTemplate>
// GeneralInput.js
export class GeneralInput extends React.Component {
constructor(props) {
super(props);
this.state = {
placeholder: this.props.placeholder,
inputValue: "",
inputting: false,
};
}
whenInputIsFocused() {
this.setState({placeholder: ""});
}
whenInputIsBlurred() {
if (this.state.inputValue === "") {
this.setState({placeholder: this.props.placeholder});
}
}
render() {
const autoFocus = this.props.autoFocus == 'true';
return(
<View style={styles.outerContainer}>
<Text style={styles.labelText}>{this.props.labelText}</Text>
<TextInput
autoCapitalize='none'
autoFocus={autoFocus}
onChangeText={(inputValue) => this.setState({inputValue})}
value={this.state.inputValue}
secureTextEntry={this.props.secureTextEntry}
onBlur={this.whenInputIsBlurred.bind(this)}
onFocus={this.whenInputIsFocused.bind(this)}
underlineColorAndroid="transparent"
keyboardType={this.props.type}
returnKeyType={this.props.returnKeyType}
placeholder={this.state.placeholder}
placeholderTextColor='rgba(255, 255, 255, 0.3)'
style={styles.inputStyles} />
</View>
);
}
}
在SubmitReferralScreen中,当按下该IconButton
时,我想收集所有GeneralInputs(和选择器)的值,如果它们通过了一些验证,则提交表单。但是,因为状态更改功能保存在GeneralInput.js中,所以我不知道如何访问那些组件的状态。
如何访问从另一个文件夹导入的组件的状态?
答案 0 :(得分:1)
要实现此目的,您需要在<GeneralInput>
组件中实现一个函数,该函数可以传回数据并在父级中设置有状态信息。
然后,您可以决定在哪里管理GeneralInput
的状态,在哪里(通过状态更改)将值传回给父级或由父级管理。{p>
此外,我相信您可以在现场使用ref并将其传递回去,但这并不是我建议的方式。
在您的父控制器中:
<GeneralInput
autoFocus='true'
labelText='Referral Name'
type='default'
placeholder='Full Name'
onChange={this.handleChange} //added line
/>
// class method outside of render
onChange = ({key, value}) => {
this.setState({key, value});
}
// GeneralInput.js
<TextInput
onChangeText={this.storeValue}
...
/>
//outside of render method
storeValue = (inputValue) => {
this.setState({inputValue})
this.props.onChange({key: 'myField', value: inputValue})
}
同样,我完全不建议这样做。自上而下的担忧意味着您需要将事情管理得更高,或者使用诸如mobx / redux之类的东西进行沟通,而不是进行管理。此外,如果您这样做的话,我将把真理的源头放在父母身上,而不是在孩子身上,并相应地传递值。