Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript React-Redux-当子组件筛选器字段不再匹配时,React-side筛选在编辑时卸载子组件_Javascript_Reactjs_Redux - Fatal编程技术网

Javascript React-Redux-当子组件筛选器字段不再匹配时,React-side筛选在编辑时卸载子组件

Javascript React-Redux-当子组件筛选器字段不再匹配时,React-side筛选在编辑时卸载子组件,javascript,reactjs,redux,Javascript,Reactjs,Redux,我试图在我的应用程序中实现过滤功能,并在react端实现过滤。有一个父组件(AllAdmins),它连接到redux并获取所有用户,并在页面上显示为用户列表。此页面有一个下拉筛选器,用于按状态筛选用户。列表中的每个用户都是一个子组件(AdminDetails),它具有编辑按钮来编辑此特定用户。单击编辑按钮时,将显示模式(EditAdminModal),我们可以在其中编辑用户的状态。编辑状态时,我正在更新onChange事件上的存储。存储更新后,如果筛选器不再匹配此更新值,则将卸载正在编辑的子项(

我试图在我的应用程序中实现过滤功能,并在react端实现过滤。有一个父组件(AllAdmins),它连接到redux并获取所有用户,并在页面上显示为用户列表。此页面有一个下拉筛选器,用于按状态筛选用户。列表中的每个用户都是一个子组件(AdminDetails),它具有编辑按钮来编辑此特定用户。单击编辑按钮时,将显示模式(EditAdminModal),我们可以在其中编辑用户的状态。编辑状态时,我正在更新onChange事件上的存储。存储更新后,如果筛选器不再匹配此更新值,则将卸载正在编辑的子项(AdminDetails),并且更新模式(EditAdminModal)和子组件(AdminDetails)将消失

这是基于实现的正确行为,我理解问题是因为我正在基于道具进行过滤,现在这个孩子的道具在redux商店中更新。我想知道这是否是实现此功能的正确方法,是否有其他方法可以实现此功能

如果有人能帮助我,我将不胜感激。我在这个问题上被困太久了,我正在避免服务器端过滤

AllAdmins父组件

class AllAdmins extends Component{
    constructor(props){
        super(props);
        this.state = {
            filter: ""
        };
    }

    componentDidMount(){
        this.props.getAdmins();
    }

    handleChange = e => {
        this.setState({
            [e.target.name] : e.target.value
        })
    }

    render() {
        let filteredAdmins = this.props.admins.filter(admin => admin.status.indexOf(this.state.filter)!==-1);
        
        return(
        <div className="top-align">
            {redirectVar}
            <div className="heading py-1">
                <h4 className="font-weight-bold">&nbsp;&nbsp;<i className="fas fa-user"></i> Admin Users</h4>
            </div>
            
            <div className="container-fluid events-below-heading">
                <div className="events-search-section">
                    <h4 className="text-center text-white all-events-heading p-1 mt-2">All Admin Users</h4>
                    <div className="row">
                        <div  class="col-6 col-sm-2 order-sm-3">
                            <select className="form-control" name="filter" onChange={this.handleChange}
                             value={this.state.filter}>
                                <option selected value="">Filter by Status</option>
                                <option>Active</option>
                                <option>Inactive</option>
                            </select>
                        </div>
                    </div>
                    <hr/>
                </div>
                <h6 style= {{color:"red"}}>{this.props.responseMessage}</h6>
                {
                    filteredAdmins.length!==0 ? filteredAdmins.map(admin=>
                    <AdminDetails admin={admin} key={admin._id}/>
                    )
                    :
                    <h2>null</h2>
                    
                }
            </div>
        </div>)
    }
}
        
const mapDispatchToProps = dispatch => {
    return {
        getAdmins: () => {dispatch(getAdmins())}
    }
}

const mapStateToProps = state => {
    return {
        admins: state.adminUsers.admins
    }
}

export default connect(mapStateToProps, mapDispatchToProps)(AllAdmins);
class AdminDetails extends Component{
    constructor(props){
        super(props);
        this.state = {
            showEditAdminModal: false
        };
    }

    showEditAdminModal = e => {
        this.setState({showEditAdminModal: true});
    }
    
    hideEditAdminModal = e => {
        this.setState({showEditAdminModal: false});
    }
    
    render() {
        return(
            <div className="row justify-content-center mt-3">
                <div className="col-sm-8">
                    <div className="card d-flex flex-row">
                        <div className="card-body card-body-lesspad">
                            <h5 className="card-title font-weight-bold">{`${this.props.admin.fname} ${this.props.admin.lname}`}</h5>
                            <p className="card-text font-smaller"><strong>SJSU ID: </strong>{this.props.admin.id}</p>
                            <p className="card-text font-smaller"><strong>Email ID: </strong>{this.props.admin.email}</p>
                            <p className="card-text font-smaller"><strong>Status: </strong>{this.props.admin.status}</p>
                            <p className="card-text font-smaller"><strong>Created Date: </strong>
                                {new Date(this.props.admin.createdDate).toLocaleString()}
                            </p>
                            <p className="card-text font-smaller"><strong>Updated Date: </strong>
                                {new Date(this.props.admin.updatedDate).toLocaleString()}
                            </p>
                            <button type="button" className="btn btn-link view-details-color"
                            onClick = {this.showEditAdminModal}>
                                <i className="fas fa-edit"/> Edit
                            </button>
                        </div>
                    </div>
                </div>
                {this.state.showEditAdminModal ? 
                <EditAdminModal hideEditAdminModal={this.hideEditAdminModal}
                admin={this.props.admin}/> : null}
            </div>
        )
    }
}

export default AdminDetails;
class EditAdminModal extends Component{
    handleChange = e => {
        const { name, value } = e.target;
        this.props.handleChange(this.props.admin._id, name, value);
    }

    handleUpdate = e => {
        e.preventDefault();

        this.setState(
                { 
                    message: "",
                    loader: true
                }
            );
        this.props.updateAdmin(this.props.admin)
        .then(() => {
            this.props.hideEditAdminModal();
        })
        .catch(() => {
            this.setState({
                message: "Some Internal Error occured. Please refresh and check if the admin is updated. If not, please try again after sometime. If the problem persist, please comtact Admin."
            });
        });
    }

    options = ['Active', 'Inactive'];
    
    render() {
        return(
        <div>
            <div className="modal">
                <div className="modal-dialog modal-dialog-centered modal-dialog-scrollable">
                    <div className="modal-content">
                        <div className="modal-header">
                            <h5 className="modal-title" id="itemModal">Add Admin</h5>
                        </div>
                        <div className="modal-body">
                            <h6 style= {{color:"red"}}>{this.state.message}</h6>
                            <h6 style= {{color:"red"}}>{this.props.responseMessage}</h6>
                            
                            <div class="form-group row">
                                <label className="col-4">Status</label>
                                <div className="col-8">
                                    <select className="form-control" name="status" onChange={this.handleChange}>
                                        {
                                            this.options.map( option => {
                                                if(option === this.props.admin.status){
                                                    return <option selected key={option}>{option}</option> ;
                                                } else {
                                                    return <option key={option}>{option}</option> ;
                                                }
                                            }
                                            )}
                                    </select>
                                </div>
                            </div>
                        </div>
                        <div className="modal-footer">
                            <button type="button" onClick = {this.handleEditCancel} className="btn btn-primary btn-style" 
                                data-dismiss="modal">Cancel</button>
                            <button onClick = {this.handleUpdate}
                                className="btn btn-primary btn-style">Update</button>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    )
    }
}

const mapDispatchToProps = dispatch => {
    return {
        handleChange: (id, name, value) => {dispatch(adminChangeHandler(id, name, value))},
        updateAdmin: admin => dispatch(updateAdmin(admin))
    };
};

const mapStateToProps = state => {
    return {
        responseMessage: state.adminUsers.createResponseMessage
    }
}

export default connect(mapStateToProps, mapDispatchToProps)(EditAdminModal);
类AllAdmins扩展组件{
建造师(道具){
超级(道具);
此.state={
过滤器:“
};
}
componentDidMount(){
this.props.getAdmins();
}
handleChange=e=>{
这是我的国家({
[e.target.name]:e.target.value
})
}
render(){
让filteredAdmins=this.props.admins.filter(admin=>admin.status.indexOf(this.state.filter)!=-1);
返回(
{redirectVar}
管理员用户
所有管理员用户
按状态筛选
活跃的
不活跃的

{this.props.responseMessage} { filteredAdmins.length!==0?filteredAdmins.map(管理员=> ) : 无效的 } ) } } const mapDispatchToProps=调度=>{ 返回{ getAdmins:()=>{dispatch(getAdmins())} } } 常量mapStateToProps=状态=>{ 返回{ 管理员:state.adminUsers.admins } } 导出默认连接(mapStateToProps、mapDispatchToProps)(AllAdmins);
AdminDetails子组件

class AllAdmins extends Component{
    constructor(props){
        super(props);
        this.state = {
            filter: ""
        };
    }

    componentDidMount(){
        this.props.getAdmins();
    }

    handleChange = e => {
        this.setState({
            [e.target.name] : e.target.value
        })
    }

    render() {
        let filteredAdmins = this.props.admins.filter(admin => admin.status.indexOf(this.state.filter)!==-1);
        
        return(
        <div className="top-align">
            {redirectVar}
            <div className="heading py-1">
                <h4 className="font-weight-bold">&nbsp;&nbsp;<i className="fas fa-user"></i> Admin Users</h4>
            </div>
            
            <div className="container-fluid events-below-heading">
                <div className="events-search-section">
                    <h4 className="text-center text-white all-events-heading p-1 mt-2">All Admin Users</h4>
                    <div className="row">
                        <div  class="col-6 col-sm-2 order-sm-3">
                            <select className="form-control" name="filter" onChange={this.handleChange}
                             value={this.state.filter}>
                                <option selected value="">Filter by Status</option>
                                <option>Active</option>
                                <option>Inactive</option>
                            </select>
                        </div>
                    </div>
                    <hr/>
                </div>
                <h6 style= {{color:"red"}}>{this.props.responseMessage}</h6>
                {
                    filteredAdmins.length!==0 ? filteredAdmins.map(admin=>
                    <AdminDetails admin={admin} key={admin._id}/>
                    )
                    :
                    <h2>null</h2>
                    
                }
            </div>
        </div>)
    }
}
        
const mapDispatchToProps = dispatch => {
    return {
        getAdmins: () => {dispatch(getAdmins())}
    }
}

const mapStateToProps = state => {
    return {
        admins: state.adminUsers.admins
    }
}

export default connect(mapStateToProps, mapDispatchToProps)(AllAdmins);
class AdminDetails extends Component{
    constructor(props){
        super(props);
        this.state = {
            showEditAdminModal: false
        };
    }

    showEditAdminModal = e => {
        this.setState({showEditAdminModal: true});
    }
    
    hideEditAdminModal = e => {
        this.setState({showEditAdminModal: false});
    }
    
    render() {
        return(
            <div className="row justify-content-center mt-3">
                <div className="col-sm-8">
                    <div className="card d-flex flex-row">
                        <div className="card-body card-body-lesspad">
                            <h5 className="card-title font-weight-bold">{`${this.props.admin.fname} ${this.props.admin.lname}`}</h5>
                            <p className="card-text font-smaller"><strong>SJSU ID: </strong>{this.props.admin.id}</p>
                            <p className="card-text font-smaller"><strong>Email ID: </strong>{this.props.admin.email}</p>
                            <p className="card-text font-smaller"><strong>Status: </strong>{this.props.admin.status}</p>
                            <p className="card-text font-smaller"><strong>Created Date: </strong>
                                {new Date(this.props.admin.createdDate).toLocaleString()}
                            </p>
                            <p className="card-text font-smaller"><strong>Updated Date: </strong>
                                {new Date(this.props.admin.updatedDate).toLocaleString()}
                            </p>
                            <button type="button" className="btn btn-link view-details-color"
                            onClick = {this.showEditAdminModal}>
                                <i className="fas fa-edit"/> Edit
                            </button>
                        </div>
                    </div>
                </div>
                {this.state.showEditAdminModal ? 
                <EditAdminModal hideEditAdminModal={this.hideEditAdminModal}
                admin={this.props.admin}/> : null}
            </div>
        )
    }
}

export default AdminDetails;
class EditAdminModal extends Component{
    handleChange = e => {
        const { name, value } = e.target;
        this.props.handleChange(this.props.admin._id, name, value);
    }

    handleUpdate = e => {
        e.preventDefault();

        this.setState(
                { 
                    message: "",
                    loader: true
                }
            );
        this.props.updateAdmin(this.props.admin)
        .then(() => {
            this.props.hideEditAdminModal();
        })
        .catch(() => {
            this.setState({
                message: "Some Internal Error occured. Please refresh and check if the admin is updated. If not, please try again after sometime. If the problem persist, please comtact Admin."
            });
        });
    }

    options = ['Active', 'Inactive'];
    
    render() {
        return(
        <div>
            <div className="modal">
                <div className="modal-dialog modal-dialog-centered modal-dialog-scrollable">
                    <div className="modal-content">
                        <div className="modal-header">
                            <h5 className="modal-title" id="itemModal">Add Admin</h5>
                        </div>
                        <div className="modal-body">
                            <h6 style= {{color:"red"}}>{this.state.message}</h6>
                            <h6 style= {{color:"red"}}>{this.props.responseMessage}</h6>
                            
                            <div class="form-group row">
                                <label className="col-4">Status</label>
                                <div className="col-8">
                                    <select className="form-control" name="status" onChange={this.handleChange}>
                                        {
                                            this.options.map( option => {
                                                if(option === this.props.admin.status){
                                                    return <option selected key={option}>{option}</option> ;
                                                } else {
                                                    return <option key={option}>{option}</option> ;
                                                }
                                            }
                                            )}
                                    </select>
                                </div>
                            </div>
                        </div>
                        <div className="modal-footer">
                            <button type="button" onClick = {this.handleEditCancel} className="btn btn-primary btn-style" 
                                data-dismiss="modal">Cancel</button>
                            <button onClick = {this.handleUpdate}
                                className="btn btn-primary btn-style">Update</button>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    )
    }
}

const mapDispatchToProps = dispatch => {
    return {
        handleChange: (id, name, value) => {dispatch(adminChangeHandler(id, name, value))},
        updateAdmin: admin => dispatch(updateAdmin(admin))
    };
};

const mapStateToProps = state => {
    return {
        responseMessage: state.adminUsers.createResponseMessage
    }
}

export default connect(mapStateToProps, mapDispatchToProps)(EditAdminModal);
类AdminDetails扩展组件{
建造师(道具){
超级(道具);
此.state={
showEditAdminModal:false
};
}
showEditAdminModal=e=>{
this.setState({showEditAdminModal:true});
}
HIDEEDITAdminModel=e=>{
this.setState({showEditAdminModal:false});
}
render(){
返回(
{`${this.props.admin.fname}${this.props.admin.lname}}

SJSU ID:{this.props.admin.ID}

电子邮件ID:{this.props.admin.Email}

状态:{this.props.admin.Status}

创建日期:
{新日期(this.props.admin.createdDate).toLocaleString()}

更新日期: {新日期(this.props.admin.updateDate).toLocaleString()}

编辑 {this.state.showEditAdminModal? :null} ) } } 导出默认管理员详细信息;
EditAdminModal组件

class AllAdmins extends Component{
    constructor(props){
        super(props);
        this.state = {
            filter: ""
        };
    }

    componentDidMount(){
        this.props.getAdmins();
    }

    handleChange = e => {
        this.setState({
            [e.target.name] : e.target.value
        })
    }

    render() {
        let filteredAdmins = this.props.admins.filter(admin => admin.status.indexOf(this.state.filter)!==-1);
        
        return(
        <div className="top-align">
            {redirectVar}
            <div className="heading py-1">
                <h4 className="font-weight-bold">&nbsp;&nbsp;<i className="fas fa-user"></i> Admin Users</h4>
            </div>
            
            <div className="container-fluid events-below-heading">
                <div className="events-search-section">
                    <h4 className="text-center text-white all-events-heading p-1 mt-2">All Admin Users</h4>
                    <div className="row">
                        <div  class="col-6 col-sm-2 order-sm-3">
                            <select className="form-control" name="filter" onChange={this.handleChange}
                             value={this.state.filter}>
                                <option selected value="">Filter by Status</option>
                                <option>Active</option>
                                <option>Inactive</option>
                            </select>
                        </div>
                    </div>
                    <hr/>
                </div>
                <h6 style= {{color:"red"}}>{this.props.responseMessage}</h6>
                {
                    filteredAdmins.length!==0 ? filteredAdmins.map(admin=>
                    <AdminDetails admin={admin} key={admin._id}/>
                    )
                    :
                    <h2>null</h2>
                    
                }
            </div>
        </div>)
    }
}
        
const mapDispatchToProps = dispatch => {
    return {
        getAdmins: () => {dispatch(getAdmins())}
    }
}

const mapStateToProps = state => {
    return {
        admins: state.adminUsers.admins
    }
}

export default connect(mapStateToProps, mapDispatchToProps)(AllAdmins);
class AdminDetails extends Component{
    constructor(props){
        super(props);
        this.state = {
            showEditAdminModal: false
        };
    }

    showEditAdminModal = e => {
        this.setState({showEditAdminModal: true});
    }
    
    hideEditAdminModal = e => {
        this.setState({showEditAdminModal: false});
    }
    
    render() {
        return(
            <div className="row justify-content-center mt-3">
                <div className="col-sm-8">
                    <div className="card d-flex flex-row">
                        <div className="card-body card-body-lesspad">
                            <h5 className="card-title font-weight-bold">{`${this.props.admin.fname} ${this.props.admin.lname}`}</h5>
                            <p className="card-text font-smaller"><strong>SJSU ID: </strong>{this.props.admin.id}</p>
                            <p className="card-text font-smaller"><strong>Email ID: </strong>{this.props.admin.email}</p>
                            <p className="card-text font-smaller"><strong>Status: </strong>{this.props.admin.status}</p>
                            <p className="card-text font-smaller"><strong>Created Date: </strong>
                                {new Date(this.props.admin.createdDate).toLocaleString()}
                            </p>
                            <p className="card-text font-smaller"><strong>Updated Date: </strong>
                                {new Date(this.props.admin.updatedDate).toLocaleString()}
                            </p>
                            <button type="button" className="btn btn-link view-details-color"
                            onClick = {this.showEditAdminModal}>
                                <i className="fas fa-edit"/> Edit
                            </button>
                        </div>
                    </div>
                </div>
                {this.state.showEditAdminModal ? 
                <EditAdminModal hideEditAdminModal={this.hideEditAdminModal}
                admin={this.props.admin}/> : null}
            </div>
        )
    }
}

export default AdminDetails;
class EditAdminModal extends Component{
    handleChange = e => {
        const { name, value } = e.target;
        this.props.handleChange(this.props.admin._id, name, value);
    }

    handleUpdate = e => {
        e.preventDefault();

        this.setState(
                { 
                    message: "",
                    loader: true
                }
            );
        this.props.updateAdmin(this.props.admin)
        .then(() => {
            this.props.hideEditAdminModal();
        })
        .catch(() => {
            this.setState({
                message: "Some Internal Error occured. Please refresh and check if the admin is updated. If not, please try again after sometime. If the problem persist, please comtact Admin."
            });
        });
    }

    options = ['Active', 'Inactive'];
    
    render() {
        return(
        <div>
            <div className="modal">
                <div className="modal-dialog modal-dialog-centered modal-dialog-scrollable">
                    <div className="modal-content">
                        <div className="modal-header">
                            <h5 className="modal-title" id="itemModal">Add Admin</h5>
                        </div>
                        <div className="modal-body">
                            <h6 style= {{color:"red"}}>{this.state.message}</h6>
                            <h6 style= {{color:"red"}}>{this.props.responseMessage}</h6>
                            
                            <div class="form-group row">
                                <label className="col-4">Status</label>
                                <div className="col-8">
                                    <select className="form-control" name="status" onChange={this.handleChange}>
                                        {
                                            this.options.map( option => {
                                                if(option === this.props.admin.status){
                                                    return <option selected key={option}>{option}</option> ;
                                                } else {
                                                    return <option key={option}>{option}</option> ;
                                                }
                                            }
                                            )}
                                    </select>
                                </div>
                            </div>
                        </div>
                        <div className="modal-footer">
                            <button type="button" onClick = {this.handleEditCancel} className="btn btn-primary btn-style" 
                                data-dismiss="modal">Cancel</button>
                            <button onClick = {this.handleUpdate}
                                className="btn btn-primary btn-style">Update</button>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    )
    }
}

const mapDispatchToProps = dispatch => {
    return {
        handleChange: (id, name, value) => {dispatch(adminChangeHandler(id, name, value))},
        updateAdmin: admin => dispatch(updateAdmin(admin))
    };
};

const mapStateToProps = state => {
    return {
        responseMessage: state.adminUsers.createResponseMessage
    }
}

export default connect(mapStateToProps, mapDispatchToProps)(EditAdminModal);
类EditAdminModal扩展组件{ handleChange=e=>{ 常量{name,value}=e.target; this.props.handleChange(this.props.admin.\u id、名称、值); } handleUpdate=e=>{ e、 预防默认值(); 这是我的国家( { 消息:“”, 加载器:对 } ); this.props.updateAdmin(this.props.admin) .然后(()=>{ this.props.hideEditAdminModal(); }) .catch(()=>{ 这是我的国家({ 消息:“出现一些内部错误。请刷新并检查管理员是否已更新。如果未更新,请稍后再试。如果问题仍然存在,请与管理员联系。” }); }); } 选项=[“活动”、“非活动”]; render(){ 返回( 添加管理员 {this.state.message} {this.props.responseMessage} Sta