Открывайте базу данных Realm только один раз при визуализации компонента (React Native) - PullRequest
0 голосов
/ 06 февраля 2020

Разрабатывая приложение React Native для Android, я полностью застрял с проблемой, касающейся базы данных Realm.

Приложение позволяет пользователю запрашивать предварительно заполненную базу данных через панель поиска. Например, вы вводите имя, такое как «Джон», и выполняется запрос к базе данных, возвращая всех людей с именем «Джон».

В настоящее время база данных Realm запускается при каждом рендеринге, который вообще не работает:

import ...

const SearchBar = props => {
  let [inputValue, setInputValue] = useState(null);

  const sendInputValueToReduxStore = text => {
    setInputValue(text);
    props.setInputValueSearchBar(text);
  };

  const peopleSchema = {
    name: 'realm',
    properties: {
      name: 'string?',
      color: 'string?',
    },
  };

  let realm = new Realm({
    path: fs.DocumentDirectoryPath + '/default.realm',
    schema: [peopleSchema],
    readOnly: true,
  });

  const people = realm.objects('realm');
  let resultArray = [];

  const databaseRequest = () => {
    const query = inputValue;
    const result = inputValue
      ? people.filtered("name == '" + query + "'")
      : 'default';
    resultArray = Array.from(result);
    return resultArray.map(oneGuy => (
      <Text className="oneGuy" key={oneGuy.name}>
        {oneGuy.name}
      </Text>
    ));
  };

  const isText = props.text;

  return (
    <View>
      <Header searchBar rounded>
        <Item>
          <Icon name="ios-search" />
          <Input
            placeholder="Search"
            onChangeText={text => sendInputValueToReduxStore(text)}
            value={inputValue}
          />
        </Item>
      </Header>
      {isText && (
        <View>
          <Text>{props.text}</Text>
        </View>
      )}
      <View>{databaseRequest()}</View>
    </View>
  );
};   

export default SearchBar;

Итак, я хотел бы поместить эти части:

  const peopleSchema = {
    name: 'realm',
    properties: {
      name: 'string?',
      color: 'string?',
    },
  };

  let realm = new Realm({
    path: fs.DocumentDirectoryPath + '/default.realm',
    schema: [peopleSchema],
    readOnly: true,
  });

... в useEffect() -Крюк с пустым массивом зависимостей для создания базы данных Realm только один раз при первом рендеринге. Но когда я это делаю, React жалуется, что «назначения переменной области будут потеряны после каждого рендера».

enter image description here

Но я думаю, что это не будет Это не большая проблема, так как я хочу только открыть и запросить базу данных.

Я читал об использовании useRef() -Hook для решения проблемы выше, но мне интересно, имеет ли смысл весь мой подход (открытие базы данных только один раз). Будет ли лучше просто оставить компонент выше как есть и не заботясь о его фазах жизненного цикла?

1 Ответ

0 голосов
/ 07 февраля 2020

Ну, вы можете передать пустой массив в качестве второго аргумента, чтобы сказать React, что ваш эффект не зависит от каких-либо значений из реквизита или состояния, поэтому его не нужно повторно запускать.

useEffect(() => {

    /* your code */

}, []); // run an effect and clean it up only once (on mount and unmount)
...