Redux-Toolkit и React Hooks - изменение магазина не вызывает повторного рендеринга
Я пытаюсь предварительно заполнить форму информацией из базы данных всякий раз, когда URL-адрес содержит параметр запроса с идентификатором. Я не могу заставить сайт запускать повторную визуализацию, когда информация извлекается из базы данных. Соответствующий код в компоненте показан ниже.
let { id } = useParams();
const { title, summary, severity, references, type, vulnerabilities } = useSelector(
(state: RootState) => state.articles.article
)
useEffect(() => {
if(id) dispatch(fetchArticle(id))
}, [])
const [form, setForm] = useState<FormState>({
title: title,
type: type,
summary: summary,
severity: severity,
references: references,
vulnerabilities: vulnerabilities,
autocompleteOptions: autocompleteSuggestions,
reference: "",
vulnerability: "",
})
useEffect(() => {
setForm({
...form,
title: title,
summary: summary,
severity: severity,
references: references,
type: type,
vulnerabilities: vulnerabilities
})
}, [title, summary, severity, references, type, vulnerabilities])
Мы видим, что действие Redux запущено, и состояние статьи обновляется в магазине. Я также пыталсяconsole.log
внутри хука, чтобы убедиться, что он работает, что он и делает, но только при первоначальной визуализации. Если я изменюinitialState
в срезе, то это отражается в форме.
let initialState: ArticleState = {
loading: false,
error: null,
article: {
title: "",
severity: 0,
type: 0,
summary: "",
references: [],
vulnerabilities: [],
id: 0
},
articles: [] as Article[],
autocompleteSuggestions: [] as DropdownItem[]
}
const ArticleSlice = createSlice({
name: "articles",
initialState,
reducers: {
getArticleStart: startLoading,
getArticleFailure: loadingFailed,
getArticleSuccess(state: ArticleState, { payload }: PayloadAction<Article>) {
state.article = payload
state.error = null
state.loading = false
}
}
})
export const {
getArticleFailure,
getArticleStart,
getArticleSuccess
} = ArticleSlice.actions
export default ArticleSlice.reducer
Достаточно Жутко, если я сохранить код в то время как на странице горячей перезагрузки делает обновление его и запускает повторно вынести, заполнение формы правильно.
Обратите внимание, что я использую Redux-Toolkit, отсюда и синтаксис среза. Пожалуйста, дайте мне знать, если потребуется дополнительная информация.
1 ответ
Я ничего не обещаю, но попробуйте это, посмотрите, сработает ли это:
useEffect(()=>{
(async () => {
if (id) dispatch(fetchArticle(id));
await setForm({
...form,
title: title,
summary: summary,
severity: severity,
references: references,
type: type,
vulnerabilities: vulnerabilities
})
})();
}, []);
Затем удалите второй useEffect. Если это не сработает, можем ли мы увидеть ваш код рендеринга jsx?