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

Как управлять сложным государством пользовательского интерфейса с помощью крюка Userucer вместо Redux

Управлять сложным интерфейсом UI с помощью USERCER

Автор оригинала: Punith K.

Если вы один, используя самую популярную библиотеку Frontend Реагировать Чтобы построить свой интерфейс, вы, возможно, определенно услышали о реквизитах и состоянии, которые вызывают обновление пользовательского интерфейса, как и когда есть изменение для любого из них; Государство может быть местным состояние (синхронное) или сетевое состояние (асинхронный).

Управляя государством в реагировании всегда было разговором с тобой с таким количеством библиотек в руках, таких как redux , MobX , отдача , и список продолжается, позвольте мне объяснить вам, как мы можем использовать это, не добавляя никакой дополнительной зависимости в приложение и уменьшите размер пакета приложения.

Если вы используете реагирование на некоторое время (по крайней мере, от Rection 16.3), вы могли бы услышать о одной из самых популярных библиотеки Redux Для управления сложным государством пользовательского интерфейса из-за его предсказуемого государства и поддержки Async государственное управление с помощью Redux-Thunk и Redux-Saga Библиотеки.

Есть много библиотек, которые вы можете использовать его как промежуточное программное обеспечение в Redux и расширить возможности Redux. Если вы устанавливаете Redux с нуля, вам необходимо установить код BoetPlate, прежде чем начать работать над ним. Недавние версии Redux предлагают API на основе крюков, чтобы уменьшить часть котельной, но все же, вам нужно знать о Действия , Редукторы , средние годы , и так далее.

Если вы используете последние реагирование или реагирование на 16,8 или выше, вы уже можете использовать одну из самых популярных функций, представленных в React, крючки Отказ Крючки помогут вам написать компоненты без написания классов и управлять состоянием приложения RACT APP.

В этом посте я объясню использование Успеведщик Крюк с помощью других крючков, таких как Useffect , Угемер , УСЭРЕФ и Уместите управлять сложным устройством интерфейса UI без использования Redux. Этот пост предполагает, что вы все знаете основы крючков и как их использовать. Если вы не использовали его, прежде чем я рекомендую вам все прочитать официальную документацию для начала работы.

Предположим, что мы строим простую книгу библиотеки Crud App, где вы можете добавить, удалить и управлять своей библиотекой на основе ваших интересов. Я использую один из шаблонов React UI, широко используемые с redux, Контейнерные и презентационные компоненты шаблон Чтобы продемонстрировать этот пример, это может соответствовать любому шаблону, которую вы уже используете.

Книги-Container.js.

import React, {useReducer, useMemo, useEffect, useRef} from 'react'
import _ from 'lodash'
import BooksLayout from './books-layout'

// Extract this to utils file, can be reused in many places
// Same as that of redux's bindActionCreators method
const bindActionCreators = (reducerMap, dispatch) =>
  _.reduce(
    reducerMap,
    (result, val, type) => ({
      ...result,
      [type]: payload => dispatch({type, payload}),
    }),
    {}
  )

// Initial state of the app
const initialState = {
  books: {}, 
  // To keep track of progress of a API call and to show the 
  // progress in the UI
  bookReadState: null
  bookDeleteState: null
  bookUpdateState: null
}

const reducerMap = {
  setBooks: (state, books) => ({
    ...state,
    books,
  }),
  updateBook: (state, book) => ({
    ...state,
    books: // merge state.books with updated book details
  },
  deleteBook: (state, book) => ({
    ...state,
    books: // update the state.books with deleted book
  }),
  setBookReadState: (state, bookReadState) => ({
    ...state, bookReadState
  }),
  setBookUpdateState: (state, bookUpdateState) => ({
    ...state, bookUpdateState
  }),
  setBookDeleteState: (state, bookDeleteState) => ({
    ...state, bookDeleteState
  }),
}

const useService = ({id, actions}) => {
  // abortController can be used to abort the one or more request
  // when required, can also be used to abort when multiple requests are made
  // within a short period, so that you don't make multiple requests
  const abortController = useRef(new global.AbortController())

  actions = useMemo(
    () => ({
      ...actions,
      readBooks: async () => {
        try {
          const data = await readBooks({
            fetchCallback: actions.setBookReadState})
          actions.setBooks(data)
        } catch(error) {
          // error handling
        }
      },
      updateBook: async book => {
        try { 
          const data = await updateBook({book, 
            fetchCallback: actions.setBookUpdateState})
          actions.updateBook(data)
        } catch(error) {
          // error handling
        }
      },
      deleteBook: async id => {
        try {
          const data = await deleteBook({id, 
            fetchCallback: actions.setDeleteReadState})
          actions.deleteBook(data)
        } catch {
          // error handling
        }
      },
    }),
    [actions]
  )

  useEffect(() => {
    const controller = abortController.current
    // Invoke the actions required for the initial app to load in the useEffect.
    // Here I'm reading the books on first render
    actions.readBooks()
    
    return () => {
      controller.current.abort()
    }
  }, [actions])

  return {actions}
}

const reducer = (state, {type, payload}) => reducerMap[type](state, payload)

const BooksContainer = props => {
  const [state, dispatch] = useReducer(reducer, initialState)
  const actions = useMemo(() => bindActionCreators(reducerMap, dispatch), [])
  const service = useService({...props, state, actions})

  return (
    
  )
}

export default BooksContainer

Книги-Layout.js.

import React from 'react'

const BooksLayout = ({books, actions, bookReadState, ...props}) => {
  return (
    <>
    {bookReadState === 'loading' ? 
Loading...
: {books.map(book => ( // UI Logic to display an each book // button to click to delete // call actions.deleteBook(id) ) ) } } } export default BooksLayout

Как вы можете видеть в приведенном выше примере, вы можете управлять состоянием вашего приложения в контейнере и не нужно беспокоиться о подключении состояния к каждому компоненту отдельно отдельно, сколько нужно в redux.

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

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

Пожалуйста, оставьте комментарий и следуйте за мной за дополнительные статьи.