ReactJS表单应用程序:如何阻止父组件重新渲染? /使用redux共享状态的正确方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ReactJS表单应用程序:如何阻止父组件重新渲染? /使用redux共享状态的正确方法相关的知识,希望对你有一定的参考价值。

我正在使用React.js编写一个表单应用程序作为我的第一个应用程序,所以我不是一个经验丰富的开发人员。

所以表单的流程是这样的: 1)有3种主要形式(我将其分为3页) 2)提交表格只会出现在最后一页。所以我使用redux方法来共享状态。 3)第一页和第二页具有嵌套形式。

我目前遇到的问题是第一页和第二页,当我想在组件(表单)中渲染另一个组件(嵌套表单)时,所有组件状态都将刷新,我在下面得到了这个错误:

index.js:2178 Warning: Functions are not valid as a React child. This may happen if you return a Component instead of <Component /> from render. Or maybe you meant to call this function rather than return it.
in form (at PersonalDetail.js:31)
in PersonalDetail (created by Connect(PersonalDetail))
in Connect(PersonalDetail) (created by Route)
in Route (at App.js:20)
in Switch (at App.js:17)
in div (created by Jumbotron)
in Jumbotron (at App.js:16)
in Router (created by BrowserRouter)
in BrowserRouter (at App.js:15)
in App (at index.js:18)
in Provider (at index.js:17)

下面是我的PersonalDetail.js,它位于第一个表格(第一页)。

import React, { Component } from 'react';
import { Link } from 'react-router-dom';
import { connect } from 'react-redux';
import { formUpdate } from '../actions';

import Working from './Working';

class PersonalDetail extends Component {
    renderWorkingForm(){
        if(this.props.working) {
            return (
                <Working />
                /*
                <div className="form-group">
                    <label>Tax Number:</label>
                    <input 
                        type="number" 
                        value={this.props.tax} 
                        onChange={event => this.props.formUpdate({ prop: 'tax', value: event.target.value })} 
                    />
                </div>
                */
            );
        }

        return;
    }

    render() {
        return (
            <form >
                <div className="form-group">
                    <label>Fullname:</label>
                    <input 
                        className="form-control" 
                        type="text" 
                        value={this.props.name}
                        onChange={event => this.props.formUpdate({ prop: 'name', value: event.target.value })}
                    />
                </div>
                <div className="form-group">
                    <label>IC:</label>
                    <input 
                        className="form-control" 
                        type="text" 
                        value={this.props.ic}
                        onChange={event => this.props.formUpdate({ prop: 'ic', value: event.target.value })}
                    />
                </div>
                <div className="form-group">
                    <label>Nationality:</label>
                    <input 
                        className="form-control" 
                        type="text" 
                        value={this.props.nationality}
                        onChange={event => this.props.formUpdate({ prop: 'nationality', value: event.target.value })}
                    />
                </div>
                <div className="form-group">
                    <label>Are you currently working:</label>
                    <button onClick={() => this.props.formUpdate({ prop: 'working', value: true })}>Yes</button>
                    <button onClick={() => this.prop.formUpdate({ prop: 'working', value: false })}>No</button>
                </div>
                {this.renderWorkingForm}
                <Link to="/kin" className="btn btn-primary">Next</Link>
            </form>
            
        );
    }
}

const mapStateToProps = (state) => {
    const { name, ic, nationality, working, tax } = state.form;

    return { name, ic, nationality, working, tax };
}

export default connect(mapStateToProps, { formUpdate })(PersonalDetail);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

以下是我的工作组件类:

import React, { Component } from 'react';
import { connect } from 'react-redux';
import { formUpdate } from '../actions';

class Working extends Component {
    render() {
        return (
            <form>
                <div className="form-group">
                    <label>Tax Number:</label>
                    <input type="number"  value={this.props.tax} onChange={event => this.props.formUpdate({ 
                        prop: 'tax', value: event.target.value
                    })} />
                </div>
            </form>
        )
    }
}

const mapStateToProps = (state) => {
    const { tax } = state.form;

    return { tax };
}

export default connect(mapStateToProps, { formUpdate })(Working);
答案

{this.renderWorkingForm}改为{this.renderWorkingForm()}

以上是关于ReactJS表单应用程序:如何阻止父组件重新渲染? /使用redux共享状态的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

重新渲染 Reactjs 后,父组件立即失去状态

ReactJS - 如何在将数据发布到数据库后重新渲染功能组件

如何正确检测 React JS 中的重新渲染?

reactjs preventDefault() 不会阻止表单提交时页面重新加载

子组件不会重新渲染,但父组件会重新渲染。如何让子组件重新渲染?

如果子组件发生更改,如何重新渲染父组件