在react-redux应用程序中更新部分状态时,整个页面会闪烁并跳至顶部

ren*_*kre 5 reactjs redux react-redux

在我的react-redux应用程序中,我可以通过界面正确地更新一些数据,如下图所示。以下是更改redux状态的相应代码:

case UPDATE_COMMENT_SUCCESS:
        const commentUpdated = action.payload.normalizedData;
        return {
            ...state,
            loading: false,
            editing: false,            
            discussionPosts: {
                ...state.discussionPosts,
                [commentUpdated.id]: {
                    ...state.discussionPosts[commentUpdated.id],
                    content: commentUpdated.content
                }
            }
        };
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

下面是单击的按钮的onclick事件:

const onSubmit_updateComment = (event) => {
    event.preventDefault();
    props.updateComment({
        Id: st_activeCommentToEdit,
        Content: st_commentTextEdit,
        UserId: currentUserId
    });
    set_activeCommentToEdit('');
}
Run Code Online (Sandbox Code Playgroud)

这是触发onSubmit_udatecomment事件的表单:

 <form onSubmit={onSubmit_updateComment} className="mt-2">
     <div className="form-group">
         <textarea
             defaultValue={props.comments[commentId].content}
             value={st_commentTextEdit}
             className="form-control"
             onChange={onChange_commentTextEdit}
         />
     </div>

     <div className="float-right">
         <button className="btn btn-sm btn-info" type="submit">Update</button>&nbsp;
         <button
             className="btn btn-sm btn-light"
             type="reset" onClick={(e) => { e.preventDefault(); set_activeCommentToEdit(0) }}>
             Cancel
         </button>
     </div>
     <div style={{ clear: 'both' }}></div>
 </form>
Run Code Online (Sandbox Code Playgroud)

下面是更新数据库的代码(即,props.updateComment从下面的代码):

export function UpdateComment(commentData) {
    return dispatch => {

        dispatch(dataOperationBegin());

        axios({
            method: 'post',
            url: 'api/AssessmentDiscussionPost/Update',
            data: {
                Id: commentData.Id,
                Content: commentData.Content,
                PostOwnerId: commentData.PostOwnerId
            }
        })
            .then(response => {
                console.log('success: Updated the comment');
                console.log(response.data);

                dispatch(updateCommentSuccess(response.data));

                toaster.notify('Comment is posted successfully.', {
                    duration: 2000
                })
            })
            .catch(error => { dataOperationFailure(error) });
    };
}
Run Code Online (Sandbox Code Playgroud)

我尝试了一下,toaster.notify但仍然存在相同的问题。

这是主要组件中首次加载数据的代码:

useEffect(() => {
    if (props.loading == false)//when the loading is complete
    {
        props.fetchReviewAlignPerspectivesdCardData(submissionId);
    }

}, [submissionId])
Run Code Online (Sandbox Code Playgroud)

这是调度到道具的映射:

const mapDispatchToProps = (dispatch) => {
   return {
       fetchReviewAlignPerspectivesdCardData: (submissionId) => dispatch(FetchAlignPerspectivesData(submissionId)),
         }
}
Run Code Online (Sandbox Code Playgroud)

此外,FetchAlignPerspectivesData使axios调用数据库的函数如下:

export function FetchAlignPerspectivesData(submissionId) {
    var url = 'api/x/y';

    return dispatch => {

        dispatch(alignPerspectivesDataOperationBegin);

        axios.get(url, { params: { submissionId } })
            .then(response => {

                const alignPerspectives = new schema.Entity('alignPerspectives');
                const assessments = new schema.Entity('assessments');
                const discussionPosts = new schema.Entity('discussionPosts');
                const childPosts = new schema.Array(discussionPosts);
                discussionPosts.define({
                    childPosts: [childPosts]
                });

                alignPerspectives.define({
                    assessments: [assessments],
                    discussionPosts: [discussionPosts]
                });

                const normalizedData = normalize(response.data, alignPerspectives);
                dispatch(fetchAlignPerspectivesCardSuccess(normalizedData))
            })
            .catch(error => { alignPerspectivesDataOperationFailure(error) });
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为这不是fetchReviewAlignPerspectivesdCardData闪烁的原因(因为在更新字段时再也不会调用它了)。我想知道可能是这个问题的原因。有任何想法吗?

更新

似乎`

export const DATAOPERATION_BEGIN = "DATAOPERATION_BEGIN";
export const dataOperationBegin = () => ({
    type: DATAOPERATION_BEGIN
})
Run Code Online (Sandbox Code Playgroud)

这是的化简代码case DATAOPERATION_BEGIN,其中loading设置为true

 const alignPerspectivesReducer = (state = initialState, action) => {
     switch (action.type) {
         case DATAOPERATION_BEGIN:
             return { ...state, loading: true, error: null };
Run Code Online (Sandbox Code Playgroud)

我想知道我的派遣方式dataOperationBegin是否有问题。有任何想法吗?

cub*_*fox 0

如果没有完整的代码,很难重现,但看起来您不小心提交了一个表单,这可以通过任一设置<button type="button">...(因为否则,默认情况下它将是一个提交按钮)或通过e.preventDefault在表单上设置来修复。