【问题标题】:hide the button after clicking inside map function -Redux点击内部地图功能后隐藏按钮-Redux
【发布时间】:2019-06-20 07:59:38
【问题描述】:

我有多个位置信息列表,每个位置项都有添加按钮。我想在添加操作后隐藏那个“添加位置”按钮。单击该列表中的并非所有添加按钮后,仅应隐藏特定的添加按钮

我已经尝试使用 setState 和禁用按钮状态 true 和 false。但它正在禁用该列表中的所有按钮。我正在使用 redux 添加操作。我不知道如何为唯一位置 ID 做那部分

添加操作的动作:

export const addLocation = mruCode =>({
  type: ADD_LOCATION,
  payload:mruCode
});

添加所有位置的操作代码:

export const addAllLocation = () =>({
    type : ALL_LOCATION
  });

添加所有位置的reducer代码:

case 'ALL_LOCATION':
            return{
                ...state,
                conLocations:[...state.location]
            }

添加操作的减速器:

case 'ADD_LOCATION':
  let addedLoc = state.location.find(obj=>(obj.mruCode === action.payload))
  return{
    ...state,
    conLocations: [...state.conLocations,addedLoc]
  };

组件完整代码:

export class NewLocationPanel extends React.Component{
    constructor(props){
        super(props);
        this.state={
               open:false,
               disableButton:-1
        };
        this.togglePanel = this.togglePanel.bind(this);
        this.handleClick = this.handleClick.bind(this);
        this.allLocations = this.allLocations.bind(this);
    }
    togglePanel (e){
        this.setState({open : !this.state.open});
    }
    handleClick (mruCode){
        return this.props.addLocation(mruCode);
     }
     allLocations (){
       return this.props.addAllLocation();
    }

    componentDidMount() {
        this.props.loadData();
      }
    render(){
        const _labels = store.getLabels();
        let collapsedToggle = this.props.open ? 'collapsed' : ''
        return(
            <div className="panel panel-default">
            <div className="panel-heading" onClick={(e)=>this.togglePanel(e)}>
              <div className="row">
              <div className="col-xs-12 col-sm-8 col-md-6 col-lg-6 panelHeadingLabel">
                     <span>{this.props.title}</span>
                     </div>
                        <div className="pull-right">
                        <span className="defaultHeaderTextColor">{this.props.location.map((loc,index)=>loc.primary===true ? (<span>{loc.mruCode} - {_labels[loc.division]} - {loc.country}</span>):null)}
                           <span onClick={(e)=>this.togglePanel(e)} className={this.state.open ? "collapse-chevronn" : "collapse-chevron"} aria-hidden="true"></span>
                   </span>
                    </div>
                </div>
           </div>
              {this.state.open?(
                        <div className="panel-body">
                             <div className="row grid-divider">
                             <div className="col-sm-6">
                             <div className="col-padding"><div className="pos-div"><h3>Locations List</h3><button className="allLargeBtn" onClick={()=>{this.allLocations()}}>Add all locations</button></div><hr/>
                             {this.props.location.map((item,index)=>(
                             <div key={index}><div><b>{item.mruCode} - {_labels[item.division]} - {item.country}</b>{!this.props.conLocations.includes(item.mruCode)&&(<div className="pull-right jd"><button className="call-to-action" onClick={()=>{this.handleClick(item.mruCode)}}>Add Location</button></div>)}<hr/></div></div>))}
                            </div>
                             </div> 
                                  <div className="col-sm-6">
                                   <div><ConfiguredLocation/></div>
                                  </div>
                                  </div> 
                    </div>):null}

            </div>

        );
    }
}

const mapStateToProps = state =>{
    return{
        location:state.locationRed.location,
        conLocations:state.locationRed.conLocations
    };
};

const mapDispatchToProps = (dispatch) => {
    return{
        loadData:()=>{dispatch(loadData())},
        addLocation:(mruCode)=>{dispatch(addLocation(mruCode))},
        addAllLocation:() =>{dispatch(addAllLocation())}
    }
}


export default connect(mapStateToProps,mapDispatchToProps)(NewLocationPanel);

mruCode 是主要的唯一 ID。单击后应隐藏特定的添加按钮。请建议我如何做到这一点

【问题讨论】:

    标签: javascript reactjs react-redux


    【解决方案1】:

    如果我的理解正确,您有一个与位置相对应的按钮列表,并且您想隐藏已单击的按钮。现在你的组件没有已经添加的位置列表,所以你首先需要通过mapStateToProps

    const mapStateToProps = state =>{
        return{
            location:state.locationRed.location,
            conLocations:state.conLocations
        };
    };
    

    然后在您的视图代码中,如果已添加位置,您可以删除按钮

    {this.props.location.map((item,index)=>(
      <div key={index}>
        <div>
          <b>{item.mruCode} - {_labels[item.division]} - {item.country}</b>
          {!this.props.conLocations.find(item2 => item.mruCode === item2.mruCode) && (
            <div className="pull-right jd">
              <button
                className="call-to-action"
                onClick={()=>{this.handleClick(item.mruCode)}}
              >
                Add Location
              </button>
            </div>
          )}
          <hr/>
        </div>
      </div>
    ))}
    

    【讨论】:

    • 感谢汤姆的回复。我的要求是仅隐藏按钮而不是该特定位置的其他属性。假设列表就像(1700 - World Industrial - US (BUTTON)),所以在将对象添加到 conLocation 数组之后,该行就像(1700 - World Industrial - US(无按钮))。希望你能理解。可以通过 setState 使用 mruCode 吗??
    • 由于你的所有状态都在 redux 中,你不需要你的组件来存储任何额外的状态。我更新了答案以显示如何排除已添加项目的按钮。
    • 嗨,汤姆,它不工作。也没有错误。我应该上传完整的组件代码
    • 我已经添加了组件的完整代码并包含了您的编辑
    • 我误读了减速器。整个位置对象存储在conLocations,而不仅仅是mruCode。我更新了我的答案以反映这一点(将includes 替换为与mruCode 匹配的find
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    相关资源
    最近更新 更多