2017-06-01 21 views
0

发布与服务器响应之间的时间很短。在获得积极响应时,如何让组件重新呈现?我试图componentWillGetProps(){}和if语句一样如何在发送请求后使用react/redux重新呈现页面?

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); 

我的爱可信后是这样的

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; 
} 

非常感谢!

+1

请显示您的请求代码。 – Chris

+0

让我感到困扰的是,response.data到达了减速器,但它不会对道具产生进一步的影响。对于每个帖子,放入和删除请求都是如此。 – TheGabornator

+0

@TheGabornator你可以显示减速器的代码。听起来这就是问题所在。 – adrice727

回答

0
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总是未定义?如果你要展示减速器也是很好的。

+0

谢谢!它还没有工作,但它是一个非常有用的提示。我明天会试一试。 – TheGabornator

+0

这不是真的工作。我想知道,如果你想重新渲染(如API请求完成),你将如何解决它?问题是,如果我只是在表单提交下面写下它,那反应会很快执行重新渲染。是不是有像.done()? – TheGabornator

+0

我们需要看到侦听'type:CREATED_ROLE'的reducer。 –

相关问题