Рубрики
Без рубрики

Реагистрировать государственное управление с отдачей

Отдача – это государственная библиотека управления для реагирования. Это все еще находится в экспериментальной фазе, но выглядит реально … Помечено с отдачей, StatManagement, React, JavaScript.

Отдача является государственной библиотекой управления реагированием. Это все еще в экспериментальной фазе, но выглядит действительно многообещающе. Лучше всего о том, что он работает и думает, как реагировать. Наиболее важные концепции отдачи являются атомы и селекторы.

Атомы – это единицы состояния, в то время как селекторы являются чистыми функциями, которые рассчитывают полученные данные из состояния. Селекторы принимают как атомы, так и другие селекторы в качестве ввода. Компоненты могут подписаться на селекторы или атомы и будут перенесены при изменении селекторов или атомов.

Я объясню, как отдача может управлять состоянием вашей приложения через некоторые примеры. Нет, это не будет другого приложения ToDo. Наше приложение покажет список песен, а для каждой песни мы можем получить дополнительную информацию. Я делюсь репозитория GitHub в конце статьи.

Прежде всего, нам нужно создать новое App App:

npx create-react-app recoil-example
cd recoil-example
yarn
yarn start

Убедитесь, что ваше приложение работает на Localhost: 3000 , вы должны увидеть такую страницу:

Тогда нам нужно добавить отдача в наше приложение:

yarn add recoil

Нам нужно обернуть наши компоненты, которые используют отдачу в Recoilroot . Мы можем заменить содержание App.js с:

// App.js

import React from 'react';
import { RecoilRoot } from 'recoil';

import './App.css';

const App = () => (
  

Recoil Example

); export default App;

Наше приложение все равно будет работать и показать изменения, которые мы сделали:

Мы создадим реальный пример, поэтому мы начнем с нашего клиента:

// client.js

const songList = [
  { id: 1, title: 'Bohemian Rhapsody' },
  { id: 2, title: 'Purple Rain' },
  { id: 3, title: 'One' },
  { id: 4, title: 'Eternal Flame' },
];

const songDetails = [
  { id: 1, artist: 'Queen', year: 1975 },
  { id: 2, artist: 'Prince', year: 1984 },
  { id: 3, artist: 'U2', year: 1992 },
  { id: 4, artist: 'The Bangles', year: 1989 },
];

export const getSongs = async () =>
  new Promise(resolve => setTimeout(() => resolve(songList), 500));

export const getSongById = async id =>
  new Promise(resolve => {
    const details = songDetails.find(s => s.id === id);
    return setTimeout(() => resolve(details), 500);
  });

Теперь, когда у нас есть наши клиентские функции, мы можем реализовать атомы и селекторы, которые будут управлять состоянием нашего приложения. У каждого атома и селектора будет уникальный я d. Мы начнем с загрузки списка песен. Поскольку наша клиентская функция возвращает обещание, функция Get Selector будет async:

// selectors.js

import { selector } from 'recoil';
import { getSongs } from './client';

export const songsQuery = selector({
  key: 'songs',
  get: async () => {
    const response = await getSongs();
    return response;
  },
});

Следующий шаг – создать компонент, который отображает список песен. Нам нужно подключить наш компонент к селектору, который мы только что создали. Отдача имеет некоторые полезные крючки для этого:

  • userecoilstate – возвращает значение данного состояния и функцию сеттера для обновления стоимости данного состояния;
  • UserecoilValue – возвращает стоимость данного состояния;
  • использует EtreCoilState – Возвращает функцию сеттера для обновления значения данного состояния.

Мы создадим Песни составная часть:

// Songs.js

import React from 'react';
import { useRecoilValue, useSetRecoilState } from 'recoil';
import { songsQuery } from './selectors';
import { currentSongIDState } from './atoms';

const Songs = () => {
  const songs = useRecoilValue(songsQuery);
  const setCurrentSongID = useSetRecoilState(currentSongIDState);

  return (
    <>
      

Songs

{songs.map(song => (

setCurrentSongID(song.id)}>{song.title}

))} ); }; export default Songs;

Следует отметить, что наш селектор асинхн, но функции React Render являются синхронными. Здесь приходит в React Shospense, которая обрабатывает ожидающие данные. Мы также можем обрабатывать ожидаемое состояние с загруженным отдачей или реализовать обработчик с нуля, но сейчас мы будем использовать неизвестность:

