React-Native:ScrollView,refs和自定义组件

时间:2016-02-04 00:43:39

标签: javascript react-native

我试图了解如何在React-Native中做两件事。

问题1:我有一个组件和另一个自定义组件,我需要在ScrollView中滚动。

问题在于,我太过新的反应原生,无法理解我的孩子的生活方式。组件我可以访问scrollview。注意:如果我不使用自定义组件并将所有内容放入MainView组件中,则代码可以正常工作。

以下是代码的基础知识:

class MainView extends React.Component{
  render() {
    return (
    <ScrollView ref='scrollView'>
      <MyCustomComponent />
    </ScrollView>
    )
  }
}


class MyCustomComponent extends React.Component{

  inputFocused(refName) {
    setTimeout(() => {
      let scrollResponder = this.refs.scrollView.getScrollResponder();
      scrollResponder.scrollResponderScrollNativeHandleToKeyboard(
        React.findNodeHandle(this.refs[refName]),
        110, //additionalOffset
        true
      );
    }, 50);
  }

  render() {
    return (
    <TextInput ref='fieldtitle'
      onFocus={this.inputFocused.bind(this, 'fieldtitle')}
      />

    )
  }

}

问题2:我怎样才能让我的孩子&#39; (MyCustomComponent)组件调用在父组件(MainView)上实现的方法。这样做的原因是我有一堆略有不同的&#39; MyCustomComponents&#39;而且我不想实现相同的样板代码来滚动所有这些代码。

2 个答案:

答案 0 :(得分:0)

问题2: 我使用的方法是将方法传递给子组件的props,并在需要时调用它。

答案 1 :(得分:0)

感谢@ yang-lei指点我的方向。这就是我最终做的事情:

对于'parent'组件中的'child'组件,传入一个函数:

<MyCustomComponent onFocusFunction={this.gainFocus.bind(this)} onDismissFunction={this.dismissFocus.bind(this)} />

在MyCustomComponent中:

inputFocused(refName) {
  this.props.onFocusFunction(this, refName)
}

dismissFocus(refName) {
  this.props.onDismissFunction(this, refName)
}

render() {

  var field = this.props.fieldInfo;
  placeholder = field.placeholder ? field.placeholder : ""

  return (
    <View style={styles.inputRow}>
    <Text style={styles.textField}>{this.props.fieldInfo.title}</Text>
    <TextInput ref={field.title}
      style={styles.textInput}
      onChange={this.handleChange.bind(this)}
      keyboardType='email-address'
      placeholder={placeholder}
      onFocus={this.inputFocused.bind(this, field.title)}
      onBlur={this.dismissFocus.bind(this, field.title)}
      />
    </View>
  )
}

在'父母'组件中:

gainFocus(view, refName) {
  setTimeout(() => {
    let scrollResponder = this.refs.scrollView.getScrollResponder();
    scrollResponder.scrollResponderScrollNativeHandleToKeyboard(
      React.findNodeHandle(view.refs[refName]),
      110, //additionalOffset
      true
    );
  }, 0);
}

dismissFocus(view, refName) {
  setTimeout(() => {
    let scrollResponder = this.refs.scrollView.getScrollResponder();
    scrollResponder.scrollResponderScrollTo(
    )
  }, 0);
}