Подтвердить что ты не робот

Это значение равно нулю в функции (React-Native)

В соответствии с локальным тестированием, 'this' кажется нулевым внутри функции рендеринга строки. В результате это мешает мне привязать локальную функцию к onPress prop.

У меня есть этот блок рендеринга:

render() {
    return (
        <ListView
            dataSource={this.state.dataSource}
            renderRow={this._renderRow}
            renderHeader={this._renderHeader} 
            style={styles.listView} />
    );
}

и локальной функции

_visitEntryDetail() {
    console.log('test');
}

тогда строка render

_renderRow(something) {
    return (
        <TouchableHighlight
            style={[styles.textContainer, filestyle.container]} 
            onPress={this._visitEntryDetail.bind(this)} >
            <View>
                <Text style={filestyle.text1} >{something.detail}</Text>
                <Text style={filestyle.text2} >{something.size}, {something.timestamp}</Text>
            </View>
        </TouchableHighlight>
    );
}

Это возвращает

message: null is not an object (evaluating 'this.$FileList_visitEntryDetail')"

проверка "this" на renderRow возвращает значение null при замене кода выше:

_renderRow(file) {
    console.log(this);
    return (
        <TouchableHighlight
            style={[styles.textContainer, filestyle.filelistcontainer]} 
             >

со следующим выходом консоли:

RCTJSLog> null

но отлично, если

render() {
    console.log('inside render. this value is below me');
    console.log(this);
    return (
        <ListView

Приставки

RCTJSLog> "inside render. this value is below me"
RCTJSLog> [object Object]

Может кто-нибудь, пожалуйста, укажет, что вызывает это. Спасибо.

4b9b3361

Ответ 1

this имеет значение null, поскольку _renderRow не привязан к текущему классу. Пожалуйста, имейте в виду:

В конструкторе вам нужно явно привязать функцию, если вы хотите передать ее любому компоненту реакции, поскольку иногда он не связывается неявно.

Этот оператор применяется к любой функции, передаваемой компоненту. Например, вы хотите вызвать функцию callThisFunction при нажатии TouchableHighlight. Вы можете связать его с помощью:

class SomeComponent extends Component {

  constructor(props) {
    super(props)

    //binding function
    this.renderRow = this.renderRow.bind(this)
    this.callThisFunction = this.callThisFunction.bind(this)
  }

  renderRow() {
    console.log(this) //not null now
    return (
      <View>
        <TouchableHighlight onPress={this.callThisFunction}>
          <Image source={require('image!prev')}/>
        </TouchableHighlight>
      </View>
    )
  }

  callThisFunction() {
    console.log(this) //not null now
  }
}

Ответ 2

Альтернативой решению NightFury должно быть использование ES6 Arrow Function без необходимости вручную связывать функцию в конструкторе. Ваш render() будет выглядеть следующим образом:

render() {
    return (
       <ListView
           dataSource={this.state.dataSource}
           renderRow={() => this._renderRow()}
           renderHeader={() => this._renderHeader()} 
           style={styles.listView} />
    );
}