每当URL包含带有ID的查询参数时,我都试图用数据库中的信息预填充表单。当从数据库获取信息时,我无法使站点触发重呈现。组件中的相关代码如下所示。
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-工具包,因此使用了片语法。
发布于 2021-11-12 17:00:14
我什么也不答应,只是试试这个,看看它是否管用:
useEffect(()=>{
(async () => {
if (id) dispatch(fetchArticle(id));
await setForm({
...form,
title: title,
summary: summary,
severity: severity,
references: references,
type: type,
vulnerabilities: vulnerabilities
})
})();
}, []);然后删除第二个useEffect。如果这不起作用,我们能看到您的呈现jsx代码吗?
https://stackoverflow.com/questions/60976142
复制相似问题