如何在一个 submitHandler 中两次更新反应状态

Posted

技术标签:

【中文标题】如何在一个 submitHandler 中两次更新反应状态【英文标题】:How to update react state twice in one submitHandler 【发布时间】:2018-10-22 18:00:45 【问题描述】:

我想在 React 中提交一个表单,我试图用一个 submitHandler 更新状态两次。第二次更新依赖于第一次更新。

   submitHandler(event) 
            event.preventDefault();
            let target      = event.target;
            let allMessages = this.props.messages;
            let title       = target.title.value,
                message     = target.message.value,
                user        = target.user.value,
                time        = `$(new Date).getHours():$(new Date).getMinutes()`,
                id          = allMessages ? allMessages.length + 1 : 1;

            this.props.createNewMessage(title, message, user, time, id);
            this.props.postNewMessage(this.props.singleMessage)
        

我正在创建一条消息

this.props.createNewMessage(title, message, user, time, id);

在创建该消息后,我想将处于该状态的整个对象推送到消息数组中:

this.props.postNewMessage(this.props.singleMessage)

如何使用 async 和所有“this”环境,以便使用 postNewMessage 推送到数组的新消息将具有来自新 singleMessage 值的值?

以下是我如何连接 create 和 postMewMessage:

const mapStateToProps = state => 
    return 
        messages: state.messages.messages,
        title: state.singleMessage.title,
        message: state.singleMessage.message,
        user: state.singleMessage.user,
        time: state.singleMessage.time,
        singleMessage: state.singleMessage
    


const mapDispatchToProps = 
    createNewMessage,
    postNewMessage


export default connect(mapStateToProps, mapDispatchToProps)(CreateNewPost)

它们在此处定义(在将通过 combineReducers 组合的单独的 reducer 文件中:

export const addNewMessage = (message) => (
    type: ADD_NEW_MESSAGE,
    message
)

export const postNewMessage = (newMessage) =>
    dispatch => dispatch(addNewMessage(newMessage))   

export const createMessage = (title, message, user, time, id) => (
    type: CREATE_MESSAGE,
    title,
    message,
    user, 
    time, 
    id
)

export const createNewMessage = (title, message, user, time, id) =>
    dispatch => dispatch(createMessage(title, message, user, time, id))

entire repo here

【问题讨论】:

你在使用 redux 吗?您忘记将其添加到标签中。你要找的可能是redux-thunk 例子可以找到here 您提到了异步,但我在您的问题中没有看到任何异步代码。 createNewMessage 分派createMessage 的结果,而您分派addNewMessage 的结果,但缺少这些函数的作用。 @HMR 你能看看我的回购链接吗? (希望这是正确的 *** 礼仪 【参考方案1】:

repo 中没有任何异步内容,但确实在 allMessageReducer.js 中发现了一个错误:

    case ADD_NEW_MESSAGE:
        return Object.assign(
            ,
            state, 
            messages:state.messages.concat(action.message)
        );

尝试在 CreateNewPost.js 中访问 this.props.singleMessage 时出现问题,但我认为这与反应渲染/设置新状态(可能在 requestAnimationframe 中)有关。

您在记录时可能会看到错误的字段,因此与其使用它,不如只使用您已有的值:

this.props.createNewMessage(title, message, user, time, id);
console.log(
    "state not yet available in this.props",
    JSON.stringify(this.props.singleMessage,undefined,2)
);
this.props.postNewMessage(title, message, user, time, id);

【讨论】:

以上是关于如何在一个 submitHandler 中两次更新反应状态的主要内容,如果未能解决你的问题,请参考以下文章

不能在一个槽中两次更改 QLabel 文本

React:如何在页面中两次渲染组件?

如何在同一列或不同列的一个sql语句中两次使用'BETWEEN'条件

如何在同一个“调用堆栈”中两次使用宏列表?

如何在 C# 中两次读取 Http 响应流?

如何计算 Git 中两次提交之间更改的行数?