#reactjs #react-context
#reactjs #реагировать-контекст
Вопрос:
В настоящее время я задаю себе следующий вопрос: рекомендуется ли мне определять свое состояние и логику непосредственно в ContextProvider или все в порядке, если я определю состояние и логику в отдельной функции, чтобы немного разделить код?
Пример:
const MyContext = React.createContext({});
const createStore = () => {
const [myState, setMyState] = useState();
return {
myState,
setMyState
}
}
const MyContextProvider = ({ children }) => {
const store = createStore();
return (
<MyContext.Provider value={store}>{children}</MyContext.Provider>
)
}
Я немного боюсь этой createStore
функции. Всегда ли createStore воссоздается заново, если Поставщик повторно отправляет?
Редактировать: Спасибо за ответ!
Что, если я хочу использовать параметр в useCreateStore
перехватчике? Будет ли параметр обновляться?
Пример:
const MyContext = React.createContext({});
const useCustomStore= (myAwesomeValue) => {
const [myState, setMyState] = useState();
const doSomething = useCallback(() => {
//
}, [myAwesomeValue])
return {
myState,
setMyState
}
}
const MyContextProvider = ({ children, title }) => {
const { myState } = useCustomStore(title); //You need to desctructure the returned object here, note myState
return (
<MyContext.Provider value={myState}>{children}</MyContext.Provider>
)
}
Ответ №1:
То, что вы пытаетесь создать для своего «хранилища», называется пользовательским подключением
Однако вам нужно будет внести некоторые изменения. Обычно используется ‘use’ в качестве начала пользовательского хука. итак, здесь я переименовал createStore
в useCustomStore
. Поскольку это пользовательский хук с useState, он следует тем же правилам, как если бы он действительно был у вашего поставщика контекста
Кроме того, ваш пользовательский хук возвращает объект, который содержит состояние и метод мутации. вам нужно будет получить доступ к состоянию либо напрямую store.myState
, либо вы можете его разрушить { myState}
, как у меня в примере.
const MyContext = React.createContext({});
const useCustomStore= () => {
const [myState, setMyState] = useState();
return {
myState,
setMyState
}
}
const MyContextProvider = ({ children }) => {
const { myState } = useCustomStore(); //You need to desctructure the returned object here, note myState
return (
<MyContext.Provider value={myState}>{children}</MyContext.Provider>
)
}
Это то же самое, что
const MyContext = React.createContext({});
const MyContextProvider = ({ children }) => {
const [myState, setMyState] = useState();
return (
<MyContext.Provider value={myState}>{children}</MyContext.Provider>
)
}
Таким образом, повторные отправки сохранят состояние, поскольку он использует перехват useState.
Комментарии:
1. Спасибо вам за четкий ответ 🙂 Я уже думал, что мне нужно добавить к нему префикс
use
, потому что React творит какую-то магию под капотом с этим префиксом.2. Вам не нужно использовать
use
префикс, вы можете использовать все пользовательские настройки, какие вам нравятся .. это просто «хорошая практика» для этого. Да, вы должны передать начальное состояние в перехватuseState(initialState)
, а затем изменить состояние, используяsetMyState
метод мутации, предоставляемый перехватом useState3. Я отредактировал свой основной пост и добавил другой вопрос. Я не смог опубликовать код в этом разделе комментариев здесь