React native: удалить элемент из ListView на основе состояния для незарегистрированных пользователей

#list #react-native

#Список #react-native

Вопрос:

Я новичок в RN, и я пытаюсь показать / скрыть элемент в списке на основе зарегистрированного состояния пользователя.

Я достиг цели скрыть элемент при выходе из системы, но все еще испытываю проблемы со входом в систему.

Я использую react-native-elements и особенно компонент SideMenu.

Я создал два массива, как вы можете видеть ниже.

Вот мои массивы:

 var listLogged = [
   {
     name        : 'Page 1'
   },
   {
     name        : 'Page 2'
   },
   {
     name        : 'Logout'
   }];

 var listNotLogged = [
   {
     name        : 'Page 1'
   },
   {
     name        : 'Page 2'
   }];
  

При рендеринге:

 if (this.state.LoggedIn) {
<List>
{
 listLogged.map((item, j) => (
   <ListItem
    key={j}
    title={item.name}
   />
 ))
}
</List>
} else {
<List>
{
  listNotLogged.map((item, j) => (
    <ListItem
     key={j}
     title={item.name}
    />
   ))
}
</List>
  

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

Надеюсь на некоторую помощь! Заранее благодарю

Ответ №1:

Если ваш <List /> компонент находится внутри a React Component , вы можете использовать this.setState({ LoggedIn: true }) для изменения состояния, и render() функция автоматически запустится повторно.

Я привел пример ниже, чтобы показать вам, как нажатие кнопки «Войти» может изменить состояние, что приводит render() к повторному запуску с новым состоянием и приводит к другому результату. Нажатие Logout переключит состояние обратно:

 import React, { Component } from 'react';
import { List, ListItem, SideMenu, Button } from 'react-native-elements';

const list = [  
  { name: 'Page 1', onPress: null },
  { name: 'Page 2', onPress: null }
];

class Example extends Component {

  constructor(props) {
    super(props);
    this.state = { LoggedIn: false };
  }

  toggleLoggedInState = () => {
    this.setState({ LoggedIn: !this.state.LoggedIn });
  }

  render() {
    let button;
    if (this.state.LoggedIn) {
      list.push({ name: 'Logout', onPress: this.toggleLoggedInState });
      button = <Button title="Log In" onPress={this.toggleLoggedInState} />;
    }

    const items = list.reduce((array, item) => {
      array.push(
        <ListItem
          key={j}
          title={item.name}
          onPress={item.onPress)
        />
      );
      return array;
    }, []);

    return (
      <SideMenu>
        <List>
          {items}
        </List>
        {button}
      </SideMenu>
    )
  }
}

export default Example;
  

Если вы хотите изменить состояние в другом месте и заставить это представление реагировать, вам лучше использовать что-то вроде redux под капотом. Это дает вам основу state для всего вашего приложения.

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

1. К сожалению, у меня есть эта проблема: array.push() это не функция, и я не знаю почему!

2. @Mark Я обновил код… Я не передавал пустой массив в конце reduce() функции.