// App.js

import React, { Suspense } from 'react';
import { RecoilRoot } from 'recoil';
import Songs from './Songs';

import './App.css';

const App = () => (
  
Loading...}>
); export default App;

Теперь в нашем браузере мы должны увидеть список песен:

Это было легко, верно?

Теперь посмотрим, как мы можем получить детали песни. Когда мы выбираем песню, мы хотим увидеть свои данные, как художник и год выпуска. Нам нужно запомнить текущую песню ID. Идентификатор – это просто простое значение, он не будет рассчитан, поэтому мы создадим для этого атом, а не селектор:

// atoms.js

import { atom } from 'recoil';

export const currentSongIDState = atom({
  key: 'currentSongID',
  default: '',
});

На основании текущей идентификатора песни мы хотим получить детали песни. Нам нужен другой селектор, который вызывает функцию клиента с текущей идентификатором песни. Селекторы могут прочитать другие атомы и селекторы, используя Получить Аргумент Получить функция. Я знаю, что это звучит немного сбивает с толку, но следующий пример прояснит:

// selectors.js

import { selector } from 'recoil';
import { currentSongIDState } from './atoms';
import { getSongs, getSongById } from './client';

// ...

export const currentSongQuery = selector({
  key: 'currentSong',
  get: async ({ get }) => {
    const response = await getSongById(get(currentSongIDState));
    return response;
  },
});

Теперь мы создадим Currentsong Компонент, который оказывает детали выбранной песни:

// CurrentSong.js

import React from 'react';
import { useRecoilValue } from 'recoil';
import { currentSongQuery } from './selectors';

const CurrentSong = () => {
  const currentSong = useRecoilValue(currentSongQuery);

  return currentSong ? (
    <>
      

Current Song Details:

Artist: {currentSong.artist}

Released: {currentSong.year}

) : null; }; export default CurrentSong;

Тогда мы можем добавить его в нашу Песни составная часть. CurrentsOngidState Atom может быть обновлен из компонента, используя функцию сеттера, возвращаемой userecoilstate Отказ (Обратите внимание, что я не хотел добавлять его в компонент приложения, потому что я не хочу показывать состояние «загрузки…», когда ничего не выбрано. Конечно, мы могли бы лучше структурировать наше приложение, но сейчас все в порядке):

// Songs.js

import React, { Suspense } from 'react';
import { useRecoilValue, useRecoilState } from 'recoil';
import { songsQuery } from './selectors';
import { currentSongIDState } from './atoms';
import CurrentSong from './CurrentSong';

const Songs = () => {
  const songs = useRecoilValue(songsQuery);
  const [currentSongID, setCurrentSongID] = useRecoilState(currentSongIDState);

  /*
   * as an alternative, we could declare them separately:
   * const currentSongID = useRecoilValue(currentSongIDState);
   * const setCurrentSongID = useSetRecoilState(currentSongIDState);
   */

  return (
    <>
      

Songs

{songs.map(song => (

setCurrentSongID(song.id)}> {song.title} {song.id === currentSongID && '*'}

))} {currentSongID && ( Loading...}> )} ); }; export default Songs;

Если мы нажмем на песню, мы должны увидеть детали под списком песен:

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

Если вы используете для работы с другими государственными библиотеками управления, например redux, то вы знаете, что «глобальное» состояние может быть обновлено после обновления данных на сервере. Отдача не имеет «глобального» состояния, как и другие библиотеки государственного управления, но связаны с Recoilroot . Это означает, что состояние не может быть обновлено за пределами компонентов/крючков.

Но есть еще надежда … С отдачей мы можем достичь этого, подписавшись на обновления сервера от Useffect и обновление состояния оттуда. Я знаю, что это не идеально, но это API Все еще находится в разработке, и отдача может справиться с этим вне коробки.

В заключение, сравнивая его с другими государственными библиотеками управления (например, redux), он кажется более «реагированным» и проще и проще учиться, поэтому в будущем это может быть хорошая альтернатива.

Вы можете найти репозиторий GitHub здесь Отказ Спасибо за прочтение этой статьи.

Оригинал: “https://dev.to/kinga/react-state-management-with-recoil-5a9k”