React Native Navigation - Действие с использованием состояния компонента

Я сделал полный экран TextInput и хотел бы, чтобы действие было выполнено, когда Post button в NavigationBar нажата. Тем не менее, потому что я должен сделать метод, который Button звонит в onPress поддержать статический метод, у меня нет доступа к state,

Вот мой текущий код, и состояние появляется неопределенным в console.log,

import React, { Component } from 'react';
import { Button, ScrollView, TextInput, View } from 'react-native';
import styles from './styles';

export default class AddComment extends Component {
  static navigationOptions = ({ navigation }) => {
    return {
      title: 'Add Comment',
      headerRight: (
        <Button
          title='Post'
          onPress={() => AddComment.postComment() }
        />
      ),
    };
  };

  constructor(props) {
    super(props);
    this.state = {
      post: 'Default Text',
    }
  }

  static postComment() {
    console.log('Here is the state: ', this.state);
  }

  render() {     
    return (
      <View onLayout={(ev) => {
        var fullHeight = ev.nativeEvent.layout.height - 80;
        this.setState({ height: fullHeight, fullHeight: fullHeight });
      }}>
        <ScrollView keyboardDismissMode='interactive'>
          <TextInput
            multiline={true}
            style={styles.input}
            onChangeText={(text) => {
              this.state.post = text;
            }}
            defaultValue={this.state.post}
            autoFocus={true}
          />
        </ScrollView>
      </View>
    );
  }
}

Есть идеи, как добиться того, что я ищу?

2 ответа

Решение

Я вижу, вы нашли решение. Для будущих читателей:

Andreas Olsson опубликовал, как этого добиться на Github:

В componentDidMount установить метод в качестве параметра.

componentDidMount () {
  this.props.navigation.setParams({ postComment: this.postComment })
}

И использовать его в своем navigationOptions:

static navigationOptions = ({ navigation }) => {
  const { params } = navigation.state
  return {
    title: 'Add Comment',
    headerRight: (
      <Button
        title='Post'
        onPress={() => params.postComment()}
      />
    ),
  };
};

Вроде как хак, но я использую метод глобальной переменной, где мы присваиваем это переменной, вызывающей foo. Работает для меня.

let foo;

class App extends Component {

  static navigationOptions = ({ navigation }) => {
    return {
      title: 'Add Comment',
      headerRight: (
        <Button
          title='Post'
          onPress={() => foo.postComment() } <- Use foo instead of this
        />
      ),
    };
  };

componentWillMount() {
foo = this;
}
render() {

    return (<div>Don't be a foo</div>)
}
}
Другие вопросы по тегам