Если вы один, используя самую популярную библиотеку 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 для достижения глобального государственного управления с меньшим количеством кода, и не нужно беспокоиться о добавлении новых пакетов в приложение, и мы можем значительно сократить размер пакета приложения.
Пожалуйста, оставьте комментарий и следуйте за мной за дополнительные статьи.