【问题标题】:ReactJS: Update values without reload the pageReactJS:更新值而不重新加载页面
【发布时间】:2020-05-21 08:14:45
【问题描述】:

我有这个问题,当我对某些数据进行插入或更改时,要查看需要重新加载页面的新数据,而我会自动更新值而无需重新加载页面。我该怎么办?

这是用户点击提交和发帖的部分

_onSubmit(Document)
    {
        const self = this
        if ( !_.isEmpty(Document) )
        {
            //..
            if (Document && !_.isEmpty(Document.Anagraphics))
            {
                alertify.confirm(
                    utility.t('sureYouWanna_SAVE'),
                    () => {
                        const now = new Date();
                        Document._id = `PRODUCT:${new Date().getTime()}-${utility.CUID()}`
                        Document.CreationDate = now.toISOString()
                        Document.CategoryCode 
                        Document.Status = 'New';
                        Document.Type = 'PRODUCT';
                        self._POST(Document)
                    },
                    function(){}
                ).set('labels', {ok: utility.t('YES_SAVE'), cancel: utility.t('CANCEL')})
            }
            else
            {
                $methods.WarnMissingValues()
            }
        }
        else {
            $methods.WarnMissingValues()
        }
    }



_POST(Document)
    {
        console.log("DOCUMENT POST", Document)
        const self = this
        const auth = this.props.db.auth
        fetch(`${this.props.db.couch_db_host_url}requests`,{
            method: 'POST',
            credentials: 'include',
            headers: {
                'Accept': 'application/json',
                'Content-Type': 'application/json',
                'Authorization': 'Basic ' + btoa(`${auth.username}:${auth.password}`)
            },
            body: JSON.stringify(Document)
        })
        .then(response => {
            alertify.dismissAll()
            if(response.status > 299 || response.status < 200){
                alertify.error(utility.t('AN_ERROR_OCCURRED'))
                self._updateState({ submitSucceeded: false })
            }
            else{
                alertify.alert(utility.t('ITEM_EDITED_OK'), function(){})
                self.props.history.push({
                    pathname: RoutesIT.products_details
                })
            }
        })
        .catch((err, warning) => {
            if (err)
            {
                alertify.dismissAll()
                alertify.error(utility.t('AN_ERROR_OCCURRED'))
                console.log('_POST', err);
                self._updateState({ submitSucceeded: false })
            }
            else
            {
                console.log(warning)
                alertify.dismissAll()
                alertify.warning(utility.t(warning))
            }
        })
    }

如何不重新加载页面以查看帖子的结果?谢谢

更新:

在页面中我也有:

function mapStateToProps(state) {
    const { app: { login, p, c, l, c_timestamp, p_timestamp, l_timestamp }, form } = state;
    return {
        db: login ? login.db : null,
        Sender: login ? login.Location : null,
        timestamp: login ? login.timestamp : null,
        [ FORM_NAME ]: form[FORM_NAME],
        products: p,
        locations: l,
        categories: c, 
        categories_timestamp: c_timestamp,
        products_timestamp: p_timestamp,
        locations_timestamp: l_timestamp,
        utente: login,
    };
}

减速器

case actions.CATE_UPDATE:
    {
      return {
        ...state,
        c: action.payload,
        c_timestamp: new Date().getTime()
      }
    }

【问题讨论】:

  • 您也需要将数据添加到状态中,在您将项目发布到 api 之后,从您的示例代码中,不清楚您如何存储现有数据,我无法提供工作例子。
  • 如果你使用 HTML 表单的 post 方法,浏览器会强制重新加载,你必须在 onSubmit 事件中返回 false。我认为您应该使用 ajax 将数据发送到服务器,页面不会重新加载,并且您无法接收回调 ajax 的响应。
  • 我使用 redux 保存状态可能是这个问题吗?
  • 我不明白该怎么做..在你看来我应该看到哪一部分?
  • 你说你使用 Redux,对吧?你介意发布你的reducer的代码,你正在更新数据的部分吗?减速器通常是此类错误的根源,因此它是开始寻找问题的好地方。

标签: javascript reactjs


【解决方案1】:

就我在您的代码中看到的情况而言,问题可能在于您在提交数据时没有分派任何操作。

Redux 存储只能通过操作进行修改,并且由于您没有触发任何操作,因此它的内容永远不会被更新。这就解释了为什么你的组件没有实时更新:你的本地数据永远不会改变,所以 React 不知道任何更新。当您重新加载页面时一切正常,因为您可能正在从服务器获取数据,而在您的 POST 请求期间数据确实发生了变化。

为了解决这个问题,您首先需要将mapDispatchToProp 传递给您的组件,就像您对mapStateToProps 所做的一样:

connect(mapStateToProps, mapDispatchToProps)(YourComponent);

mapDispatchToProps 内部,您必须返回一个包含函数的属性,该函数将调度您要运行的CATE_UPDATE 操作:

const mapDispatchToProps = (dispatch) => ({
  cateUpdateAction: (payload) => dispatch({
    type: CATE_UPDATE,
    payload
  }),
});

完成此操作后,您将能够从组件的 props 访问此函数,并在 _POST 方法中调用它。

if (response.status > 299 || response.status < 200){
  alertify.error(utility.t('AN_ERROR_OCCURRED'))
   self._updateState({ submitSucceeded: false })
} else {
  alertify.alert(utility.t('ITEM_EDITED_OK'), function(){})

  // Dispatch action to update data in Redux store
  self.props.cateUpdateAction(data_to_save);

  self.props.history.push({
    pathname: RoutesIT.products_details
  })
}

【讨论】:

  • 感谢您的回答,所以我需要了解“data_to_save”中插入了什么?
  • 因为如果我传递文档,当我点击保存时,我会收到此错误:_POST ReferenceError: CATE_UPDATE is not defined
  • 您应该将data_to_save 替换为您想保存在商店中的内容,即您期望reducer 中的action.payload 的内容。我真的不知道它是什么,这是您应用程序内部的逻辑。 :) 至于那个错误,您可能没有在定义mapDispatchToProps 的文件中导入CATE_UPDATE 常量。
猜你喜欢
  • 2018-11-15
  • 2013-01-24
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多