Неопределенный не является объектом (_this.state)

#android #reactjs #react-native

#Android #reactjs #реагировать -родной

Вопрос:

Я все еще новичок в react native и пытаюсь отобразить представление, только если для состояния установлено значение true. Однако, как бы я ни старался, я всегда получаю следующую ошибку:

 Undefined is not an object (evaluating '_this.state')
  

Код:

 "use strict"
import React, { Component } from 'react'
import * as Animatable from './animations'
import Icon from 'react-native-vector-icons/FontAwesome'
import renderIf from './libs/renderif'
import { Text, TouchableOpacity, View, StyleSheet, Navigator } from 'react-native'
var MyCustomComponent = Animatable.createAnimatableComponent(MyCustomComponent);

const Ic = ({ name, style, onPress }) => (
    <TouchableOpacity onPress={onPress}>
        <Icon name={name} style={style} />
    </TouchableOpacity>
)

const Btn = ({label, onPress}) => (
  <TouchableOpacity style={styles.btn} onPress={onPress}>
    <Text style={styles.btnText}>
      {label}
    </Text>
  </TouchableOpacity>
)

const Dashboard = ({ navigator }) => (
    <View style={styles.container}>
        <Text style={styles.text}>
          In Dashboard
        </Text>
        <Btn label="Let's go back" onPress={() => navigator.pop()} />
    </View>
)

const Home = () => (    // this is where I am trying to access the state
    <View>
        <View style={styles.navbarContainer}>
            <View style={styles.navbar}>
                <View style={styles.flexes}>
                    <Ic 
                      name="bars"
                      style={styles.iconLeft}
                      onPress={() => this.setState({isOpen: true})}
                    />
                </View>
                <View style={styles.flexes}>
                    <Text style={styles.navbarTitle}>
                        title
                    </Text>
                </View>
                <View style={styles.rightBtn}>
                    <Ic 
                      name="envelope"
                      style={styles.iconRight}
                      onPress={() => alert("envelope pressed")}
                     />
                </View>
            </View>
        </View>
        {renderIf(this.state.isOpen)(
            <View style={{marginTop: 40}}>
                <Text>hi</Text>
            </View>
        )}
    </View>
)

export default class App extends Component {
    constructor(props){
        super(props)
        this.state = {
            isOpen: false
        }
    }

    renderScene(route, navigator) {
        return(
            <route.component
                navigator={navigator}
            />
        )
    }

    render() {
        return (
            <Navigator 
                renderScene={this.renderScene.bind(this)}
                initialRoute={{
                    component: Home
                }}
            />
        )
    }
}
  

Функция renderIf:

 'use strict';
import React, { Component } from 'react';
const isFunction = input => typeof input === 'function';
export default predicate => elemOrThunk =>
  predicate ? (isFunction(elemOrThunk) ? elemOrThunk() : elemOrThunk) : null;
  

И основной index.android.js:

 import { AppRegistry } from 'react-native'
import App from './app';

AppRegistry.registerComponent('NavRoute', () => App);
  

Я попытался найти соответствующий вопрос, на который был дан ответ ранее, но, к сожалению, я не нашел тот, который мне нужен. Если на этот вопрос был дан ответ ранее, пожалуйста, укажите мне на эту тему и примите мои глубочайшие извинения за доставленные неудобства.

Заранее благодарю вас!

Комментарии:

1. Извините за вопрос, вы пытались удалить renderIf и использовать что-то вроде этого: {if (this.state.isOpen) { return (<View>.....</View>)} else { /* Something else */ }}

Ответ №1:

Вы пытаетесь использовать состояние в функциональном компоненте / компоненте без состояния. Это невозможно. Чтобы использовать состояние, используйте версию класса компонента React . Состояние должно быть явно определено в конструкторе для использования this.state в функции визуализации.

 export default class Home extends React.Component {
  constructor() {
    super();
    this.state = {
      someState: ''
    }
  }

  // rest of the code below
  // move Home to a separate file - home.jsx and import it
}
  

Комментарии:

1. @vijajst Я его определил. Прокрутите вниз до export default class App...

2. Домашний компонент, в котором вы используете this.state, является функциональным.

3. Добавление конструктора в const Home приведет к синтаксической ошибке. Не могли бы вы отредактировать свой ответ и показать мне, как его правильно определить?

4. Спасибо. Для меня проблема заключалась в том, что я не включал super() в свой конструктор