【问题标题】:How can I re-render the page after post request with react/redux?如何在使用 react/redux 发布请求后重新渲染页面?
【发布时间】:2017-06-01 13:21:18
【问题描述】:

发布和服务器响应之间的时间很短。当你得到肯定的回应时,怎么可能导致你的组件重新渲染?我尝试了 componentWillGetProps(){} 和 if 语句,例如

if(this.props.incomingItems){return: this.props.incomingItems}

但他们都没有成功。你是如何解决这个问题的? PS 我正在使用 redux 和 axios 来处理请求。

import React, { Component } from 'react';
import { reduxForm } from 'redux-form';
import * as actions from '../../actions';

class eventView extends Component {
  componentWillMount() {
    this.props.eventView(this.props.params.eventID);
    }


createNewRole(roleName){
  this.props.createNewRole(roleName, this.props.params.eventID);
 };

renderUsers(){
  return this.props.eventDetails.userList.map((user)=>{
    return(
    <li className='list-group-item eventUserList' background-color="#f2f2f2" key={user._id}>
      {user.userName}
    </li>
    );
     });
   };


 deleteListItem(key){
   const newKey = key.dispatchMarker.substr(44, 24);
    this.props.RemoveRoleFromList(newKey)
    this.props.fetchEvents();
    }

renderRoles(){
  return this.props.eventDetails.role.map((role)=>{
    return(
    <li className='list-group-item roleList' key={role._id}>
      {role.roleName}
      <img className="deleteListItem"
       src="/img/trash.png"
       key={role._id}
       onClick={this.deleteListItem.bind(this)}/>
    </li>
       );
        });
          };




  render() {
    const { handleSubmit, fields: {eventName,location, eventPassword, roleName} } = this.props;
    if(this.props.roleList){
      console.log(this.props.roleList)
    }
    if (this.props.eventDetails){
return (

  <div className='container-fluid'>

    <div className="roleBox">
    <form onSubmit={handleSubmit(this.createNewRole.bind(this))}>
    <div>
    <input {...roleName}
           className="form-control roleBoxInputBar"
           autoComplete="off"/>
      <button className="RoleButton">Save</button>
      </div>
        <div className="listOfRoles">
        <ul className="listOfRoles pre-scrollable">
        {this.renderRoles()}
        </ul>
        </div>
        </form>
      </div>
  <div>
    <div>
      <h1 className="eventName">
      {this.props.eventDetails.eventName}
      </h1>
    </div>
  <br/>
    <table>
      <tbody>
        <tr>
          <td className="eventViewTableLocation">Location:</td>
          <td className="eventViewTable">{this.props.eventDetails.location}</td>
        </tr>
        <tr>
            <td className="eventViewTableLocation">Date:</td>
            <td className="eventViewTable">12/Feb/2018</td>
        </tr>
        <tr>
            <td className="eventViewTableLocation">Time Left:</td>
            <td className="eventViewTable">2 Days 2 Hours</td>
        </tr>
      </tbody>
    </table>

  </div>
    <div className='eventViewUserBox'>
      <h4 className="listOfUsers">Organisers:</h4>
      <ul>
      {this.renderUsers()}
      </ul>
    </div>
  </div>
    );
}else {
  return (
    <div>
    </div>
  );
}

  }
}



function mapStateToProps(state) {
  return { eventDetails: state.api.eventDetails };
  return { roleList: state.api.roleList };
  return { createdRole: state.api.createdRole };
}

export default reduxForm({
  form: 'eventView',
  fields: ['eventName', 'location', 'eventPassword', 'roleName']
}, mapStateToProps, actions)(eventView);

我的 axios 帖子是这样的

export function createNewRole({roleName}, eventID){
  return function(dispatch) {
    axios.post(`${ROOT_URL}createRole/`+eventID, {roleName})
      .then(response => {
        if (response.data){
          dispatch({
            type: CREATED_ROLE,
            payload: response.data,
            });
          };
        })
      .catch(response => dispatch(authError(response.data.error)));
  };
};

减速机:

export default function(state = {}, action) {
  switch(action.type) {
    case FETCH_ROLES:
      return { ...state, roleList: action.payload };
    case CREATED_ROLE:
      return { ...state, createdRole: action.payload };
  }
  return state;
}

非常感谢!

【问题讨论】:

  • 请显示您的请求的代码。
  • 困扰我的是,response.data 到达了 reducer,但它不会进一步到达 props。对于每个帖子、放置和删除请求都是如此。
  • @TheGabornator 你能展示一下reducer的代码吗?听起来这就是问题所在。

标签: rest api reactjs redux axios


【解决方案1】:
function mapStateToProps(state) {
  return { eventDetails: state.api.eventDetails };
  return { roleList: state.api.roleList };
  return { createdRole: state.api.createdRole };
}

这个函数总是返回第一个对象。应该是:

function mapStateToProps(state) {
 return { 
  eventDetails: state.api.eventDetails,
  roleList: state.api.roleList,
  createdRole: state.api.createdRole
 };
}

我猜 roleList 和 createdRole 总是未定义?如果你能展示减速器也很好。

【讨论】:

  • 谢谢!它还没有工作,但它是一个非常有用的提示。我明天试试看。
  • 它并没有真正起作用。我想知道,如果您想在某些事情(例如 api 请求完成)时重新渲染,您将如何解决它?问题是,如果我只是将它写在表单提交下方,那么反应正在快速执行重新渲染。没有类似 .done() 的东西吗?
  • 我们需要看看监听type: CREATED_ROLE的reducer。
  • 我添加了它,但删除了大多数情况以使其简短。 - 非常感谢您的关心。
猜你喜欢
  • 2021-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-23
  • 2023-03-19
  • 2021-05-03
  • 2021-06-01
  • 1970-01-01
相关资源
最近更新 更多