如何获取另一个文件中组件的状态

时间:2018-11-16 21:24:16

标签: javascript react-native

我已经尝试了一段时间,但是我似乎不太了解如何做到这一点。
我的屏幕本质上是一种表单,但是所有组件都位于不同的文件中(通常)。而我无法掌握的(并且我已经在网上搜索了诸如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中,所以我不知道如何访问那些组件的状态。 如何访问从另一个文件夹导入的组件的状态?

1 个答案:

答案 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之类的东西进行沟通,而不是进行管理。此外,如果您这样做的话,我将把真理的源头放在父母身上,而不是在孩子身上,并相应地传递值。