在自身内部反应 redux 渲染组件

Posted

技术标签:

【中文标题】在自身内部反应 redux 渲染组件【英文标题】:React redux render component inside itself 【发布时间】:2018-11-13 10:47:36 【问题描述】:

我有一个表单组件,我想在表单内呈现一个可点击的链接。当人们单击该链接时,将在弹出窗口中呈现一个子表单。类似这样的东西

class Form extends React.Component
    componentDidMount()
       this.props.loadForm(this.props.url)
    
    render()
        const  subfrom, loadSubForm  = this.props;
        return(
          <form>
             <button onClick=()=>loadSubForm(url)>Load Sub-Form</button>

              /** Render Parent Form Here ***/ 

              subform && <Popup><Form url=subform.url /></Popup> 

          </form>
        )
    


const mapStateToProps = (state) => 
    return
       subform:state.getIn(["form",subform"])
    

const mapDispatchToProps = (dispatch, props)  =>   
    return
       loadForm: (route)=>

           /** Ajax to load form **/
       
       loadSubForm: (route) =>
          dispatch(loadSubForm(route))
       
    


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

加载子表单时出现错误:

loadForm function is not props of Form

【问题讨论】:

【参考方案1】:

感谢@Shubham,它的工作。这是解决方案

 class Form extends React.Component
        componentDidMount()
           this.props.loadForm(this.props.url)
        
        render()
            const  subfrom, loadSubForm  = this.props;
            let SubForm =  connect(mapStateToProps,mapDispatchToProps)(Form);

            /** If you use Redux Form **/
            SubForm =   reduxForm()(SubForm);
            return(
              <form>
                 <button onClick=()=>loadSubForm(url)>Load Sub-Form</button>

                  /** Render Parent Form Here ***/ 

                  subform && <Popup><SubForm id="suform" url=subform.url /></Popup> 

              </form>
            )
        
    

    const mapStateToProps = (state,props) => 
        const formid = props.id
        return
           subform:state.getIn(["form",formid,subform"])
        
    
    const mapDispatchToProps = (dispatch, props)  =>   
        const formid = props.id
        return
           loadForm: (route)=>

               /** Ajax to load form **/
           
           loadSubForm: (route) =>
              dispatch(loadSubForm(route,formid))
           
        
    

   /** If you use Redux Form **/
   Form =   reduxForm()(Form);

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

注意:我们需要将 Form ID 传递给组件和 reducer。否则,reducer 不知道要听哪种形式,您最终将陷入无限循环。

【讨论】:

感谢分享解决方法,文章和嵌套文章也有类似问题。顺便说一句,您可能希望将 SubForm 声明放在渲染函数之外,以避免渲染问题:任何状态/调度更改都将导致重新声明 Subform 并完全重新加载(这发生在我的用例中)。【参考方案2】:

对于嵌套组件,您没有传递 loadForm 或 loadSubForm 函数,要么为它们的使用添加条件检查,要么也传递它们

class Form extends React.Component
    componentDidMount()
       this.props.loadForm(this.props.url)
    
    render()
        const  subform, loadSubForm  = this.props;
        return(
          <form>
             <button onClick=()=>loadSubForm(url)>Load Sub-Form</button>

              /** Render Parent Form Here ***/ 

              subform && <Popup><Form url=subform.url loadForm=() => // do something here loadSubForm=() =>  //whatever you wanna do here/></Popup> 

          </form>
        )
    

class Form extends React.Component
    componentDidMount()
       this.props.loadForm && this.props.loadForm(this.props.url)
    
    render()
        const  subform, loadSubForm  = this.props;
        return(
          <form>
             <button onClick=()=>loadSubForm && loadSubForm(url)>Load Sub-Form</button>

              /** Render Parent Form Here ***/ 

              subform && <Popup><Form url=subform.url /></Popup> 

          </form>
        )
    

【讨论】:

所以子组件连接不上(mapStateToProps, mapDispatchToProps)?我在 mapDispatchToProps 中有很多函数 @TyTrinh,是的,它可以获得这些值,只有当你渲染你现在还没有的连接组件时,如果你写const MyForm = connect( mapStateToProps, mapDispatchToProps )(Form); export default MyForm并像&lt;MyForm url=subform.url /&gt;一样使用它

以上是关于在自身内部反应 redux 渲染组件的主要内容,如果未能解决你的问题,请参考以下文章

更新 Redux 存储时反应组件不重新渲染

组件不会重新渲染,但 redux 状态已通过反应钩子更改

无效的挂钩调用。钩子只能在反应函数组件内部使用...... useEffect,redux

Redux 状态加载,但反应不渲染

反应父组件不重新渲染

使用酶在反应测试中查找渲染子组件的数量?