首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Redux-Toolkit和Store更改不会触发重呈现。

Redux-Toolkit和Store更改不会触发重呈现。
EN

Stack Overflow用户
提问于 2020-04-01 16:50:32
回答 1查看 1.1K关注 0票数 8

每当URL包含带有ID的查询参数时,我都试图用数据库中的信息预填充表单。当从数据库获取信息时,我无法使站点触发重呈现。组件中的相关代码如下所示。

代码语言:javascript
复制
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,那么它就会反映在表单中。

代码语言:javascript
复制
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-工具包,因此使用了片语法。

EN

回答 1

Stack Overflow用户

发布于 2021-11-12 17:00:14

我什么也不答应,只是试试这个,看看它是否管用:

代码语言:javascript
复制
useEffect(()=>{
  (async () => {
    if (id) dispatch(fetchArticle(id));
    await setForm({
      ...form,
      title: title,
      summary: summary,
      severity: severity,
      references: references,
      type: type,
      vulnerabilities: vulnerabilities
    })
  })();
}, []);

然后删除第二个useEffect。如果这不起作用,我们能看到您的呈现jsx代码吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60976142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档