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